)]}'
{"specs/approved/online-upgrades.rst":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"In principle, if we want to upgrade Ironic in-place, we have to stop the"},{"line_number":19,"context_line":"services(ironic-api/ironic-conductor), upgrade the code, change the"},{"line_number":20,"context_line":"configuration and migrate the DB. The whole process is time-consuming"},{"line_number":21,"context_line":"especially if we have multiple ironic services running. So in this spec,"},{"line_number":22,"context_line":"we want to minimize the downtime or even make services keep working during"},{"line_number":23,"context_line":"upgrade. In another word, deployer can upgrade Ironic service online."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_d3393043","line":21,"updated":"2016-04-18 20:48:16.000000000","message":"In the context of ironic being used in OpenStack, if we upgrade ironic in-place, what does that mean for nova/users?\n\nSimilarly, (I have to keep reading), I hope this describes online/live upgrades of ironic in the context of openstack/nova too.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"In principle, if we want to upgrade Ironic in-place, we have to stop the"},{"line_number":19,"context_line":"services(ironic-api/ironic-conductor), upgrade the code, change the"},{"line_number":20,"context_line":"configuration and migrate the DB. The whole process is time-consuming"},{"line_number":21,"context_line":"especially if we have multiple ironic services running. So in this spec,"},{"line_number":22,"context_line":"we want to minimize the downtime or even make services keep working during"},{"line_number":23,"context_line":"upgrade. In another word, deployer can upgrade Ironic service online."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_cd9a2463","line":21,"in_reply_to":"1a122d0e_d3393043","updated":"2016-04-19 08:43:51.000000000","message":"OK, so I will describe the relationship","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"configuration and migrate the DB. The whole process is time-consuming"},{"line_number":21,"context_line":"especially if we have multiple ironic services running. So in this spec,"},{"line_number":22,"context_line":"we want to minimize the downtime or even make services keep working during"},{"line_number":23,"context_line":"upgrade. In another word, deployer can upgrade Ironic service online."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Proposed change"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_aeefeb85","line":23,"updated":"2016-04-18 20:48:16.000000000","message":"So does this proposal have some downtime? Or does it support a live upgrade?","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"configuration and migrate the DB. The whole process is time-consuming"},{"line_number":21,"context_line":"especially if we have multiple ironic services running. So in this spec,"},{"line_number":22,"context_line":"we want to minimize the downtime or even make services keep working during"},{"line_number":23,"context_line":"upgrade. In another word, deployer can upgrade Ironic service online."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Proposed change"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_4dc61449","line":23,"in_reply_to":"1a122d0e_aeefeb85","updated":"2016-04-19 08:43:51.000000000","message":"There might be a little downtime when you restart the new version of services but this should be zero downtime for DB migration which is the most time-consuming task.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Proposed change"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As we discuss before, we should keep ironic-api directly access to DB and not"},{"line_number":29,"context_line":"use ``@remotable`` on objects for Ironic case. So reference Nova upgrade"},{"line_number":30,"context_line":"model [1], we could follow this procedure to upgrade Ironic from N release to"},{"line_number":31,"context_line":"N+1 release:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_136a881a","line":28,"updated":"2016-04-18 20:48:16.000000000","message":"People who weren\u0027t in that discuss, won\u0027t know what you mean here. Was it in a meeting? Maybe you could provide a link.\n\nAlso, I think some context is useful. It was because nova was doing this, right? I wonder if it is worth putting a link to a description of how nova does live upgrades, and mention how/why we want it to be different for ironic.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Proposed change"},{"line_number":26,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As we discuss before, we should keep ironic-api directly access to DB and not"},{"line_number":29,"context_line":"use ``@remotable`` on objects for Ironic case. So reference Nova upgrade"},{"line_number":30,"context_line":"model [1], we could follow this procedure to upgrade Ironic from N release to"},{"line_number":31,"context_line":"N+1 release:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_0da53ca1","line":28,"in_reply_to":"1a122d0e_136a881a","updated":"2016-04-19 08:43:51.000000000","message":"Will do this.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"N+1 release:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"#. upgrade DB schema (Only additional changes are accepted in N, which will"},{"line_number":34,"context_line":"   not block DB)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"#. Pin RPC/Object version at N."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_1309e831","line":34,"updated":"2016-04-18 20:48:16.000000000","message":"If I compare this to nova\u0027s process[1], this is #2 for nova, right? Is ironic not going to allow subtractive schema migrations?\n\n[1] http://docs.openstack.org/developer/nova/upgrade.html#process","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"N+1 release:"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"#. upgrade DB schema (Only additional changes are accepted in N, which will"},{"line_number":34,"context_line":"   not block DB)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"#. Pin RPC/Object version at N."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_6d64b048","line":34,"in_reply_to":"1a122d0e_1309e831","updated":"2016-04-19 08:43:51.000000000","message":"Yes it is, Ironic will still allow subtraction but we have to make sure the value of columns are NULL. I will add a note to explain this.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"#. upgrade DB schema (Only additional changes are accepted in N, which will"},{"line_number":34,"context_line":"   not block DB)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"#. Pin RPC/Object version at N."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"#. Upgrade Ironic-API services one by one."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_0e489f2c","line":36,"updated":"2016-04-18 20:48:16.000000000","message":"you mean to the versions used in N, right? Is there only one RPC version, one Object version?","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"#. upgrade DB schema (Only additional changes are accepted in N, which will"},{"line_number":34,"context_line":"   not block DB)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"#. Pin RPC/Object version at N."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"#. Upgrade Ironic-API services one by one."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_2dd8f81c","line":36,"in_reply_to":"1a122d0e_0e489f2c","updated":"2016-04-19 08:43:51.000000000","message":"Yes, this is what I mean. For example, that is the RPC/Object version when Mitaka release","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"6713585683bb0e300ab851aab85b08469fd9e3d0","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"#. Unpin RPC/Object version which should be N+1 implicit."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"#. Online Migration DB data at run time and guarantee deprecated column in N is"},{"line_number":45,"context_line":"   NULL."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"#. Start to upgrade to N+2 (contraction of deprecated column in N is accepted)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5a18252c_2d7cd871","line":44,"range":{"start_line":44,"start_character":10,"end_line":44,"end_character":11},"updated":"2016-04-13 10:45:25.000000000","message":"s/Online Migration/Migrate/","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e05108ddd9e94dc76e0dff4301104157ab68768a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"#. Online Migration DB data at run time and guarantee deprecated column in N is"},{"line_number":45,"context_line":"   NULL."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"#. Start to upgrade to N+2 (contraction of deprecated column in N is accepted)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"So there are several changes need to make to solve this problem:"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_8e2f8ff5","line":47,"updated":"2016-04-18 20:48:16.000000000","message":"Why do we care about N+2? (I don\u0027t actually understand this point.)","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"e0aed9b18ba1a89724d2e194f973e915669d063a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"#. Online Migration DB data at run time and guarantee deprecated column in N is"},{"line_number":45,"context_line":"   NULL."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"#. Start to upgrade to N+2 (contraction of deprecated column in N is accepted)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"So there are several changes need to make to solve this problem:"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_4d4bb4c9","line":47,"in_reply_to":"1a122d0e_8e2f8ff5","updated":"2016-04-19 08:43:51.000000000","message":"So here is an example if we want to change the name of instance_info to instance_attributes, we have instance_info in N, and we add a new field instance_attributes in N+1 and do the data migration, but we can only delete the old instance_info in N+2.","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"6713585683bb0e300ab851aab85b08469fd9e3d0","unresolved":false,"context_lines":[{"line_number":228,"context_line":"----------"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"#. Add new configs [upgrade_levels]/api and [upgrade_levels]/conductor and"},{"line_number":231,"context_line":"   RPC/Object version alias."},{"line_number":232,"context_line":"#. Make objects compatible with previous version and handle the interaction"},{"line_number":233,"context_line":"   with DB and end user."},{"line_number":234,"context_line":"#. Make IronicObjectSerializer downgrade objects when passing via RPC."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5a18252c_50724dae","line":231,"updated":"2016-04-13 10:45:25.000000000","message":"One option [upgrade_levels]/lowest_service_version is enough and this could also be auto-determined if we save the version info in DB or DLM","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"65ee1d3372760ca525556cf5885b1e71a3eecde9","unresolved":false,"context_lines":[{"line_number":265,"context_line":"References"},{"line_number":266,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"* [1] http://docs.openstack.org/developer/nova/upgrade.html"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a122d0e_f5cb9d70","line":268,"updated":"2016-04-18 04:48:28.000000000","message":"A PoC patch is ready:\nhttps://review.openstack.org/#/c/306357\n\nAn implementation reference patch is ready:\nhttps://review.openstack.org/#/c/306358","commit_id":"914177a171bf8736d0543e938ac65aa0507100c5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"27141c0f5bf01709ac3e6e61f724f7388c11b113","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    * upgrade nova"},{"line_number":29,"context_line":"    * upgrade neutron"},{"line_number":30,"context_line":"    * upgrade cinder"},{"line_number":31,"context_line":"    * upgrade ironic"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Several steps will be included in the upgrade of each service:"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_c9f79389","line":31,"updated":"2016-04-19 17:09:45.000000000","message":"is that the order in which to do an upgrade? ie, upgrade keystone first, then glance, then nova, then ... ? If not, should mention that.\n\nI guess I\u0027m curious to know how one would upgrade openstack today. Maybe it is documented elsewhere.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"2bf68c32eb835ea53690ec4f04e685cf39ff55dd","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    * upgrade nova"},{"line_number":29,"context_line":"    * upgrade neutron"},{"line_number":30,"context_line":"    * upgrade cinder"},{"line_number":31,"context_line":"    * upgrade ironic"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Several steps will be included in the upgrade of each service:"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_7cd6e9f1","line":31,"in_reply_to":"1a122d0e_c9f79389","updated":"2016-04-20 02:32:52.000000000","message":"It is, in this order. This is what we do with Intel IT OpenStack Cloud and it works. But there is no official order indeed.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"27141c0f5bf01709ac3e6e61f724f7388c11b113","unresolved":false,"context_lines":[{"line_number":81,"context_line":"   N+1 is NULL."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"#. Start to upgrade to N+2 (Now, the contraction of deprecated column in N+1"},{"line_number":84,"context_line":"   is accepted)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"So there are several changes have to be done:"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_04a9727b","line":84,"updated":"2016-04-19 17:09:45.000000000","message":"This doesn\u0027t make sense to me. Isn\u0027t this last step really the first step you would do if you were upgrading to N+2? Putting this here makes it sound like you\u0027d do this step right after the previous step, instead of eg 6 months later. (Or maybe I am totally wrong and misunderstand this).\n\nUsing your example of adding \u0027instance_info\u0027: step 1 above would add \u0027instance_attributes\u0027 to the db. And then you said \u0027we can only delete the old instance_info in N+2\u0027. But I thought this was describing the process for upgrading to N+1, not N+2.\n\nIf I understand this, my suggestion is to describe this like nova does, with the first step being \u00271. Prune deleted DB rows\u0027 (these would be db rows that were deprecated in N I think).\n\nPart of my problem with understanding your spec is that I\u0027m looking at how nova describes their upgrade in [2], and trying to compare that with this spec is not very easy.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"2bf68c32eb835ea53690ec4f04e685cf39ff55dd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"   N+1 is NULL."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"#. Start to upgrade to N+2 (Now, the contraction of deprecated column in N+1"},{"line_number":84,"context_line":"   is accepted)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"So there are several changes have to be done:"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_900be9d5","line":84,"in_reply_to":"1a122d0e_04a9727b","updated":"2016-04-20 02:32:52.000000000","message":"You understand my example correct. Yes, we have to postpone the deletion of deprecation column instance_info in N+2 release(which should be a part upgrade work from N to N+1). \n\nThat is because we will upgrade the service to N+1 first, then migrate the DB record online later. So in this scenery, the database may still contain the old record with instance_info while running N+1 service. That\u0027s also why we will delete the instance_info in the upgrade from N+1 to N+2.\n\nOK, actually [2] is out of date for some part. There is no more real Expand/Contract commands. And also this is not exactly like what nova does, so there will be some different. But I will try to keep consistency as much as I can in next patch set.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"27141c0f5bf01709ac3e6e61f724f7388c11b113","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"So there are several changes have to be done:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* A strict DB schema upgrade strategy should follow."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* Add a new config to pin RPC/Object version for each Ironic service. With the"},{"line_number":91,"context_line":"  config, it is able to handle the communication between different version of"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_e4fb96bf","line":88,"updated":"2016-04-19 17:09:45.000000000","message":"What does this mean in the context of also allowing deletion of unused db rows? (\"contraction of deprecated column\" mentioned in line 83?","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"2bf68c32eb835ea53690ec4f04e685cf39ff55dd","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"So there are several changes have to be done:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* A strict DB schema upgrade strategy should follow."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* Add a new config to pin RPC/Object version for each Ironic service. With the"},{"line_number":91,"context_line":"  config, it is able to handle the communication between different version of"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_d0b281e4","line":88,"in_reply_to":"1a122d0e_e4fb96bf","updated":"2016-04-20 02:32:52.000000000","message":"So Alter action was not accepted, addition and dropped action is supported. But deprecate columns in this release can only be dropped in next release or later.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"27141c0f5bf01709ac3e6e61f724f7388c11b113","unresolved":false,"context_lines":[{"line_number":92,"context_line":"  services. Since this upgrade procedure is about the whole cloud and we are"},{"line_number":93,"context_line":"  not allowed to skip over releases when upgrading and Ironic usually"},{"line_number":94,"context_line":"  have several number releases (5.0 for example) in six months, so we only"},{"line_number":95,"context_line":"  support upgrade for name release (like from Mitaka to Newton)."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The most difficult part for live upgrade is how to make services compatible"},{"line_number":98,"context_line":"  during upgrade because there will be old/new services co-existed. Will"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_a497de38","line":95,"updated":"2016-04-19 17:09:45.000000000","message":"I think we should mention this at the top somewhere, that this spec is proposing a solution for live upgrades between named releases only. Is it true though that we are only interested in upgrades between named releases?","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"2bf68c32eb835ea53690ec4f04e685cf39ff55dd","unresolved":false,"context_lines":[{"line_number":92,"context_line":"  services. Since this upgrade procedure is about the whole cloud and we are"},{"line_number":93,"context_line":"  not allowed to skip over releases when upgrading and Ironic usually"},{"line_number":94,"context_line":"  have several number releases (5.0 for example) in six months, so we only"},{"line_number":95,"context_line":"  support upgrade for name release (like from Mitaka to Newton)."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* The most difficult part for live upgrade is how to make services compatible"},{"line_number":98,"context_line":"  during upgrade because there will be old/new services co-existed. Will"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a122d0e_9cf02593","line":95,"in_reply_to":"1a122d0e_a497de38","updated":"2016-04-20 02:32:52.000000000","message":"Let\u0027s discuss in the ML to get more people involved.","commit_id":"dc8e71d798f094d394b1521987533a974f37189f"}],"specs/approved/support-rolling-upgrade.rst":[{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"ba86a87436ecc410c0547c52e453b47e71fe7113","unresolved":false,"context_lines":[{"line_number":117,"context_line":"#. Pin RPC/Object version at N for all services (The corresponding version"},{"line_number":118,"context_line":"   used in N release)."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"#. Upgrade Ironic-API services one by one."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"#. Upgrade Ironic-Conductor services one by one."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a122d0e_c7947338","line":120,"updated":"2016-04-28 02:17:52.000000000","message":"There is an alternative solution for upgrade conductor first in alternative section below.","commit_id":"b607ba60ec44ffe80caa14bfd275eb0bde2612b3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b8f50ddce965064e826e973523da63190349b2f3","unresolved":false,"context_lines":[{"line_number":230,"context_line":"to new ironic-api using a API-load-balancer."},{"line_number":231,"context_line":"The advantage is that there is no more RPC version needed as all conductors"},{"line_number":232,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":233,"context_line":"switching and depends on a API-load-balancer."},{"line_number":234,"context_line":"In this scenary, the object version will keep pinning untill finish the switch"},{"line_number":235,"context_line":"of API."},{"line_number":236,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a122d0e_2e0eb6e4","line":233,"updated":"2016-04-21 02:01:08.000000000","message":"And need to set up new ironic-api services which is not a complete in-place strategy.","commit_id":"b607ba60ec44ffe80caa14bfd275eb0bde2612b3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b8f50ddce965064e826e973523da63190349b2f3","unresolved":false,"context_lines":[{"line_number":277,"context_line":"is no need to change Nova driver. But since there is a potential change on"},{"line_number":278,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":279,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":280,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"Security impact"},{"line_number":283,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a122d0e_4e705272","line":280,"updated":"2016-04-21 02:01:08.000000000","message":"This means it is possible to upgrade Ironic and Nova separately.","commit_id":"b607ba60ec44ffe80caa14bfd275eb0bde2612b3"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_60453316","line":14,"updated":"2016-05-12 21:26:22.000000000","message":"A bit of a grammar issue here I think. It would be more clear as:\n\n\"This spec is intended to minimize the downtime during Ironic\u0027s upgrade. There should be no downtime when upgrading Ironic services.\"\n\nA general question though: rolling upgrade can\u0027t be zero downtime unless we do online DB migrations; given we don\u0027t, is there a more specific definition of what a rolling upgrade is?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"78930d120befed179986002fcb149ad8222bb205","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_84814150","line":14,"in_reply_to":"dab17558_60453316","updated":"2016-05-13 03:22:33.000000000","message":"Thanks. From [1]\nRolling upgrade can be simply understood as upgrade a project\u0027s some services at a time. In the context of Ironic,\n1. ironic-api should keep working during the upgrade of ironic-conductor \n2. For the case of multi-conductors, admin can upgrade ironic-conductor one by one without stopping serving.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_e4d76dbd","line":14,"in_reply_to":"dab17558_60453316","updated":"2016-05-13 06:28:35.000000000","message":"What I want to say is actually about the running instances.\nSo there probably some downtime for Ironic services during the upgrade, but instances should be unaffected at all.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_998483d3","line":14,"in_reply_to":"dab17558_67ab1b76","updated":"2016-05-17 03:31:09.000000000","message":"@vdrok Hmmm, I am not sure about this. But the opposite of rolling upgrade is to upgrade all ironic services in one time, so your case should also be a rolling upgrade.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_67ab1b76","line":14,"in_reply_to":"dab17558_84814150","updated":"2016-05-16 13:55:37.000000000","message":"Hm, what if some new feature requires all the conductors to be upgraded at the same time, is it still a rolling upgrade? (API still can be upgraded separately)","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f07cde83843d889d33d3073c741035cb85b8cf31","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This spec is intended to minimize the downtime during Ironic\u0027s upgrade."},{"line_number":14,"context_line":"But there should be no impact on instances like downtime or network when"},{"line_number":15,"context_line":"you upgrade Ironic."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_039751ec","line":14,"in_reply_to":"dab17558_998483d3","updated":"2016-05-18 03:05:04.000000000","message":"@vdrok. I think that once we have rolling upgrade working, we won\u0027t/shouldn\u0027t allow any change that would break rolling upgrades. If something comes up that would cause rolling upgrades to break (one reason for grenade tests, to confirm we don\u0027t break), we will have to discuss on a case-by-case basis.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"886825e34e8c43db08c6e6adc80e3565ff572e7c","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"People running OpenStack cloud always face a same problem, how to upgrade the"},{"line_number":21,"context_line":"old cloud to the latest one to enjoy the new features."},{"line_number":22,"context_line":"One possible way is to build a new cloud along side the old one, but this is"},{"line_number":23,"context_line":"not a good choice for many reasons."},{"line_number":24,"context_line":"Another way is cold upgrade cloud in-place. This approach will upgrade each"},{"line_number":25,"context_line":"component of the cloud, piece by piece. One possible upgrade procedures in"},{"line_number":26,"context_line":"order is:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_5ff58d81","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":35},"updated":"2016-05-06 07:17:39.000000000","message":"seems like this should just be covered in Alternatives section.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8e8ba207c7da64b84657b8054e7671e24d8ffea7","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"People running OpenStack cloud always face a same problem, how to upgrade the"},{"line_number":21,"context_line":"old cloud to the latest one to enjoy the new features."},{"line_number":22,"context_line":"One possible way is to build a new cloud along side the old one, but this is"},{"line_number":23,"context_line":"not a good choice for many reasons."},{"line_number":24,"context_line":"Another way is cold upgrade cloud in-place. This approach will upgrade each"},{"line_number":25,"context_line":"component of the cloud, piece by piece. One possible upgrade procedures in"},{"line_number":26,"context_line":"order is:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_8602ca07","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":35},"in_reply_to":"dab17558_5ff58d81","updated":"2016-05-09 08:14:55.000000000","message":"This isn\u0027t a really alternatives option. It\u0027s a background knowledge from my point of view :)","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"78930d120befed179986002fcb149ad8222bb205","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"People running OpenStack cloud always face a same problem, how to upgrade the"},{"line_number":21,"context_line":"old cloud to the latest one to enjoy the new features."},{"line_number":22,"context_line":"One possible way is to build a new cloud along side the old one, but this is"},{"line_number":23,"context_line":"not a good choice for many reasons."},{"line_number":24,"context_line":"Another way is cold upgrade cloud in-place. This approach will upgrade each"},{"line_number":25,"context_line":"component of the cloud, piece by piece. One possible upgrade procedures in"},{"line_number":26,"context_line":"order is:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_44c8f974","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":35},"in_reply_to":"dab17558_80c937af","updated":"2016-05-13 03:22:33.000000000","message":"Agree","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"People running OpenStack cloud always face a same problem, how to upgrade the"},{"line_number":21,"context_line":"old cloud to the latest one to enjoy the new features."},{"line_number":22,"context_line":"One possible way is to build a new cloud along side the old one, but this is"},{"line_number":23,"context_line":"not a good choice for many reasons."},{"line_number":24,"context_line":"Another way is cold upgrade cloud in-place. This approach will upgrade each"},{"line_number":25,"context_line":"component of the cloud, piece by piece. One possible upgrade procedures in"},{"line_number":26,"context_line":"order is:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_80c937af","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":35},"in_reply_to":"dab17558_8602ca07","updated":"2016-05-12 21:26:22.000000000","message":"I mean, I think this could be removed entirely or put in alternatives. I don\u0027t think anyone actually thinks it\u0027s reasonable to tear down a cloud, along will all resources spun up in it, as an upgrade.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"One possible way is to build a new cloud along side the old one, but this is"},{"line_number":23,"context_line":"not a good choice for many reasons."},{"line_number":24,"context_line":"Another way is cold upgrade cloud in-place. This approach will upgrade each"},{"line_number":25,"context_line":"component of the cloud, piece by piece. One possible upgrade procedures in"},{"line_number":26,"context_line":"order is:"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    * upgrade keystone"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_20096bde","line":25,"updated":"2016-05-12 21:26:22.000000000","message":"nit: s/procedures/procedure/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"services one by one while keep the rest work. This means we can upgrade the"},{"line_number":50,"context_line":"cloud with minimal or even zero downtime."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Key Concepts"},{"line_number":53,"context_line":"------------"},{"line_number":54,"context_line":"Here are some key conecpts need to clarify for understand the solution better,"},{"line_number":55,"context_line":"reference Nova upgrade model [2]:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_a0ca7b6c","line":52,"updated":"2016-05-12 21:26:22.000000000","message":"Do we actually intend on implementing all these concepts? Especially the pieces around online DB migration seem like they could be a whole spec worth of difficulty.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"78930d120befed179986002fcb149ad8222bb205","unresolved":false,"context_lines":[{"line_number":49,"context_line":"services one by one while keep the rest work. This means we can upgrade the"},{"line_number":50,"context_line":"cloud with minimal or even zero downtime."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Key Concepts"},{"line_number":53,"context_line":"------------"},{"line_number":54,"context_line":"Here are some key conecpts need to clarify for understand the solution better,"},{"line_number":55,"context_line":"reference Nova upgrade model [2]:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_2473354f","line":52,"in_reply_to":"dab17558_a0ca7b6c","updated":"2016-05-13 03:22:33.000000000","message":"It didn\u0027t has to do but it\u0027s better to list here for better understand.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Key Concepts"},{"line_number":53,"context_line":"------------"},{"line_number":54,"context_line":"Here are some key conecpts need to clarify for understand the solution better,"},{"line_number":55,"context_line":"reference Nova upgrade model [2]:"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* RPC/Object Version pinning"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_a0e39b04","line":54,"updated":"2016-05-12 21:26:22.000000000","message":"typo: s/conecpts/concepts/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"* RPC/Object Version pinning"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"  Through careful RPC/Object versioning, ironic-api is able to interact with"},{"line_number":60,"context_line":"  old/new version of ironc-conductor. On the other hand, ironic-conductor also"},{"line_number":61,"context_line":"  can interact with old/new version of ironic-api. So when upgrading ironic-api"},{"line_number":62,"context_line":"  and ironic-conductor services, we should pin them at an older version until"},{"line_number":63,"context_line":"  all services are already upgraded."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_a0f55bcc","line":60,"updated":"2016-05-12 21:26:22.000000000","message":"typo: s/ironc/ironic/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"  Modern databases are able to make many schema changes while you are still"},{"line_number":75,"context_line":"  writing to the database. Taking this a step further, we can make all DB"},{"line_number":76,"context_line":"  changes by first adding the new structures, expanding. Then you can slowly"},{"line_number":77,"context_line":"  move all the data into a new location and format. Once that is complete,"},{"line_number":78,"context_line":"  you can drop bits of the scheme that are no long needed, i.e. contract."},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_478ed7d0","line":76,"updated":"2016-05-16 13:55:37.000000000","message":"I think \"slowly\" is not necessary here :)","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_009f0760","line":93,"updated":"2016-05-12 21:26:22.000000000","message":"So we aren\u0027t supporting rolling upgrades for X.Y -\u003e X.Z or X.Y -\u003e X+1.0? This seems different than what was discussed at the summit.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"78930d120befed179986002fcb149ad8222bb205","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_e4c64d48","line":93,"in_reply_to":"dab17558_009f0760","updated":"2016-05-13 03:22:33.000000000","message":"Sorry, I miss that section and I was supposed to there. So I didn\u0027t get the points to support number release. I still doubt the necessary to support number release. It\u0027s possible to do that but that would be a burden for admin.\nBut for example Mitaka -\u003e current master can be support.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_b99d070c","line":93,"in_reply_to":"dab17558_02679de9","updated":"2016-05-17 03:31:09.000000000","message":"I understand the support of numbered release is very important to Ironic and I am not strong disagree with that if there is already a consensus about this. But then there will many extra burden to upgrade ironic","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_02679de9","line":93,"in_reply_to":"dab17558_6751bf0e","updated":"2016-05-16 13:55:37.000000000","message":"IIRC apart from the numbered releases case, there was a point to do last numbered release -\u003e master.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f07cde83843d889d33d3073c741035cb85b8cf31","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bab6814e_7381ba8f","line":93,"in_reply_to":"dab17558_b99d070c","updated":"2016-05-18 03:05:04.000000000","message":"I looked at the etherpad from the summit and it doesn\u0027t mention what was discussed wrt the releases that we want to have rolling upgrades. I am fairly sure Deva talked about it, and it was basically what was in the email thread http://lists.openstack.org/pipermail/openstack-dev/2016-April/092754.html.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":90,"context_line":"Since this upgrade procedure is about the whole cloud and we are"},{"line_number":91,"context_line":"not allowed to skip over releases when upgrading. And Ironic usually"},{"line_number":92,"context_line":"have several number releases (5.0 for example) in six months, so only"},{"line_number":93,"context_line":"support rolling upgrade for name release (like from Mitaka to Newton)."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_6751bf0e","line":93,"in_reply_to":"dab17558_e4c64d48","updated":"2016-05-13 06:28:35.000000000","message":"What I mean here is the base version has to be named release and give more examples are supported:\nMitaka -\u003e 6.y \nMitaka -\u003e Netwon stable release\nMitaka -\u003e master (during newton developing)\nMitaka -\u003e patch to be test (during newton developing)","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":112,"context_line":"So we could follow this procedure to upgrade Ironic from N release to N+1"},{"line_number":113,"context_line":"release:"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"#. upgrade DB schema to N+1 (follow a strict DB schema upgrade strategy)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC/Object version at N for all services (The corresponding version"},{"line_number":118,"context_line":"   used in N release)."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_a23851a1","line":115,"updated":"2016-05-16 13:55:37.000000000","message":"I may be wrong, but isn\u0027t it what is done by ironic-dbsync? Or I just don\u0027t know what \"strict upgrade\" means. Is it going to be some new script?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":112,"context_line":"So we could follow this procedure to upgrade Ironic from N release to N+1"},{"line_number":113,"context_line":"release:"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"#. upgrade DB schema to N+1 (follow a strict DB schema upgrade strategy)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC/Object version at N for all services (The corresponding version"},{"line_number":118,"context_line":"   used in N release)."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_d9ad6b32","line":115,"in_reply_to":"dab17558_a23851a1","updated":"2016-05-17 03:31:09.000000000","message":"Yes, it is done by the command but the change of object model should follow this. Did this sounds clearer?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8e8ba207c7da64b84657b8054e7671e24d8ffea7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"* Expand/Contract DB Migration"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":134,"context_line":"  accepted. Alter action is not supported any more. Drop action is"},{"line_number":135,"context_line":"  conditionally accpeted because the deprecate columns in this release can"},{"line_number":136,"context_line":"  only be dropped in next release or later."},{"line_number":137,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_fd6ec9c7","line":134,"range":{"start_line":134,"start_character":12,"end_line":134,"end_character":17},"updated":"2016-05-09 08:14:55.000000000","message":"s/Alter/Change/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"886825e34e8c43db08c6e6adc80e3565ff572e7c","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":134,"context_line":"  accepted. Alter action is not supported any more. Drop action is"},{"line_number":135,"context_line":"  conditionally accpeted because the deprecate columns in this release can"},{"line_number":136,"context_line":"  only be dropped in next release or later."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"* RPC/Object Version pinning"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_5f6aad1b","line":135,"range":{"start_line":135,"start_character":16,"end_line":135,"end_character":24},"updated":"2016-05-06 07:17:39.000000000","message":"type-o: accepted","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":134,"context_line":"  accepted. Alter action is not supported any more. Drop action is"},{"line_number":135,"context_line":"  conditionally accpeted because the deprecate columns in this release can"},{"line_number":136,"context_line":"  only be dropped in next release or later."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"* RPC/Object Version pinning"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_a0c6fb46","line":135,"range":{"start_line":135,"start_character":16,"end_line":135,"end_character":24},"in_reply_to":"dab17558_5f6aad1b","updated":"2016-05-12 21:26:22.000000000","message":"typo: s/deprecate/deprecated/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":141,"context_line":"  config, it is able to handle the communication between different version of"},{"line_number":142,"context_line":"  services."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"* Make service compatiable"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"  The most difficult part for rolling upgrade is how to make services"},{"line_number":147,"context_line":"  compatible during upgrade because there will old and new ironic-api and"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_982a422b","line":144,"range":{"start_line":144,"start_character":15,"end_line":144,"end_character":26},"updated":"2016-05-13 06:28:35.000000000","message":"s/compatiable/compatible/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":147,"context_line":"  compatible during upgrade because there will old and new ironic-api and"},{"line_number":148,"context_line":"  ironic-conductor co-existed. Will discuss this case by case in this section,"},{"line_number":149,"context_line":"  but there is one principle to keep in mind: nothing will be written to new"},{"line_number":150,"context_line":"  columns until unpin object version and each service will run its own version"},{"line_number":151,"context_line":"  object instance(N/N+1) but only update attributes in N version object to DB"},{"line_number":152,"context_line":"  (N version object means the corresponding version of object in N release):"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_021f9d08","line":150,"updated":"2016-05-16 13:55:37.000000000","message":"s/unpin/we unpin/ ?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":148,"context_line":"  ironic-conductor co-existed. Will discuss this case by case in this section,"},{"line_number":149,"context_line":"  but there is one principle to keep in mind: nothing will be written to new"},{"line_number":150,"context_line":"  columns until unpin object version and each service will run its own version"},{"line_number":151,"context_line":"  object instance(N/N+1) but only update attributes in N version object to DB"},{"line_number":152,"context_line":"  (N version object means the corresponding version of object in N release):"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"  - Handle the communication among N version of ironic-api/ironic-conductor"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_22d0e11e","line":151,"updated":"2016-05-16 13:55:37.000000000","message":"\"of object instance\"? s/update/write/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":148,"context_line":"  ironic-conductor co-existed. Will discuss this case by case in this section,"},{"line_number":149,"context_line":"  but there is one principle to keep in mind: nothing will be written to new"},{"line_number":150,"context_line":"  columns until unpin object version and each service will run its own version"},{"line_number":151,"context_line":"  object instance(N/N+1) but only update attributes in N version object to DB"},{"line_number":152,"context_line":"  (N version object means the corresponding version of object in N release):"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"  - Handle the communication among N version of ironic-api/ironic-conductor"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_b96b47f0","line":151,"in_reply_to":"dab17558_22d0e11e","updated":"2016-05-17 03:31:09.000000000","message":"node object instance, for example","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":160,"context_line":"      IronicObjectSerializer will send the N version object to"},{"line_number":161,"context_line":"      ironic-conductor."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    * N version of ironic-api will create N version object instance when"},{"line_number":164,"context_line":"      get() and only update attributes in N version object when"},{"line_number":165,"context_line":"      save()/create(). And it will only return attributes in N version"},{"line_number":166,"context_line":"      object to end users."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_c237554b","line":163,"updated":"2016-05-16 13:55:37.000000000","message":"s/create N version object instance/instantiate N version object/ ?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":160,"context_line":"      IronicObjectSerializer will send the N version object to"},{"line_number":161,"context_line":"      ironic-conductor."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    * N version of ironic-api will create N version object instance when"},{"line_number":164,"context_line":"      get() and only update attributes in N version object when"},{"line_number":165,"context_line":"      save()/create(). And it will only return attributes in N version"},{"line_number":166,"context_line":"      object to end users."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_d9744bd0","line":163,"in_reply_to":"dab17558_c237554b","updated":"2016-05-17 03:31:09.000000000","message":"This is better","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":161,"context_line":"      ironic-conductor."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    * N version of ironic-api will create N version object instance when"},{"line_number":164,"context_line":"      get() and only update attributes in N version object when"},{"line_number":165,"context_line":"      save()/create(). And it will only return attributes in N version"},{"line_number":166,"context_line":"      object to end users."},{"line_number":167,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_e2e419e1","line":164,"updated":"2016-05-16 13:55:37.000000000","message":"s/update/write/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":165,"context_line":"      save()/create(). And it will only return attributes in N version"},{"line_number":166,"context_line":"      object to end users."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    * N version of ironic-conductor will create N version object instance"},{"line_number":169,"context_line":"      when get() and it only update attributes in N version object when"},{"line_number":170,"context_line":"      save()."},{"line_number":171,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_424405b6","line":168,"updated":"2016-05-16 13:55:37.000000000","message":"ditto, for other places too.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":169,"context_line":"      when get() and it only update attributes in N version object when"},{"line_number":170,"context_line":"      save()."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"  - Handle the communication among N version of ironic-api and N+1/N version of"},{"line_number":173,"context_line":"    ironic-conductor during the upgrade of ironic-conductors:"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    * Ironic-api will send N version RPC call to conductor. For the case of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_fdaddce9","line":172,"updated":"2016-05-16 13:55:37.000000000","message":"I\u0027m not sure what N+1/N means. That some conductors are version N and some are N+1?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":169,"context_line":"      when get() and it only update attributes in N version object when"},{"line_number":170,"context_line":"      save()."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"  - Handle the communication among N version of ironic-api and N+1/N version of"},{"line_number":173,"context_line":"    ironic-conductor during the upgrade of ironic-conductors:"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    * Ironic-api will send N version RPC call to conductor. For the case of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_f9602f03","line":172,"in_reply_to":"dab17558_fdaddce9","updated":"2016-05-17 03:31:09.000000000","message":"Yes, you are right. Because we upgrade Ironic-conductors one by one.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":186,"context_line":"      when get() and it only update attributes in N version object when"},{"line_number":187,"context_line":"      save()."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":190,"context_line":"      when get() but will only update attributes in N version object when"},{"line_number":191,"context_line":"      save(). But it will receive N version object from ironic-api, so we need"},{"line_number":192,"context_line":"      to make it compatiable."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_e29c1910","line":189,"updated":"2016-05-16 13:55:37.000000000","message":"So the new fields will still be present when N version API gets the serialized object? Will the deserializer just ignore the fields it doesn\u0027t understand? And if they will be ignored, why do we not write all the fields in N+1 ironic-conductor?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":186,"context_line":"      when get() and it only update attributes in N version object when"},{"line_number":187,"context_line":"      save()."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":190,"context_line":"      when get() but will only update attributes in N version object when"},{"line_number":191,"context_line":"      save(). But it will receive N version object from ironic-api, so we need"},{"line_number":192,"context_line":"      to make it compatiable."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_5fbf9bcf","line":189,"in_reply_to":"dab17558_e29c1910","updated":"2016-05-17 03:31:09.000000000","message":"The deserializer will ignore the fields but ironic-conduct could instantiate its own object which may have new fields. That\u0027s why we need to handle save() thing.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":190,"context_line":"      when get() but will only update attributes in N version object when"},{"line_number":191,"context_line":"      save(). But it will receive N version object from ironic-api, so we need"},{"line_number":192,"context_line":"      to make it compatiable."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"  - Handle the communication among N+1/N version of ironic-api and N+1 version"},{"line_number":195,"context_line":"    of ironic-conductor during the upgrade of ironic-api:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_d89faa4e","line":192,"range":{"start_line":192,"start_character":17,"end_line":192,"end_character":28},"updated":"2016-05-13 06:28:35.000000000","message":"s/compatiable/compatible/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    * N+1 version of ironic-api will create N+1 version object instance when"},{"line_number":205,"context_line":"      get() and update attributes in N version object when save()/create()."},{"line_number":206,"context_line":"      It will only return attributes in N version object to end users."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    * N version of ironic-api will create N version object instance when get()"},{"line_number":209,"context_line":"      and update attributes in N version object when save()/create(). It will"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_7d056c0f","line":206,"updated":"2016-05-16 13:55:37.000000000","message":"Why can\u0027t we return N+1 representation to user, with new fields e.g. unset? So that it will not be used with N version API afterwards?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    * N+1 version of ironic-api will create N+1 version object instance when"},{"line_number":205,"context_line":"      get() and update attributes in N version object when save()/create()."},{"line_number":206,"context_line":"      It will only return attributes in N version object to end users."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    * N version of ironic-api will create N version object instance when get()"},{"line_number":209,"context_line":"      and update attributes in N version object when save()/create(). It will"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_9f7d836f","line":206,"in_reply_to":"dab17558_7d056c0f","updated":"2016-05-17 03:31:09.000000000","message":"Sorry, I didn\u0027t explain it clear. So the new fields is unset. I would see return the N+1 object in N representation to user.\nHere is one example, if we refactor configdrive from node.instance_info to node.configdrive in N+1 object, \nN+1 version of ironic-api will still present configdrive under node.instance_info in this case.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"  After upgrade all services to N+1 version, unpin the RPC/Object version and"},{"line_number":239,"context_line":"  reload configs without restart. oslo.service is able to reload configs when"},{"line_number":240,"context_line":"  receiving SIGHUP signal. So we need to adopt the new feature for"},{"line_number":241,"context_line":"  ironic-api/ironic-conductor."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* Online Data migration using objects"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_fd703c74","line":240,"updated":"2016-05-16 13:55:37.000000000","message":"As a side effect, it will enable to update all the config options right? If so, might be worth mentioning in other end user impact.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"  After upgrade all services to N+1 version, unpin the RPC/Object version and"},{"line_number":239,"context_line":"  reload configs without restart. oslo.service is able to reload configs when"},{"line_number":240,"context_line":"  receiving SIGHUP signal. So we need to adopt the new feature for"},{"line_number":241,"context_line":"  ironic-api/ironic-conductor."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* Online Data migration using objects"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_bc9df50b","line":240,"in_reply_to":"dab17558_fd703c74","updated":"2016-05-17 03:31:09.000000000","message":"Not all but yes, it will have impacts on mutable options.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"  After upgrade all services to N+1 version and unpin the Object version, it"},{"line_number":246,"context_line":"  is possible do the DB data migration at run time because N+1 version of"},{"line_number":247,"context_line":"  ironic-conductor/ironic-api will covert old DB record to N+1 version and"},{"line_number":248,"context_line":"  save/create object attributes in N+1 version too. Besides,"},{"line_number":249,"context_line":"  a new DB command will run to guarantee old db columns are NULL."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_9d0650cc","line":247,"range":{"start_line":247,"start_character":35,"end_line":247,"end_character":41},"updated":"2016-05-16 13:55:37.000000000","message":"convert","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":245,"context_line":"  After upgrade all services to N+1 version and unpin the Object version, it"},{"line_number":246,"context_line":"  is possible do the DB data migration at run time because N+1 version of"},{"line_number":247,"context_line":"  ironic-conductor/ironic-api will covert old DB record to N+1 version and"},{"line_number":248,"context_line":"  save/create object attributes in N+1 version too. Besides,"},{"line_number":249,"context_line":"  a new DB command will run to guarantee old db columns are NULL."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"Alternatives"},{"line_number":252,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_471d9b65","line":249,"range":{"start_line":248,"start_character":52,"end_line":249,"end_character":65},"updated":"2016-05-13 06:28:35.000000000","message":"This can be done in another sepc","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":256,"context_line":"to new ironic-api using a API-load-balancer."},{"line_number":257,"context_line":"The advantage is that there is no more RPC version needed as all conductors"},{"line_number":258,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":259,"context_line":"switching and it is not a compelete in-place strategy."},{"line_number":260,"context_line":"In this scenary, the object version will keep pinning untill finish the switch"},{"line_number":261,"context_line":"of API."},{"line_number":262,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_d8696a27","line":259,"range":{"start_line":259,"start_character":26,"end_line":259,"end_character":35},"updated":"2016-05-13 06:28:35.000000000","message":"s/compelete/complete","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"ee418b6d96c1889b82c9524b5c6d368f3119697d","unresolved":false,"context_lines":[{"line_number":257,"context_line":"The advantage is that there is no more RPC version needed as all conductors"},{"line_number":258,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":259,"context_line":"switching and it is not a compelete in-place strategy."},{"line_number":260,"context_line":"In this scenary, the object version will keep pinning untill finish the switch"},{"line_number":261,"context_line":"of API."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_4003cf76","line":260,"updated":"2016-05-12 21:26:22.000000000","message":"grammar nit, maybe try \"In this scenario, the object version will remain pinned until the API switch is finished.\"","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"374b9ca80a9161849576b526dac20ddcca4eed99","unresolved":false,"context_lines":[{"line_number":257,"context_line":"The advantage is that there is no more RPC version needed as all conductors"},{"line_number":258,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":259,"context_line":"switching and it is not a compelete in-place strategy."},{"line_number":260,"context_line":"In this scenary, the object version will keep pinning untill finish the switch"},{"line_number":261,"context_line":"of API."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_78c67e17","line":260,"in_reply_to":"dab17558_4003cf76","updated":"2016-05-13 06:28:35.000000000","message":"Thanks","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8e8ba207c7da64b84657b8054e7671e24d8ffea7","unresolved":false,"context_lines":[{"line_number":264,"context_line":"-----------------"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":267,"context_line":"accepted. Alter action is not supported any more. Drop action is"},{"line_number":268,"context_line":"conditionally accpeted because the deprecate columns in this release can"},{"line_number":269,"context_line":"only be dropped in next release or later."},{"line_number":270,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_2b7807c4","line":267,"range":{"start_line":267,"start_character":10,"end_line":267,"end_character":15},"updated":"2016-05-09 08:14:55.000000000","message":"s/Alter/Change/","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":276,"context_line":"REST API impact"},{"line_number":277,"context_line":"---------------"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"None"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"Client (CLI) impact"},{"line_number":282,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_ddb1f802","line":279,"updated":"2016-05-16 13:55:37.000000000","message":"Looking at all the options, API may be returning older objects than it supports during the upgrade process?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":276,"context_line":"REST API impact"},{"line_number":277,"context_line":"---------------"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"None"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"Client (CLI) impact"},{"line_number":282,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_dc6a7919","line":279,"in_reply_to":"dab17558_ddb1f802","updated":"2016-05-17 03:31:09.000000000","message":"Yes, I will add this too. Thanks to point it.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"886825e34e8c43db08c6e6adc80e3565ff572e7c","unresolved":false,"context_lines":[{"line_number":348,"context_line":"-----------"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Primary assignee:"},{"line_number":351,"context_line":"  \u003ctan-lin-good\u003e"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"Other contributors:"},{"line_number":354,"context_line":"  anyone who are interesting in this are warmly welcome"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_ff49e18f","line":351,"range":{"start_line":351,"start_character":2,"end_line":351,"end_character":16},"updated":"2016-05-06 07:17:39.000000000","message":"Please use full name and identify source of the nick name.. is this an irc handle? or launchpad?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8e8ba207c7da64b84657b8054e7671e24d8ffea7","unresolved":false,"context_lines":[{"line_number":348,"context_line":"-----------"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Primary assignee:"},{"line_number":351,"context_line":"  \u003ctan-lin-good\u003e"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"Other contributors:"},{"line_number":354,"context_line":"  anyone who are interesting in this are warmly welcome"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_abbcf76c","line":351,"range":{"start_line":351,"start_character":2,"end_line":351,"end_character":16},"in_reply_to":"dab17558_ff49e18f","updated":"2016-05-09 08:14:55.000000000","message":"irc: lintan","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":368,"context_line":"Dependencies"},{"line_number":369,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Need the integration of grenade with Ironic for testing."},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"Testing"},{"line_number":374,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_fd6b1c1c","line":371,"updated":"2016-05-16 13:55:37.000000000","message":"If I\u0027m not mistaken, you mean grenade-partial here?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":368,"context_line":"Dependencies"},{"line_number":369,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"Need the integration of grenade with Ironic for testing."},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"Testing"},{"line_number":374,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_3c4aa555","line":371,"in_reply_to":"dab17558_fd6b1c1c","updated":"2016-05-17 03:31:09.000000000","message":"Yes","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8358527c588e619e030b5b9a6ddb82368e58a678","unresolved":false,"context_lines":[{"line_number":374,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":375,"context_line":"Besides unit tests, there is a need for setting a multi-node grenade CI to test"},{"line_number":376,"context_line":"rolling upgrade mechanism was not broken by latest patch. Node A will run both"},{"line_number":377,"context_line":"of ironic-api and ironic-conductor and node B will run ironic-api only."},{"line_number":378,"context_line":"Multi-node grenade CI will only upgrade Node A and then we can test the"},{"line_number":379,"context_line":"interaction between N/N+1.dev*** version of ironic-api and N+1.dev*** version"},{"line_number":380,"context_line":"of ironic-conductor is still works."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_fdd95cf4","line":377,"updated":"2016-05-16 13:55:37.000000000","message":"Why not run ironic-conductor on node B too?","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"815a58e785194b4f3e7cd513fe3763e52cddc5af","unresolved":false,"context_lines":[{"line_number":374,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":375,"context_line":"Besides unit tests, there is a need for setting a multi-node grenade CI to test"},{"line_number":376,"context_line":"rolling upgrade mechanism was not broken by latest patch. Node A will run both"},{"line_number":377,"context_line":"of ironic-api and ironic-conductor and node B will run ironic-api only."},{"line_number":378,"context_line":"Multi-node grenade CI will only upgrade Node A and then we can test the"},{"line_number":379,"context_line":"interaction between N/N+1.dev*** version of ironic-api and N+1.dev*** version"},{"line_number":380,"context_line":"of ironic-conductor is still works."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dab17558_3cf10596","line":377,"in_reply_to":"dab17558_fdd95cf4","updated":"2016-05-17 03:31:09.000000000","message":"It could but not necessary. Because services on node B will keep unchanged and current rolling upgrade scenario is upgrade all conductors then upgrade api.\nThere is no need to test N+1 version API works with N conductor.","commit_id":"cfc6d69c261478c9d6e49fe2fd1ac3326c521073"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eb15de37a2a18e411d9ebf7b5c0556c36c0500da","unresolved":false,"context_lines":[{"line_number":72,"context_line":"* named release N to N+1. This would be a typical usage when upgrading"},{"line_number":73,"context_line":"  an OpenStack cloud. (Where N starts with Newton or whenever we get"},{"line_number":74,"context_line":"  rolling upgrades to work.)"},{"line_number":75,"context_line":"* sequential major or minor releases, e.g.: 5.x to 6.y; or 5.3 to 5.4."},{"line_number":76,"context_line":"* most recent named release N to master"},{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_0a410f0c","line":75,"updated":"2016-05-18 06:55:09.000000000","message":"So I would like to add a warning here,\n.. warning::\n\n   if Ironic support upgrade numbered release, then admin \n   will upgrade 5.0-\u003e5.1-\u003e5.2-\u003e5.y-\u003e6.0 if they want to\n   upgrade 5.0-\u003e6.0. Because there is a big risk to skip  \n   over releases when upgrading. Here is an example to  \n   rename node.extra to node.fake. It is possible to\n   add new field node.fake in 5.1 and delete old field\n   node.extra in 5.2. But directly upgrade from\n   5.0 -\u003e 6.0 will break the law of rolling upgrade.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"65aba2cfe69a4846416db721d708a10131071cfc","unresolved":false,"context_lines":[{"line_number":72,"context_line":"* named release N to N+1. This would be a typical usage when upgrading"},{"line_number":73,"context_line":"  an OpenStack cloud. (Where N starts with Newton or whenever we get"},{"line_number":74,"context_line":"  rolling upgrades to work.)"},{"line_number":75,"context_line":"* sequential major or minor releases, e.g.: 5.x to 6.y; or 5.3 to 5.4."},{"line_number":76,"context_line":"* most recent named release N to master"},{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_c609a233","line":75,"in_reply_to":"bab6814e_0a410f0c","updated":"2016-05-18 14:50:41.000000000","message":"Thanks for pointing this out. Because we need to think about these cases and whether rolling upgrades will work or not. Removing something requires a deprecation period first. But I don\u0027t think we have a policy wrt semversioning to know for sure which release will have the deletion. SIGH.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"74e85df185eb68da11a4aa4d0d4015595d5487b4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"* named release N to N+1. This would be a typical usage when upgrading"},{"line_number":73,"context_line":"  an OpenStack cloud. (Where N starts with Newton or whenever we get"},{"line_number":74,"context_line":"  rolling upgrades to work.)"},{"line_number":75,"context_line":"* sequential major or minor releases, e.g.: 5.x to 6.y; or 5.3 to 5.4."},{"line_number":76,"context_line":"* most recent named release N to master"},{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_96c18583","line":75,"in_reply_to":"bab6814e_c609a233","updated":"2016-05-18 15:10:21.000000000","message":"Well, anything backward compatible forces a major version bump, so in the case of \"delete old field node.extra\", that would mean the version would be 6.0, not 5.2.\n\nWe also follow OpenStack\u0027s standard deprecation policy (http://governance.openstack.org/reference/tags/assert_follows-standard-deprecation.html), which says that the deprecation period must be three months *and* a cycle boundary, meaning that there will never be anything both deprecated and removed between two named releases.\n\nSo how I would summarize this is: \"we support upgrades between two named releases and anything in between two named releases\".","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"71738c76a22f973ae55c1f57f3202b25e0f690af","unresolved":false,"context_lines":[{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"},{"line_number":79,"context_line":"  numbered (major or minor) release."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Key Concepts"},{"line_number":83,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_13866eb9","line":80,"updated":"2016-05-18 03:04:46.000000000","message":"Lin, I moved this before Key Concepts because I think it makes more sense here. Let me know what you think.\n\nAlso, I listed out what was mentioned in http://lists.openstack.org/pipermail/openstack-dev/2016-April/092754.html. (Maybe I should put a reference to that.) We can continue the discussion here.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eb15de37a2a18e411d9ebf7b5c0556c36c0500da","unresolved":false,"context_lines":[{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"},{"line_number":79,"context_line":"  numbered (major or minor) release."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Key Concepts"},{"line_number":83,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_9f2ffff5","line":80,"in_reply_to":"bab6814e_13866eb9","updated":"2016-05-18 06:55:09.000000000","message":"This is something need to highlight but I am afraid people  didn\u0027t understand rolling upgrade until they read key concepts part. But that\u0027s fair to me to discuss in this spec.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"65aba2cfe69a4846416db721d708a10131071cfc","unresolved":false,"context_lines":[{"line_number":77,"context_line":"* most recent semver release x.y to master"},{"line_number":78,"context_line":"* some SHA-more-recent-than-last-named to master. This could be some"},{"line_number":79,"context_line":"  numbered (major or minor) release."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Key Concepts"},{"line_number":83,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_41d8fc53","line":80,"in_reply_to":"bab6814e_9f2ffff5","updated":"2016-05-18 14:50:41.000000000","message":"The reason for having this first, is that I see it as \u0027the requirements\u0027. Without the requirements, how do you know if your solution will work. Although I realize you took the solution (key concepts) from nova, and fitted it into ironic\u0027s usecase. If those concepts that are used to address nova\u0027s rolling upgrade don\u0027t work for ironic\u0027s needs, then we need to figure out what will. Or change the requirements :)","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"71738c76a22f973ae55c1f57f3202b25e0f690af","unresolved":false,"context_lines":[{"line_number":87,"context_line":"* RPC and object version pinning"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"  Through careful RPC and object versioning (via a configuration option),"},{"line_number":90,"context_line":"  ironic-api is able to interact with old and new versions of ironc-conductor."},{"line_number":91,"context_line":"  On the other hand, ironic-conductor also can interact with old and new"},{"line_number":92,"context_line":"  versions of ironic-api. So when upgrading ironic-api"},{"line_number":93,"context_line":"  and ironic-conductor services, we should pin them at the old version until"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_b3bb2275","line":90,"updated":"2016-05-18 03:04:46.000000000","message":"I missed s/ironc-conductor/ironic-conductor/","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eb15de37a2a18e411d9ebf7b5c0556c36c0500da","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"  A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":150,"context_line":"  accepted. Change action is not supported any more. Drop action is"},{"line_number":151,"context_line":"  conditionally accepted because the deprecate columns in this release can"},{"line_number":152,"context_line":"  only be dropped in next release or later."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"* RPC/Object Version pinning"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_aa3563f8","line":151,"range":{"start_line":151,"start_character":37,"end_line":151,"end_character":46},"updated":"2016-05-18 06:55:09.000000000","message":"s/deprecate/deprecated/","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"71738c76a22f973ae55c1f57f3202b25e0f690af","unresolved":false,"context_lines":[{"line_number":268,"context_line":"  a new DB command will run to guarantee old db columns are NULL."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"As discussed in [3], it is okay for ironic-api to directly access the DB."},{"line_number":272,"context_line":"There is no need to use ``@remotable`` on objects in Ironic. This is different"},{"line_number":273,"context_line":"from Nova\u0027s case."},{"line_number":274,"context_line":"``@remotable`` is widely used in Nova because Nova has many different types"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_f3112a5f","line":271,"updated":"2016-05-18 03:04:46.000000000","message":"I moved this down because it was odd to read this as part of the rolling upgrade process. I think you added it to indicate that it is not necessary to do this. I am mulling over where/how to put this; I almost feel like we don\u0027t even need it but someone might ask later. I almost wondered if we wanted a \u0027differences between Nova case\u0027 section but not sure about that.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eb15de37a2a18e411d9ebf7b5c0556c36c0500da","unresolved":false,"context_lines":[{"line_number":268,"context_line":"  a new DB command will run to guarantee old db columns are NULL."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"As discussed in [3], it is okay for ironic-api to directly access the DB."},{"line_number":272,"context_line":"There is no need to use ``@remotable`` on objects in Ironic. This is different"},{"line_number":273,"context_line":"from Nova\u0027s case."},{"line_number":274,"context_line":"``@remotable`` is widely used in Nova because Nova has many different types"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bab6814e_aa9f23b3","line":271,"in_reply_to":"bab6814e_f3112a5f","updated":"2016-05-18 06:55:09.000000000","message":"hmmm, good point. I think it is necessary to have a secondary title like you suggest in ``Problem description`` because it\u0027s a big difference compare to nova case.","commit_id":"ef2a7a248c37424d4f816caf33bce5cff8c704ce"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":55,"context_line":"services simultaneously as in a cold upgrade. A rolling upgrade would allow"},{"line_number":56,"context_line":"individual ironic-api and ironic-conductor services to be upgraded one at a"},{"line_number":57,"context_line":"time, with the rest of the services still available. This upgrade would have"},{"line_number":58,"context_line":"minimal or even zero downtime."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_cac7ce43","line":58,"updated":"2016-05-18 23:28:59.000000000","message":"Great paragraph +1","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2a5c52dc28f1c48787e6e59ffbfbcfcddbd6a27","unresolved":false,"context_lines":[{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Rolling upgrades between releases"},{"line_number":65,"context_line":"---------------------------------"},{"line_number":66,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_39351ada","line":63,"updated":"2016-05-18 21:31:17.000000000","message":"Should we mention rolling back? At the very least, that it won\u0027t be supported?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Rolling upgrades between releases"},{"line_number":65,"context_line":"---------------------------------"},{"line_number":66,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_ca798e31","line":63,"in_reply_to":"bab6814e_39351ada","updated":"2016-05-18 23:28:59.000000000","message":"+1, downgrades are not supported should be explicit in documentation.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Rolling upgrades between releases"},{"line_number":65,"context_line":"---------------------------------"},{"line_number":66,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_cf6d169a","line":63,"in_reply_to":"bab6814e_ca798e31","updated":"2016-05-19 09:21:44.000000000","message":"Because the database downgrades are not supported anymore, we don\u0027t have a real roll back supported. But users can re-pin the services with latest code to FromVer which will make Cloud running like previous one, and there is no plan to support reversing the data migration.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  rolling upgrades to work.)"},{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_eaf8d27e","line":81,"updated":"2016-05-18 23:28:59.000000000","message":"We\u0027ll probably get most of this for \"free\", but should we claim every combination between cycles even if we aren\u0027t/can\u0027t test all those combinations in grenade?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  rolling upgrades to work.)"},{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_c42157b6","line":81,"in_reply_to":"bab6814e_647d1d1c","updated":"2016-05-19 16:46:53.000000000","message":"I think it is fine to say that we support this, without testing all combinations all the time. And yes, we should elaborate more in the testing section, to show what should/will be tested.\n\n7.3 to 8.3 should work :)","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  rolling upgrades to work.)"},{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_647d1d1c","line":81,"in_reply_to":"bab6814e_af025209","updated":"2016-05-19 13:06:53.000000000","message":"I have the same concern as @Jay. The testing section also do not clarify much how the upgrade between releases (non-named) will be tested. How does this model of upgrade fits in grenade?\n\nAlso, should it say that it will work between 7.3 to 8.3?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  rolling upgrades to work.)"},{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_af025209","line":81,"in_reply_to":"bab6814e_eaf8d27e","updated":"2016-05-19 09:21:44.000000000","message":"Most are free if there is no change to RPC/Object. It will be simply the code/config change.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_bb358247","line":82,"updated":"2016-05-18 21:26:03.000000000","message":"Tan, I hope this is better/clearer and will work with your proposal :)","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":79,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_72e32d06","line":82,"in_reply_to":"bab6814e_bb358247","updated":"2016-05-19 09:21:44.000000000","message":"Sure, after consider it once again, numbered released can be probably supported wrt the deprecated policy.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"},{"line_number":86,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_8b592c5d","line":83,"updated":"2016-05-19 13:06:53.000000000","message":"Also it does not feel like this section is actually describing any problem? \n\nIt\u0027s saying how things should behave, which should be part of the \"Proposed change\" IMO.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"},{"line_number":81,"context_line":"  will work between 7.3 to 7.9; or 7.4 to 8.2."},{"line_number":82,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"},{"line_number":86,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_3f366ce6","line":83,"in_reply_to":"bab6814e_8b592c5d","updated":"2016-05-19 16:46:53.000000000","message":"Good point!","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"},{"line_number":86,"context_line":"------------"},{"line_number":87,"context_line":"Here are some key concepts that will help you understand the upgrade process."},{"line_number":88,"context_line":"(These are quite similar to what is described in Nova\u0027s upgrade process [2]_.):"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7b603a36","line":87,"updated":"2016-05-18 21:26:03.000000000","message":"So I am struggling with this key concepts section, and the part below (where I added \u0027Code changes\u0027). There seems to be duplication of documentation. I think it needs to be cleaned up but I don\u0027t know how yet. (There is stuff I don\u0027t understand still.)\n\ni decided to focus on the descriptions in the \u0027Code changes\u0027 section, since that helps me understand what works/what needs to be done.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"},{"line_number":86,"context_line":"------------"},{"line_number":87,"context_line":"Here are some key concepts that will help you understand the upgrade process."},{"line_number":88,"context_line":"(These are quite similar to what is described in Nova\u0027s upgrade process [2]_.):"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_855f6d40","line":87,"in_reply_to":"bab6814e_2af3fa9f","updated":"2016-05-19 09:21:44.000000000","message":"OK, maybe delete this section and explain these concepts in  doc.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Key Concepts"},{"line_number":86,"context_line":"------------"},{"line_number":87,"context_line":"Here are some key concepts that will help you understand the upgrade process."},{"line_number":88,"context_line":"(These are quite similar to what is described in Nova\u0027s upgrade process [2]_.):"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_2af3fa9f","line":87,"in_reply_to":"bab6814e_7b603a36","updated":"2016-05-18 23:28:59.000000000","message":"Honestly, I\u0027d just leave these sections out entirely, and just explain the concepts as needed as they are used. Having this here is really confusing.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":101,"context_line":"  During the upgrade, we pin new services to older RPC/Object versions."},{"line_number":102,"context_line":"  After all services have been updated to use newer code, we need to unpin them"},{"line_number":103,"context_line":"  to be able to use any new functionality. The unpinning is done by updating"},{"line_number":104,"context_line":"  a configuration option. Then the SIGHUP signal handling (from oslo.service)"},{"line_number":105,"context_line":"  is used. This allows the services to reload the configurations without"},{"line_number":106,"context_line":"  having to be restarted."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* Expand/Contract DB migration"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_06b7f186","line":105,"range":{"start_line":104,"start_character":26,"end_line":105,"end_character":9},"updated":"2016-05-19 13:06:53.000000000","message":"Does that work? I don\u0027t think we do support SIGHUP. This can be very tricky, because SIGHUP would need to restart things like periodic tasks [0] becasue the configuration is applied at building time.\n\nSIGHUP per si sounds like a work for a whole spec IMO. For example, a possible solution for the periodic tasks example here we would need the decorator to actually get a reference to a function instead of a value, so it can be updated on-the-fly. Something like:\n\n def _spacing():\n  return CONF.interval\n\n @periodics.periodic(spacing_ref\u003d_spacing)\n def foo():\n     ...\n\n[0] https://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L1236","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c545b5823de948d4061f2277fd47e640cf78d30f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"  During the upgrade, we pin new services to older RPC/Object versions."},{"line_number":102,"context_line":"  After all services have been updated to use newer code, we need to unpin them"},{"line_number":103,"context_line":"  to be able to use any new functionality. The unpinning is done by updating"},{"line_number":104,"context_line":"  a configuration option. Then the SIGHUP signal handling (from oslo.service)"},{"line_number":105,"context_line":"  is used. This allows the services to reload the configurations without"},{"line_number":106,"context_line":"  having to be restarted."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"* Expand/Contract DB migration"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_fa15f9e4","line":105,"range":{"start_line":104,"start_character":26,"end_line":105,"end_character":9},"in_reply_to":"bab6814e_06b7f186","updated":"2016-05-20 02:19:17.000000000","message":"You are right about this. Another spec should be added. But one thing needs to be clarified, not all options are supposed to be reload. Only mutable options are allowed.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":122,"context_line":"  the database schema."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Proposed change"},{"line_number":126,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"For a rolling upgrad to have minimal downtime, there should be at least two"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_2a949ae0","line":125,"updated":"2016-05-18 23:28:59.000000000","message":"This entire section lacks structure. We should be direct about what actions need to happen, and not meander around each individual piece. It\u0027s not even entirely clear what of these things Ironic already supports vs will need to support in order to do the upgrades. \n\nI\u0027d suggest laying it out this way: \nProposed upgrade process\n- Step1\n- Step2\n\nChanges needed to support rolling upgrade\n- Change1\n- Change2\n\nAs it is, this reads more like a paper on how to theoretically do upgrades vs actually specifying an upgrade process and the changes needed to support it.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":122,"context_line":"  the database schema."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Proposed change"},{"line_number":126,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"For a rolling upgrad to have minimal downtime, there should be at least two"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_c81eac62","line":125,"in_reply_to":"bab6814e_2a949ae0","updated":"2016-05-19 09:21:44.000000000","message":"This sounds better. I will re-org the entire structure.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":125,"context_line":"Proposed change"},{"line_number":126,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"For a rolling upgrad to have minimal downtime, there should be at least two"},{"line_number":129,"context_line":"ironic-api services and two ironic-conductor services running."},{"line_number":130,"context_line":"The rolling upgrade process to upgrade Ironic from version ``FromVer`` to the"},{"line_number":131,"context_line":"next version ``ToVer`` is as follows:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_66199d79","line":128,"range":{"start_line":128,"start_character":14,"end_line":128,"end_character":20},"updated":"2016-05-19 13:06:53.000000000","message":"upgrade","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":130,"context_line":"The rolling upgrade process to upgrade Ironic from version ``FromVer`` to the"},{"line_number":131,"context_line":"next version ``ToVer`` is as follows:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync`. This may:"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"   * contract the DB, dropping columns that had been deprecated prior to"},{"line_number":136,"context_line":"     ``FromVer``. Due to Ironic\u0027s deprecation policy, it should be safe to"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_0838b49f","line":133,"updated":"2016-05-19 09:21:44.000000000","message":"s/ironic-dbsync/ironic-dbsync upgrade/","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":135,"context_line":"   * contract the DB, dropping columns that had been deprecated prior to"},{"line_number":136,"context_line":"     ``FromVer``. Due to Ironic\u0027s deprecation policy, it should be safe to"},{"line_number":137,"context_line":"     delete these items because nothing should be using them any more."},{"line_number":138,"context_line":"   * expand the DB, adding new items to the DB."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"#. Pin RPC and Object versions to ``FromVer`` for all services via"},{"line_number":141,"context_line":"   the new configuration option described below in \"RPC and object version"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7bbcba6c","line":138,"updated":"2016-05-18 21:26:03.000000000","message":"I threw this in because I think it is important to mention when deleted columns etc are applied.\n\nIs what I put down true though?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":135,"context_line":"   * contract the DB, dropping columns that had been deprecated prior to"},{"line_number":136,"context_line":"     ``FromVer``. Due to Ironic\u0027s deprecation policy, it should be safe to"},{"line_number":137,"context_line":"     delete these items because nothing should be using them any more."},{"line_number":138,"context_line":"   * expand the DB, adding new items to the DB."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"#. Pin RPC and Object versions to ``FromVer`` for all services via"},{"line_number":141,"context_line":"   the new configuration option described below in \"RPC and object version"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_eadbb2eb","line":138,"in_reply_to":"bab6814e_7bbcba6c","updated":"2016-05-18 23:28:59.000000000","message":"I\u0027d be more directive about what\u0027s happening: We run all migrations from FromVer to ToVer. The details of those migrations are in the code, not new, and probably don\u0027t need to be spelled out in this spec imo.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":135,"context_line":"   * contract the DB, dropping columns that had been deprecated prior to"},{"line_number":136,"context_line":"     ``FromVer``. Due to Ironic\u0027s deprecation policy, it should be safe to"},{"line_number":137,"context_line":"     delete these items because nothing should be using them any more."},{"line_number":138,"context_line":"   * expand the DB, adding new items to the DB."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"#. Pin RPC and Object versions to ``FromVer`` for all services via"},{"line_number":141,"context_line":"   the new configuration option described below in \"RPC and object version"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_a85ec80f","line":138,"in_reply_to":"bab6814e_eadbb2eb","updated":"2016-05-19 09:21:44.000000000","message":"I prefer to move it down to code change or data model impact. Don\u0027t explain too much here. Just a simply workflow guide for people.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":153,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"#. Run the :command:`ironic-dbsync` command to ensure that all DB records are"},{"line_number":156,"context_line":"   \"upgraded\" to the new data version."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Code changes"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7b95dae2","line":156,"updated":"2016-05-18 21:26:03.000000000","message":"I don\u0027t understand how running ironic-dbsync here, after running it in line 133, will change things. Are you running it with different arguments?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":153,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"#. Run the :command:`ironic-dbsync` command to ensure that all DB records are"},{"line_number":156,"context_line":"   \"upgraded\" to the new data version."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Code changes"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_68d98083","line":156,"in_reply_to":"bab6814e_0a91d6f0","updated":"2016-05-19 09:21:44.000000000","message":"Yes, a new command will be added.\ns/ironic-dbsync/ironic-dbsync online_data_migration/","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":153,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"#. Run the :command:`ironic-dbsync` command to ensure that all DB records are"},{"line_number":156,"context_line":"   \"upgraded\" to the new data version."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"Code changes"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_0a91d6f0","line":156,"in_reply_to":"bab6814e_7b95dae2","updated":"2016-05-18 23:28:59.000000000","message":"+1 running a dbsync here seems wrong?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":167,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":168,"context_line":"accepted. Change action is not supported any more. Drop action is"},{"line_number":169,"context_line":"conditionally accepted because the deprecated columns in this release can"},{"line_number":170,"context_line":"only be dropped in next release or later."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_db74c6d0","line":170,"updated":"2016-05-18 21:26:03.000000000","message":"I don\u0027t understand this whole section. What is missing from ironic, what needs to be done? Maybe I don\u0027t understand it because of the terminology. What does \u0027strict DB schema upgrade strategy\u0027 mean. Or is that what you are describing here? What does \u0027additional action\u0027 mean? What\u0027s an action? What is a \u0027change action\u0027? \u0027drop action\u0027?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":167,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":168,"context_line":"accepted. Change action is not supported any more. Drop action is"},{"line_number":169,"context_line":"conditionally accepted because the deprecated columns in this release can"},{"line_number":170,"context_line":"only be dropped in next release or later."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_e8f1f06b","line":170,"in_reply_to":"bab6814e_cad86ef2","updated":"2016-05-19 09:21:44.000000000","message":"@ruby, you are right, the whole section is explain the strict DB schema upgrade strategy. Add/Change(Alter)/Drop are mysql/sql statements. Action means a statement to DB schema here. So maybe use add_column/alter_column/drop_cloumn/drop_table in alembic is better?\n\n@JayF, it\u0027s not a directly `code` change, but it\u0027s a real impact to developers for DB schema changes. So I think it\u0027s worth to mention in this spec. Hmmm, I admitted I put too much detail about the story of rolling upgrade, but people keep asking if they didn\u0027t understand the story. It\u0027s a dilemma to me.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":167,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":168,"context_line":"accepted. Change action is not supported any more. Drop action is"},{"line_number":169,"context_line":"conditionally accepted because the deprecated columns in this release can"},{"line_number":170,"context_line":"only be dropped in next release or later."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_cad86ef2","line":170,"in_reply_to":"bab6814e_db74c6d0","updated":"2016-05-18 23:28:59.000000000","message":"+1 agreed this spec should only be about changes needed to get to rolling upgrade (and all the story of what rolling upgrade is)","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":177,"context_line":"Ironic services. With this configuration option, a service will be able"},{"line_number":178,"context_line":"to properly handle the communication between different versions of services."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"The new configuration option is: ``[upgrade_levels]/lowest_service_version``."},{"line_number":181,"context_line":"The default value of empty indicates that ironic-api and ironic-conductor"},{"line_number":182,"context_line":"will use the latest versions of RPC and Objects. Its possible values are"},{"line_number":183,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_de3794e1","line":180,"updated":"2016-05-18 21:26:03.000000000","message":"not to bikeshed, but might as well try to come up with the naming of the config now versus when coding.\n\n1. do we really want/need to put this under a new group, or can it just be in [default] group?\n\n2. \u0027lowest_service_version\u0027 is odd. by \u0027version\u0027, you mean the release version, right? presumably, one could take advantage of this config to pin the services, even if not doing a rolling upgrade. Maybe someone will have a good suggestion for this...","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":177,"context_line":"Ironic services. With this configuration option, a service will be able"},{"line_number":178,"context_line":"to properly handle the communication between different versions of services."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"The new configuration option is: ``[upgrade_levels]/lowest_service_version``."},{"line_number":181,"context_line":"The default value of empty indicates that ironic-api and ironic-conductor"},{"line_number":182,"context_line":"will use the latest versions of RPC and Objects. Its possible values are"},{"line_number":183,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_a3dee96a","line":180,"in_reply_to":"bab6814e_de3794e1","updated":"2016-05-19 09:21:44.000000000","message":"+1 for [DEFAULT], I am not good at naming, version means the release version. what about target\n_run_time_version? \nBut in the future, the value should be automated determined by finding the minimal service release like nova but that is outside the scope of this spec.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":195,"context_line":"written to new DB columns until object versions have been unpinned and each"},{"line_number":196,"context_line":"service will run its own version"},{"line_number":197,"context_line":"object instance(N/N+1) but only update attributes in N version object to DB"},{"line_number":198,"context_line":"(N version object means the corresponding version of object in N release):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"- Handle the communication among N version of ironic-api/ironic-conductor"},{"line_number":201,"context_line":"  after upgrade to the latest DB schema:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_be573001","line":198,"updated":"2016-05-18 21:26:03.000000000","message":"I was unable to understand the above.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":195,"context_line":"written to new DB columns until object versions have been unpinned and each"},{"line_number":196,"context_line":"service will run its own version"},{"line_number":197,"context_line":"object instance(N/N+1) but only update attributes in N version object to DB"},{"line_number":198,"context_line":"(N version object means the corresponding version of object in N release):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"- Handle the communication among N version of ironic-api/ironic-conductor"},{"line_number":201,"context_line":"  after upgrade to the latest DB schema:"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_5910cc01","line":198,"in_reply_to":"bab6814e_be573001","updated":"2016-05-19 09:21:44.000000000","message":"So the whole section is not about the code change, this is about how ironic services behavior during the process of upgrade. Do you think it\u0027s too much detail? Maybe put the whole bunch thing in a new section named `detail rolling upgrade procedure`.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":198,"context_line":"(N version object means the corresponding version of object in N release):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"- Handle the communication among N version of ironic-api/ironic-conductor"},{"line_number":201,"context_line":"  after upgrade to the latest DB schema:"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"  * Ironic-api will send N version RPC call to conductor. For the case"},{"line_number":204,"context_line":"    of update_node(), update_port(), destroy_port(),"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7e82e853","line":201,"updated":"2016-05-18 21:26:03.000000000","message":"This is saying that ironic-api and ironic-conductors are running with version N, and the latest \u003d\u003d N+1 DB schema was applied, right?\n\nI\u0027m guessing you detail the stuff below to show that things will work although it seems to me that in this case, the services have 1. no idea of and additions to the DB schema; 2. shouldn\u0027t be accessing anything in the DB that was removed by this upgrade.\n\nAre there code changes need to do/handle any of the points mentioned below for handling this case?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":198,"context_line":"(N version object means the corresponding version of object in N release):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"- Handle the communication among N version of ironic-api/ironic-conductor"},{"line_number":201,"context_line":"  after upgrade to the latest DB schema:"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"  * Ironic-api will send N version RPC call to conductor. For the case"},{"line_number":204,"context_line":"    of update_node(), update_port(), destroy_port(),"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_f992604a","line":201,"in_reply_to":"bab6814e_7e82e853","updated":"2016-05-19 09:21:44.000000000","message":"Right, there is no code change needed here.Just want to explain the behavior and compare to below cases.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":241,"context_line":"- Handle the communication among N+1/N version of ironic-api and N+1 version"},{"line_number":242,"context_line":"  of ironic-conductor during the upgrade of ironic-api:"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"  * A version_cap should be set for RPC communication. So N+1/N version of"},{"line_number":245,"context_line":"    ironic-api will only send N version compatible RPC call to"},{"line_number":246,"context_line":"    ironic-conductor. For the case of update_node(), update_port(),"},{"line_number":247,"context_line":"    destroy_port(), update_portgroup() and destroy_portgroup() RPC call,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_5ed56441","line":244,"updated":"2016-05-18 21:26:03.000000000","message":"this isn\u0027t something new is it? I thought the pinning of RPC/Object versions will handle this.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":241,"context_line":"- Handle the communication among N+1/N version of ironic-api and N+1 version"},{"line_number":242,"context_line":"  of ironic-conductor during the upgrade of ironic-api:"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"  * A version_cap should be set for RPC communication. So N+1/N version of"},{"line_number":245,"context_line":"    ironic-api will only send N version compatible RPC call to"},{"line_number":246,"context_line":"    ironic-conductor. For the case of update_node(), update_port(),"},{"line_number":247,"context_line":"    destroy_port(), update_portgroup() and destroy_portgroup() RPC call,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_d9f31c9d","line":244,"in_reply_to":"bab6814e_5ed56441","updated":"2016-05-19 09:21:44.000000000","message":"This is not new, this is pinning indeed.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"  * N+1 version of ironic-api will create N+1 version object instance when"},{"line_number":273,"context_line":"    get() and update N+1 version object when save()/create(). This will"},{"line_number":274,"context_line":"    convert old db format to new db format."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_feced881","line":274,"updated":"2016-05-18 21:26:03.000000000","message":"it will? What do you mean by \u0027convert old db format to new db format\u0027? Do you mean that when an object is saved, it will be saved using the format(s) corresponding to the object\u0027s latest (ie N+1) version ?\n\nNo object field should be converted, or the format of a field value changed, right?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"  * N+1 version of ironic-api will create N+1 version object instance when"},{"line_number":273,"context_line":"    get() and update N+1 version object when save()/create(). This will"},{"line_number":274,"context_line":"    convert old db format to new db format."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_19648420","line":274,"in_reply_to":"bab6814e_feced881","updated":"2016-05-19 09:21:44.000000000","message":"Yes, I mean \" when an object is saved, it will be saved using the format(s) corresponding to the object\u0027s latest (ie N+1) version \" so the value of object field in DB will be converted. For example, if instantiate a node object from a old DB record and save immediately, the DB record will saved as a new node object.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."},{"line_number":278,"context_line":"    This also convert old db format to new db format."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"- A framework patch [4]_ and an implementation reference patch [5]_ exist to"},{"line_number":281,"context_line":"  verify the concept."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_9e14ecf5","line":278,"updated":"2016-05-18 21:26:03.000000000","message":"So I question whether any of these details are needed here. It seems to me that what you are describing is how the RPC versioning and Object versioning mechanisms work. (or how they should work). Perhaps it might be better to have/describe RPC versioning and object versioning in a separate section or as part of the \u0027pinning of versions\u0027 section.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."},{"line_number":278,"context_line":"    This also convert old db format to new db format."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"- A framework patch [4]_ and an implementation reference patch [5]_ exist to"},{"line_number":281,"context_line":"  verify the concept."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_d4bf61f9","line":278,"in_reply_to":"bab6814e_9e14ecf5","updated":"2016-05-19 09:21:44.000000000","message":"+1 for a separate section","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."},{"line_number":278,"context_line":"    This also convert old db format to new db format."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"- A framework patch [4]_ and an implementation reference patch [5]_ exist to"},{"line_number":281,"context_line":"  verify the concept."},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7e882823","line":279,"updated":"2016-05-18 21:26:03.000000000","message":"it isn\u0027t clear to me, after reading the above, to know what already works in Ironic, and what needs to be coded to support the above.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":276,"context_line":"  * N+1 version of ironic-conductor will create N+1 version object instance"},{"line_number":277,"context_line":"    when get() and update attributes in N+1 version object when save()."},{"line_number":278,"context_line":"    This also convert old db format to new db format."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"- A framework patch [4]_ and an implementation reference patch [5]_ exist to"},{"line_number":281,"context_line":"  verify the concept."},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_14ea890f","line":279,"in_reply_to":"bab6814e_7e882823","updated":"2016-05-19 09:21:44.000000000","message":"Hmmm, move this section and let me add the real code change here.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":300,"context_line":"It is possible do the DB data migration at run time because N+1 version of"},{"line_number":301,"context_line":"ironic-conductor/ironic-api will convert old DB record to N+1 version and"},{"line_number":302,"context_line":"save/create object attributes in N+1 version too. Besides,"},{"line_number":303,"context_line":"a new DB command will run to guarantee old db columns are NULL."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"Notable differences from Nova"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_1ed91c22","line":303,"updated":"2016-05-18 21:26:03.000000000","message":"I don\u0027t understand this. I looked at the description of the concept of this, and I don\u0027t understand the concept either. In the concept part (line 120 above) it mentions running a background process. Is that what this is describing?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":300,"context_line":"It is possible do the DB data migration at run time because N+1 version of"},{"line_number":301,"context_line":"ironic-conductor/ironic-api will convert old DB record to N+1 version and"},{"line_number":302,"context_line":"save/create object attributes in N+1 version too. Besides,"},{"line_number":303,"context_line":"a new DB command will run to guarantee old db columns are NULL."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"Notable differences from Nova"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_1461e939","line":303,"in_reply_to":"bab6814e_1ed91c22","updated":"2016-05-19 09:21:44.000000000","message":"Use previous example again from node.extra to node.fake, node A is saved with old object version(node.extra) before upgrade. After finish the rolling upgrade, and if users updated node A like name, ironic conductor instantiate a node object from a old DB record but convert it to new object version(node.extra-\u003enode.fake) and saved, the DB record will changed. This is what I mean about online data migration using objects.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"Notable differences from Nova"},{"line_number":307,"context_line":"-----------------------------"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"As discussed in [3]_, it is okay for ironic-api to directly access the DB."},{"line_number":310,"context_line":"There is no need to use ``@remotable`` on objects in Ironic. This is different"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_6a4a2285","line":307,"updated":"2016-05-18 23:28:59.000000000","message":"Not sure this is needed? I\u0027m not opposed to it being here but I found it more confusing than enlightening; but my OpenStack context is almost entirely Ironic.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"Notable differences from Nova"},{"line_number":307,"context_line":"-----------------------------"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"As discussed in [3]_, it is okay for ironic-api to directly access the DB."},{"line_number":310,"context_line":"There is no need to use ``@remotable`` on objects in Ironic. This is different"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_f4ca6519","line":307,"in_reply_to":"bab6814e_6a4a2285","updated":"2016-05-19 09:21:44.000000000","message":"OK, let\u0027s move it to doc. It\u0027s not about the code change.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":322,"context_line":"------------"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"Build a new cloud along side the old one, but this is"},{"line_number":325,"context_line":"not a good choice for many reasons."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"Users can also choose to create new ironic-api services. After upgrading all"},{"line_number":328,"context_line":"conductors, start new ironic-api services and then switch from old ironic-api"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_ea5e1244","line":325,"updated":"2016-05-18 23:28:59.000000000","message":"I disagree this is an alternative; you can\u0027t abandon all those deployed instances :(. Maybe put a comment that a cold upgrade  is an alternative?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":322,"context_line":"------------"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"Build a new cloud along side the old one, but this is"},{"line_number":325,"context_line":"not a good choice for many reasons."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"Users can also choose to create new ironic-api services. After upgrading all"},{"line_number":328,"context_line":"conductors, start new ironic-api services and then switch from old ironic-api"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_8400fa02","line":325,"in_reply_to":"bab6814e_5d8c357f","updated":"2016-05-19 13:06:53.000000000","message":"++ to mention cold upgrades","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":322,"context_line":"------------"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"Build a new cloud along side the old one, but this is"},{"line_number":325,"context_line":"not a good choice for many reasons."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"Users can also choose to create new ironic-api services. After upgrading all"},{"line_number":328,"context_line":"conductors, start new ironic-api services and then switch from old ironic-api"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_5d8c357f","line":325,"in_reply_to":"bab6814e_ea5e1244","updated":"2016-05-19 09:21:44.000000000","message":"hmm, OK. Use cold upgrade makes more sense.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":331,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":332,"context_line":"switching and it is not a complete in-place strategy."},{"line_number":333,"context_line":"In this scenario, the object version will remain pinned until the switch"},{"line_number":334,"context_line":"of ironic-api services is done."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Data model impact"},{"line_number":337,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7e2b08ec","line":334,"updated":"2016-05-18 21:26:03.000000000","message":"I don\u0027t see how having new ironic-api services will help. Is the upgrading of conductors a rolling upgrade still? (I\u0027m not sure what you are trying to describe as an alternative.)","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":331,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":332,"context_line":"switching and it is not a complete in-place strategy."},{"line_number":333,"context_line":"In this scenario, the object version will remain pinned until the switch"},{"line_number":334,"context_line":"of ironic-api services is done."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Data model impact"},{"line_number":337,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_fab40ff3","line":334,"in_reply_to":"bab6814e_0a56f628","updated":"2016-05-19 09:21:44.000000000","message":"This is still rolling upgrade if we support upgrade ironic-conductors one by one.\n\nWith this alternative, we can get ride of RPC version pinning and only focus on object version pinning. In current scenario of rolling upgrade, because we upgrade conductor first, so there is not necessary to keep the compatible of new version RPC Clint(API) to old version RPC server(conductor). \n\nThen the purpose of RPC version pinning is to make new/old RPC client (API) send a consistency request to RPC server(conductor). So we can simply switch to new APIs to send same RPC requests.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c545b5823de948d4061f2277fd47e640cf78d30f","unresolved":false,"context_lines":[{"line_number":331,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":332,"context_line":"switching and it is not a complete in-place strategy."},{"line_number":333,"context_line":"In this scenario, the object version will remain pinned until the switch"},{"line_number":334,"context_line":"of ironic-api services is done."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Data model impact"},{"line_number":337,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_9ab2ed04","line":334,"in_reply_to":"bab6814e_1fe2889f","updated":"2016-05-20 02:19:17.000000000","message":"Yes, that\u0027s why I put it as an alternative.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"cf891f254644006d703bca2f1f6100d323a62dbf","unresolved":false,"context_lines":[{"line_number":331,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":332,"context_line":"switching and it is not a complete in-place strategy."},{"line_number":333,"context_line":"In this scenario, the object version will remain pinned until the switch"},{"line_number":334,"context_line":"of ironic-api services is done."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Data model impact"},{"line_number":337,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_0a56f628","line":334,"in_reply_to":"bab6814e_7e2b08ec","updated":"2016-05-18 23:28:59.000000000","message":"Agreed, this isn\u0027t really an alternative either. I\u0027m not sure having this is valuable in the spec.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":331,"context_line":"are latest version. But on the other hand, there is a short downtime for"},{"line_number":332,"context_line":"switching and it is not a complete in-place strategy."},{"line_number":333,"context_line":"In this scenario, the object version will remain pinned until the switch"},{"line_number":334,"context_line":"of ironic-api services is done."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Data model impact"},{"line_number":337,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_1fe2889f","line":334,"in_reply_to":"bab6814e_fab40ff3","updated":"2016-05-19 16:46:53.000000000","message":"Ok, it wasn\u0027t clear from the description, that this is what you meant. So this is pinning, rolling upgrade of ironic-conductor, switch to new ironic-api services, followed by unpinning.\n\nI guess the only reason to go this route is if the mechanism of rpc pinning was complicated/prone to error. Otherwise, given that this requires separate ironic-api services, a load balancer, and some (short) downtime, it doesn\u0027t seem worth it. (Which is why it is an alternative I guess).","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":339,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":340,"context_line":"accepted. Change action is not supported any more. Drop action is"},{"line_number":341,"context_line":"conditionally accpeted because the deprecate columns in this release can"},{"line_number":342,"context_line":"only be dropped in next release or later."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"State Machine Impact"},{"line_number":345,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_de231404","line":342,"updated":"2016-05-18 21:26:03.000000000","message":"This seems to be a copy of text above at line 167 that I didn\u0027t understand :-(","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":339,"context_line":"A strict DB schema upgrade strategy should follow. Additional action is"},{"line_number":340,"context_line":"accepted. Change action is not supported any more. Drop action is"},{"line_number":341,"context_line":"conditionally accpeted because the deprecate columns in this release can"},{"line_number":342,"context_line":"only be dropped in next release or later."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"State Machine Impact"},{"line_number":345,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_badd6716","line":342,"in_reply_to":"bab6814e_de231404","updated":"2016-05-19 09:21:44.000000000","message":"Reply above","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":378,"context_line":"is no need to change the Nova driver. But since there is a potential change on"},{"line_number":379,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":380,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":381,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services and"},{"line_number":382,"context_line":"we can upgrade Ironic and Nova seperately."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_9e5fcc71","line":379,"updated":"2016-05-18 21:26:03.000000000","message":"I don\u0027t understand the rest of this. Nova communicates with ironic via a micro version so the \u0027api compatibility stuff doesn\u0027t make sense to me.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":378,"context_line":"is no need to change the Nova driver. But since there is a potential change on"},{"line_number":379,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":380,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":381,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services and"},{"line_number":382,"context_line":"we can upgrade Ironic and Nova seperately."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_ba9567e5","line":379,"in_reply_to":"bab6814e_9e5fcc71","updated":"2016-05-19 09:21:44.000000000","message":"My idea is admin would keep use the same micro version before and after rolling upgrade of Ironic. If they want to use new micro version, then they should upgrade Nova too. But at least, if admin call ironic using 1.16, there should be no change of the return value after upgrade.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":376,"context_line":""},{"line_number":377,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":378,"context_line":"is no need to change the Nova driver. But since there is a potential change on"},{"line_number":379,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":380,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":381,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services and"},{"line_number":382,"context_line":"we can upgrade Ironic and Nova seperately."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_df080030","line":379,"in_reply_to":"bab6814e_ba9567e5","updated":"2016-05-19 16:46:53.000000000","message":"I think it is fine to just keep the first sentence, and mention that the nova-ironic-driver talks to ironic using a specific micro version that will still be supported in the new version, so everything will work fine and nothing needs to be changed.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d68a5bc158fcafffc4ce98c4d8eebd4adb4f8826","unresolved":false,"context_lines":[{"line_number":379,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":380,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":381,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services and"},{"line_number":382,"context_line":"we can upgrade Ironic and Nova seperately."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Security impact"},{"line_number":385,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_24bb0e10","line":382,"updated":"2016-05-19 13:06:53.000000000","message":"Here we are implying that Ironic should always be updated before nova right? Since nova does pin in a specific version of the Ironic API and updating nova first may cause it to pin to a non-existing version of the ironic API.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":379,"context_line":"REST or Driver APIs along with new version of Ironic, so users should read the"},{"line_number":380,"context_line":"release notes carefully and upgrade Nova too. But because Ironic should keep"},{"line_number":381,"context_line":"API compatibility, the upgrade of Ironic won\u0027t break the Nova services and"},{"line_number":382,"context_line":"we can upgrade Ironic and Nova seperately."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"Security impact"},{"line_number":385,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_1abbb60f","line":382,"in_reply_to":"bab6814e_24bb0e10","updated":"2016-05-19 16:46:53.000000000","message":"It is mentioned (the order) in the Problem Description above, but it is worth mentioning explicitly here and maybe elsewhere?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2a5c52dc28f1c48787e6e59ffbfbcfcddbd6a27","unresolved":false,"context_lines":[{"line_number":399,"context_line":"Performance Impact"},{"line_number":400,"context_line":"------------------"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"During the upgrade process, the online data migration will have an extra burden"},{"line_number":403,"context_line":"to migrate the DB data. But this is better than have a longer downtime."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_19e5b636","line":402,"updated":"2016-05-18 21:31:17.000000000","message":"what does \u0027extra burden\u0027 mean? when does online data migration happen and how does that affect the performance of whatever?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":399,"context_line":"Performance Impact"},{"line_number":400,"context_line":"------------------"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"During the upgrade process, the online data migration will have an extra burden"},{"line_number":403,"context_line":"to migrate the DB data. But this is better than have a longer downtime."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_ba4a8781","line":402,"in_reply_to":"bab6814e_19e5b636","updated":"2016-05-19 09:21:44.000000000","message":"As I mention above, there is extra convert code for online data migration using object, so there will be extra burden.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c545b5823de948d4061f2277fd47e640cf78d30f","unresolved":false,"context_lines":[{"line_number":399,"context_line":"Performance Impact"},{"line_number":400,"context_line":"------------------"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"During the upgrade process, the online data migration will have an extra burden"},{"line_number":403,"context_line":"to migrate the DB data. But this is better than have a longer downtime."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_bad091f7","line":402,"in_reply_to":"bab6814e_5a625eae","updated":"2016-05-20 02:19:17.000000000","message":"Because there are more codes to run, it should be some impact but not much.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":399,"context_line":"Performance Impact"},{"line_number":400,"context_line":"------------------"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"During the upgrade process, the online data migration will have an extra burden"},{"line_number":403,"context_line":"to migrate the DB data. But this is better than have a longer downtime."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"Other deployer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_5a625eae","line":402,"in_reply_to":"bab6814e_ba4a8781","updated":"2016-05-19 16:46:53.000000000","message":"How does that affect performance? Something will be slower?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"591e5f7a644e0b769f5496de1738744a45c3e7c1","unresolved":false,"context_lines":[{"line_number":409,"context_line":"ironic-conductor services will use the latest versions for RPC and Objects."},{"line_number":410,"context_line":"Its value will be a release, named (eg \u0027newton\u0027) or sem-versioned (eg \u00275.2\u0027)."},{"line_number":411,"context_line":"The services will use the RPC and Object versions associated with the"},{"line_number":412,"context_line":"specified release."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"A new DB command ``online_data_migration`` will be added to manually trigger"},{"line_number":415,"context_line":"the online data migration."}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_7ebca86c","line":412,"updated":"2016-05-18 21:26:03.000000000","message":"OH. I copied from here and put this information above at line 180 so this should be replaced with a pointer to line 180.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2a5c52dc28f1c48787e6e59ffbfbcfcddbd6a27","unresolved":false,"context_lines":[{"line_number":411,"context_line":"The services will use the RPC and Object versions associated with the"},{"line_number":412,"context_line":"specified release."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"A new DB command ``online_data_migration`` will be added to manually trigger"},{"line_number":415,"context_line":"the online data migration."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_b96e2ac7","line":414,"updated":"2016-05-18 21:31:17.000000000","message":"could you add more information about this command? When might someone use it?","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":411,"context_line":"The services will use the RPC and Object versions associated with the"},{"line_number":412,"context_line":"specified release."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"A new DB command ``online_data_migration`` will be added to manually trigger"},{"line_number":415,"context_line":"the online data migration."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_bd4d6174","line":414,"in_reply_to":"bab6814e_b96e2ac7","updated":"2016-05-19 09:21:44.000000000","message":"for example, online data migration using object only happens if user access nodes. But if node B was not touched at all. It didn\u0027t get a chance to do data migration. So the new ironic-dbsync command \u0027online_data_migration\u0027 need to be manually trigger.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":411,"context_line":"The services will use the RPC and Object versions associated with the"},{"line_number":412,"context_line":"specified release."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"A new DB command ``online_data_migration`` will be added to manually trigger"},{"line_number":415,"context_line":"the online data migration."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_b5a6fb0d","line":414,"in_reply_to":"bab6814e_bd4d6174","updated":"2016-05-19 16:46:53.000000000","message":"I think somewhere above, we need to describe this. I took a look at the existing documentation for ironic-dbsync [1]. I guess ironic-dbsync is a \u0027utility\u0027 so online_data_migration is a command of ironic-dbsync. (Not sure where that terminology came from but I guess we should stick with it.)\n\n[1] http://docs.openstack.org/developer/ironic/cmds/ironic-dbsync.html","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":421,"context_line":"mechanisms. This will include:"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":424,"context_line":"  with the associated RPC and Object versions"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"Implementation"},{"line_number":427,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_52426911","line":424,"updated":"2016-05-19 09:21:44.000000000","message":"For example, objects_mapping is\n{mitaka：{\u0027Node\u0027:\u00271.14\u0027, \u0027Conductor\u0027: \u00271.1\u0027,\u0027Chassis\u0027: \u00271.3\u0027,\u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027}} and\nrpc_maaping is\n{\u0027mitaka\u0027: \u00271.33\u0027}","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":421,"context_line":"mechanisms. This will include:"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":424,"context_line":"  with the associated RPC and Object versions"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"Implementation"},{"line_number":427,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_35e96b15","line":424,"in_reply_to":"bab6814e_52426911","updated":"2016-05-19 16:46:53.000000000","message":"would be good to put this information (the object mapping) above where rpc/object versions are mentioned.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2a5c52dc28f1c48787e6e59ffbfbcfcddbd6a27","unresolved":false,"context_lines":[{"line_number":422,"context_line":""},{"line_number":423,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":424,"context_line":"  with the associated RPC and Object versions"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"Implementation"},{"line_number":427,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_d9acceef","line":425,"updated":"2016-05-18 21:31:17.000000000","message":"Tan, if you know of other things, it would be good to list them here. I think that gives people an idea of what is involved with maintaining this in the future.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"94acc06aa99515d26173d6b437c51cf9cc68e65d","unresolved":false,"context_lines":[{"line_number":422,"context_line":""},{"line_number":423,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":424,"context_line":"  with the associated RPC and Object versions"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"Implementation"},{"line_number":427,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_f5e883e4","line":425,"in_reply_to":"bab6814e_92b17192","updated":"2016-05-19 16:46:53.000000000","message":"You had already added documentation about live upgrades [1]. Is this stuff covered in that documentation already? If so, we can just link to that from here. (and/or enhance the documentation with what you have here).\n\n[1] http://docs.openstack.org/developer/ironic/dev/code-contribution-guide.html#live-upgrade-related-concerns","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"eea60add4ad94d6ebe81e71ff718bd35607d2189","unresolved":false,"context_lines":[{"line_number":422,"context_line":""},{"line_number":423,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":424,"context_line":"  with the associated RPC and Object versions"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"Implementation"},{"line_number":427,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bab6814e_92b17192","line":425,"in_reply_to":"bab6814e_d9acceef","updated":"2016-05-19 09:21:44.000000000","message":"1. Any change to existing RPC API, on client side(ironic-API), the request needs to be created to work with a previous version that is supported like below:\n\ndef do_node_deploy(self, context, node_id, rebuild, configdrive, topic\u003dNone, fake_para\u003dNone):\n  kw \u003d {\u0027fake_para\u0027: fake_para}\n  version \u003d \u00271.34\u0027\n  if not self.client.can_send_version(version):\n     del kw[\u0027fake_para\u0027]\n     version \u003d \u00271.22\u0027 \n  cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003dversion)\n  return cctxt.call(context, \u0027do_node_deploy\u0027, node_id\u003dnode_id, rebuild\u003drebuild, configdrive\u003dconfigdrive, **kw)\n\nOn the server side(ironic-conductor), it should tolerate the older version of requests.\n\n2. Any change to bump object fields, objects should implement their own _fields_make_compatible() to remove/alter attributes which was added/changed after the target version like below:\n\ndef _fields_make_compatible(self, values, target_version, db\u003dFalse):\n  if \u0027configdrive\u0027 in values:\n      if target_version \u003c (1, 15):\n         del values[\u0027configdrive\u0027]\n\n3. Object should be able to read FromVer db record and convert it to ToVer model data in _from_db_object() to instantiate ToVer object.","commit_id":"5ff6a43ab1bf42e62b64537a0235c8207d822ac1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"A rolling upgrade would provide a better experience for the users and operators"},{"line_number":53,"context_line":"of the cloud. In the context of Ironic\u0027s rolling upgrade, it means it wouldn\u0027t"},{"line_number":54,"context_line":"be necessary to upgrade (and restart) all the ironic-api and ironic-conductor"},{"line_number":55,"context_line":"services simultaneously as in a cold upgrade. A rolling upgrade would allow"},{"line_number":56,"context_line":"individual ironic-api and ironic-conductor services to be upgraded one at a"},{"line_number":57,"context_line":"time, with the rest of the services still available. This upgrade would have"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_2df95f4e","line":54,"range":{"start_line":54,"start_character":16,"end_line":54,"end_character":37},"updated":"2016-05-24 16:19:21.000000000","message":"There\u0027s an important distinction between a quick restart and a stop..upgrade..start operation. Being able to restart some of the api and conductor nodes separate from all of them is more complicated and I would recommend shooting for that ability longer term.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_0d0c5b41","line":62,"updated":"2016-05-24 16:19:21.000000000","message":"The important thing to note is that we got to where we are through incremental changes, and I would certainly recommend trying to do a similar breakdown of incremental functionality.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after Nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_88ddc472","line":62,"in_reply_to":"bab6814e_0d0c5b41","updated":"2016-05-25 03:38:13.000000000","message":"+1","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":67,"context_line":"In order to support rolling upgrade for Ironic, there will be some codes"},{"line_number":68,"context_line":"changes, a contributing guide for developers to prevent breaking the"},{"line_number":69,"context_line":"mechanism of rolling upgrade and a rolling upgrade operation guide for users."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"This section will describe the rolling upgrade process first to give a whole"},{"line_number":72,"context_line":"picture and then introduce the changes needed to support it."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_589f3f5f","line":69,"updated":"2016-05-24 16:19:21.000000000","message":"Automating test coverage for the actual upgrade is going to be the most important thing you do, educating developers comes just after that :)","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":67,"context_line":"In order to support rolling upgrade for Ironic, there will be some codes"},{"line_number":68,"context_line":"changes, a contributing guide for developers to prevent breaking the"},{"line_number":69,"context_line":"mechanism of rolling upgrade and a rolling upgrade operation guide for users."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"This section will describe the rolling upgrade process first to give a whole"},{"line_number":72,"context_line":"picture and then introduce the changes needed to support it."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_48411c0b","line":69,"in_reply_to":"bab6814e_589f3f5f","updated":"2016-05-25 03:38:13.000000000","message":"Yes, there will be a multi-node grenade CI to do this.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"deprecated *and* removed between two named releases."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"* named release N to N+1. This is the typical usage when upgrading"},{"line_number":90,"context_line":"  an OpenStack cloud. (N starts with Newton or whenever we get"},{"line_number":91,"context_line":"  rolling upgrades to work.)"},{"line_number":92,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":93,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.3, a rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_39b348eb","line":90,"range":{"start_line":90,"start_character":23,"end_line":90,"end_character":43},"updated":"2016-05-25 03:38:13.000000000","message":"This didn\u0027t has to be Newton, N can be Mitaka if we make rolling upgrade in Newton. Because old services didn\u0027t have to aware the upgrade code, it only behavior like normal.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"60befdde2d1ff95dbcdc2b5e7bb07ce0d63562c4","unresolved":false,"context_lines":[{"line_number":119,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file"},{"line_number":120,"context_line":"      without restart, the support of SIGHUP signal handling is provided"},{"line_number":121,"context_line":"      by oslo.service but there will be some effort to make it fit Ironic"},{"line_number":122,"context_line":"      case, which will be discussed in its own spec."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_229d6cbc","line":122,"updated":"2016-05-20 20:12:35.000000000","message":"Can we reference an RFE for this?","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"13dd7a7d39e2b9d7acfa4fa3eb58fdeb3301a4be","unresolved":false,"context_lines":[{"line_number":119,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file"},{"line_number":120,"context_line":"      without restart, the support of SIGHUP signal handling is provided"},{"line_number":121,"context_line":"      by oslo.service but there will be some effort to make it fit Ironic"},{"line_number":122,"context_line":"      case, which will be discussed in its own spec."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_fe91c353","line":122,"in_reply_to":"bab6814e_229d6cbc","updated":"2016-05-24 14:48:24.000000000","message":"++\n\nAlso, based on my local tests nova does not seem to support SIGHUP either (n-api and n-cpu), any idea how do they support rolling upgrades without it ?","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":119,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file"},{"line_number":120,"context_line":"      without restart, the support of SIGHUP signal handling is provided"},{"line_number":121,"context_line":"      by oslo.service but there will be some effort to make it fit Ironic"},{"line_number":122,"context_line":"      case, which will be discussed in its own spec."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_48263c69","line":122,"in_reply_to":"bab6814e_387ebbae","updated":"2016-05-25 03:38:13.000000000","message":"I prefer to get rid of SIGHUP thing in this spec but ask user restart service at the moment. Let\u0027s do it incremental","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":119,"context_line":"   #. SIGHUP\u0027ing the services so that they reload the configuration file"},{"line_number":120,"context_line":"      without restart, the support of SIGHUP signal handling is provided"},{"line_number":121,"context_line":"      by oslo.service but there will be some effort to make it fit Ironic"},{"line_number":122,"context_line":"      case, which will be discussed in its own spec."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_387ebbae","line":122,"in_reply_to":"bab6814e_fe91c353","updated":"2016-05-24 16:19:21.000000000","message":"We don\u0027t reload pins or any other config elements on SIGHUP right now. Oslo recently started supporting this, so we could, but in general people seem more than happy to just pick up the changes with service restarts. Once everything is new, you can go along and blip each service to the newer RPC versions without having to do it atomically or anything like that.\n\nFurther, we don\u0027t have object pins, we have automatic backporting via the conductor. So, when control services are upgraded, we are faulting a lot of objects back to conductor for backporting, but as things get upgraded this just stops happening until we reach steady-state. If you don\u0027t do this, you will just need to refresh the pins either with a SIGHUP or service restart.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"60befdde2d1ff95dbcdc2b5e7bb07ce0d63562c4","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":126,"context_line":"   The desgin of the new command will be discussed in its own spec."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_c2e2a02e","line":126,"updated":"2016-05-20 20:12:35.000000000","message":"nit: design\n\nnot-nit: If we have a dependent spec/RFE, we should cite it here.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"fa1a5d7fd782c543c4fdf3b9907c10a4be91d484","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":125,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":126,"context_line":"   The desgin of the new command will be discussed in its own spec."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_04a2db98","line":126,"in_reply_to":"bab6814e_c2e2a02e","updated":"2016-05-23 02:24:12.000000000","message":"OK, Let me create the RFE first and then cite here.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":142,"context_line":"* Adding new items to the DB is supported."},{"line_number":143,"context_line":"* Dropping columns is conditionally supported."},{"line_number":144,"context_line":"  Only columns and tables had been deprecated prior to ``FromVer``"},{"line_number":145,"context_line":"  can be dropped."},{"line_number":146,"context_line":"* alert columns is not supported anymore."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_7386a466","line":145,"updated":"2016-05-24 16:19:21.000000000","message":"I\u0027m not sure how this affects you with alembic, but for us, we can\u0027t drop a column until it has been _removed_ from N-1. That means that we had to deprecate it in N-2 and move all the data to the new location. In N-1 we drop it from the SQLAlchemy model and then we can drop it in N. This is because the model will query for all columns by name, so if it\u0027s in the model, we ask for it and fail if it has been dropped.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":142,"context_line":"* Adding new items to the DB is supported."},{"line_number":143,"context_line":"* Dropping columns is conditionally supported."},{"line_number":144,"context_line":"  Only columns and tables had been deprecated prior to ``FromVer``"},{"line_number":145,"context_line":"  can be dropped."},{"line_number":146,"context_line":"* alert columns is not supported anymore."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_88e78411","line":145,"in_reply_to":"bab6814e_7386a466","updated":"2016-05-25 03:38:13.000000000","message":"Oh, yes, you are right. If we add the alembic script in N-1, it is running during the upgrade from N-1 to N, and the old service in N-1 version will have an issue.\nSo I would say above DB migration policy is the SQLAlchemy model change policy. The alembic script for drop can only be done in the N Name release, where the field was removed from all services\u0027 SQLAlchemy model.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"60befdde2d1ff95dbcdc2b5e7bb07ce0d63562c4","unresolved":false,"context_lines":[{"line_number":143,"context_line":"* Dropping columns is conditionally supported."},{"line_number":144,"context_line":"  Only columns and tables had been deprecated prior to ``FromVer``"},{"line_number":145,"context_line":"  can be dropped."},{"line_number":146,"context_line":"* alert columns is not supported anymore."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"RPC and object version pinning"},{"line_number":149,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_8267f8e7","line":146,"updated":"2016-05-20 20:12:35.000000000","message":"What does \"alert columns\" refer to?","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"fa1a5d7fd782c543c4fdf3b9907c10a4be91d484","unresolved":false,"context_lines":[{"line_number":143,"context_line":"* Dropping columns is conditionally supported."},{"line_number":144,"context_line":"  Only columns and tables had been deprecated prior to ``FromVer``"},{"line_number":145,"context_line":"  can be dropped."},{"line_number":146,"context_line":"* alert columns is not supported anymore."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"RPC and object version pinning"},{"line_number":149,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_043e5b27","line":146,"in_reply_to":"bab6814e_8267f8e7","updated":"2016-05-23 02:24:12.000000000","message":"alter_column is used in alembic to change the column like resizing column length or rename, this will lock DB","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"60befdde2d1ff95dbcdc2b5e7bb07ce0d63562c4","unresolved":false,"context_lines":[{"line_number":266,"context_line":"------------------"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":269,"context_line":"is no need to change the Nova driver. As Irnoic is suggested to upgrade before"},{"line_number":270,"context_line":"Nova and Nova calling ironic using a specific micro version that will still be"},{"line_number":271,"context_line":"supported in the new version, so everything will work fine and nothing needs"},{"line_number":272,"context_line":"to be changed."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_4212300a","line":269,"updated":"2016-05-20 20:12:35.000000000","message":"nit: s/Irnoic/ironic/g\n\n(Per OpenStack doc guidelines, openstack services names (such as ironic and nova) should not be capitalized. This problem is minor and exists throughout the spec.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"fa1a5d7fd782c543c4fdf3b9907c10a4be91d484","unresolved":false,"context_lines":[{"line_number":266,"context_line":"------------------"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":269,"context_line":"is no need to change the Nova driver. As Irnoic is suggested to upgrade before"},{"line_number":270,"context_line":"Nova and Nova calling ironic using a specific micro version that will still be"},{"line_number":271,"context_line":"supported in the new version, so everything will work fine and nothing needs"},{"line_number":272,"context_line":"to be changed."}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_84188bd4","line":269,"in_reply_to":"bab6814e_4212300a","updated":"2016-05-23 02:24:12.000000000","message":"Thanks to tell me that, I will update in next patch set.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"13dd7a7d39e2b9d7acfa4fa3eb58fdeb3301a4be","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Need the integration of grenade with Ironic for testing and have testing"},{"line_number":337,"context_line":"of cold upgrades [9]_."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Testing"},{"line_number":340,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_9eb997ef","line":338,"updated":"2016-05-24 14:48:24.000000000","message":"* SIGHUP support on Ironic services","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"498b7325132b6ac24181c5b455368408700282f9","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Need the integration of grenade with Ironic for testing and have testing"},{"line_number":337,"context_line":"of cold upgrades [9]_."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Testing"},{"line_number":340,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_d325d05c","line":338,"in_reply_to":"bab6814e_9eb997ef","updated":"2016-05-24 16:19:21.000000000","message":"Note that oslo.service supports the actual SIGHUP and callback behavior automatically for you, you just have to implement the handler to do what you want when the signal is received.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a65cdaf1a02301fef845e9a84940863efbfdb8c5","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"Need the integration of grenade with Ironic for testing and have testing"},{"line_number":337,"context_line":"of cold upgrades [9]_."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Testing"},{"line_number":340,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"bab6814e_c89fcc5d","line":338,"in_reply_to":"bab6814e_d325d05c","updated":"2016-05-25 03:38:13.000000000","message":"Yes, that\u0027s what I plan to do in another spec to fit ironic case.","commit_id":"b65d932f26d8424678ac82565de7973ef62fcbe9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":104,"context_line":"   This is supported by ironic but with a new DB migration policy, which"},{"line_number":105,"context_line":"   is described below in \"New DB model change policy\"."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"#. Pin RPC and Object versions to ``FromVer`` for all services via"},{"line_number":108,"context_line":"   the new configuration option described below in \"RPC and object version"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_faeb39da","line":105,"updated":"2016-05-26 01:44:13.000000000","message":"Do you mean that ironic already has the code to support this, so no changes are required. We just need to make sure we stick to this policy?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":104,"context_line":"   This is supported by ironic but with a new DB migration policy, which"},{"line_number":105,"context_line":"   is described below in \"New DB model change policy\"."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"#. Pin RPC and Object versions to ``FromVer`` for all services via"},{"line_number":108,"context_line":"   the new configuration option described below in \"RPC and object version"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_96464179","line":105,"in_reply_to":"bab6814e_faeb39da","updated":"2016-05-26 03:38:02.000000000","message":"Yes, this is what I mean","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":116,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":117,"context_line":"   option described below in \"RPC and object version pinning\" and restart"},{"line_number":118,"context_line":"   services."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":121,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_1ac6fd67","line":118,"updated":"2016-05-26 01:44:13.000000000","message":"Does the order of the services matter? Restart conductors first, then api?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":115,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":116,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":117,"context_line":"   option described below in \"RPC and object version pinning\" and restart"},{"line_number":118,"context_line":"   services."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":121,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_f16eb72d","line":118,"in_reply_to":"bab6814e_1ac6fd67","updated":"2016-05-26 03:38:02.000000000","message":"It didn\u0027t really matter. But suggest to restart conductors first then api like above.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":121,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":122,"context_line":"   The desgin of the new command will be discussed in its own RFE [12]_."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_1a9d5d66","line":122,"updated":"2016-05-26 01:44:13.000000000","message":"Could this be done before unpinning the RPC/object versions, since this is a separate script/command?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":121,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":122,"context_line":"   The desgin of the new command will be discussed in its own RFE [12]_."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_362dd5a8","line":122,"in_reply_to":"bab6814e_1a9d5d66","updated":"2016-05-26 03:38:02.000000000","message":"No, it won\u0027t work. This can only works after unpinning.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":155,"context_line":"ironic services. With this configuration option, a service will be able"},{"line_number":156,"context_line":"to properly handle the communication between different versions of services."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"The new configuration option is: ``[DEFAULT]/target_service_version``."},{"line_number":159,"context_line":"The default value of empty indicates that ironic-api and ironic-conductor"},{"line_number":160,"context_line":"will use the latest versions of RPC and Objects. Its possible values are"},{"line_number":161,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_c0112354","line":158,"updated":"2016-05-26 01:44:13.000000000","message":"I wonder if it would be useful to have \u0027pin\u0027 in the name of the config. \u0027pin_to_version\u0027 ? I think \u0027version\u0027 is overloaded; we use it for the api microVersion, we use it for the rpc Version, we use it for Objects Version, we use it for release Version. Maybe \u0027release_version\u0027, \u0027release_version_pin\u0027? \u0027pin_release_version\u0027? (I\u0027ll think about it some more.)","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":155,"context_line":"ironic services. With this configuration option, a service will be able"},{"line_number":156,"context_line":"to properly handle the communication between different versions of services."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"The new configuration option is: ``[DEFAULT]/target_service_version``."},{"line_number":159,"context_line":"The default value of empty indicates that ironic-api and ironic-conductor"},{"line_number":160,"context_line":"will use the latest versions of RPC and Objects. Its possible values are"},{"line_number":161,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_f1f99781","line":158,"in_reply_to":"bab6814e_c0112354","updated":"2016-05-26 03:38:02.000000000","message":"Hmmm, thanks for this.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                               \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027,"},{"line_number":168,"context_line":"                               \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"* rpc_mapping: {\u0027mitaka\u0027: \u00271.33\u0027}"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Don\u0027t save values to new columns with pinning"},{"line_number":173,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_602797b6","line":170,"updated":"2016-05-26 01:44:13.000000000","message":"maybe an example with sem-version too.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                               \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027,"},{"line_number":168,"context_line":"                               \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"* rpc_mapping: {\u0027mitaka\u0027: \u00271.33\u0027}"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Don\u0027t save values to new columns with pinning"},{"line_number":173,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_d1cf3354","line":170,"in_reply_to":"bab6814e_602797b6","updated":"2016-05-26 03:38:02.000000000","message":"Will add this.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"field ``nova.fake`` and deprecate ``node.extra``:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"* Instanitate services\u0027 version objects"},{"line_number":186,"context_line":"  Each object class should implement its own _from_db_object() to instantiate"},{"line_number":187,"context_line":"  its own version objects from DB data. In this case, ``ToVer`` will"},{"line_number":188,"context_line":"  instantiate a \u00271.15\u0027 version Node object by reading the value of node[`fake`]"},{"line_number":189,"context_line":"  from db_obj[\u0027extra\u0027] and set node.extra\u003dNone."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_805a7bf0","line":186,"updated":"2016-05-26 01:44:13.000000000","message":"is _from_db_object() a new method? It would be helpful to actually provide as much information as possible for new or changed methods, eg parameters, what it does, what class is it in.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":183,"context_line":"field ``nova.fake`` and deprecate ``node.extra``:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"* Instanitate services\u0027 version objects"},{"line_number":186,"context_line":"  Each object class should implement its own _from_db_object() to instantiate"},{"line_number":187,"context_line":"  its own version objects from DB data. In this case, ``ToVer`` will"},{"line_number":188,"context_line":"  instantiate a \u00271.15\u0027 version Node object by reading the value of node[`fake`]"},{"line_number":189,"context_line":"  from db_obj[\u0027extra\u0027] and set node.extra\u003dNone."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_71de4712","line":186,"in_reply_to":"bab6814e_805a7bf0","updated":"2016-05-26 03:38:02.000000000","message":"It\u0027s not a new method and it\u0027s in IronicObject Class.\nIt was used to read the DB data and instantiate object for each object.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":186,"context_line":"  Each object class should implement its own _from_db_object() to instantiate"},{"line_number":187,"context_line":"  its own version objects from DB data. In this case, ``ToVer`` will"},{"line_number":188,"context_line":"  instantiate a \u00271.15\u0027 version Node object by reading the value of node[`fake`]"},{"line_number":189,"context_line":"  from db_obj[\u0027extra\u0027] and set node.extra\u003dNone."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"* Get target version"},{"line_number":192,"context_line":"  Based on the pinning version, object instance will get a target version like"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_00504bd3","line":189,"updated":"2016-05-26 01:44:13.000000000","message":"I guess I am not clear on what/where the pinning comes into play. I thought that if it was pinned to FromVer, that the service running ToVer would still be using 1.14 version of Node object.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":186,"context_line":"  Each object class should implement its own _from_db_object() to instantiate"},{"line_number":187,"context_line":"  its own version objects from DB data. In this case, ``ToVer`` will"},{"line_number":188,"context_line":"  instantiate a \u00271.15\u0027 version Node object by reading the value of node[`fake`]"},{"line_number":189,"context_line":"  from db_obj[\u0027extra\u0027] and set node.extra\u003dNone."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"* Get target version"},{"line_number":192,"context_line":"  Based on the pinning version, object instance will get a target version like"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_d16613ec","line":189,"in_reply_to":"bab6814e_00504bd3","updated":"2016-05-26 03:38:02.000000000","message":"Good question. The Pin is to Pin the object data saved into DB. So ToVer will run 1.15 Node object but convert to 1.14 Node object fields when saving. ToVer code could access Node object new fields, so it\u0027s difficult to run a 1.14 Node object in ToVer.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"* Save correct values to DB"},{"line_number":205,"context_line":"  Each object class will call new method obj_get_db_compatiable_changes() in"},{"line_number":206,"context_line":"  create() and save() to save the correct values of DB."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Present the object instance as target version"},{"line_number":209,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_00eccbf1","line":206,"updated":"2016-05-26 01:44:13.000000000","message":"Remind me again, what does \u0027correct value\u0027 mean?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"* Save correct values to DB"},{"line_number":205,"context_line":"  Each object class will call new method obj_get_db_compatiable_changes() in"},{"line_number":206,"context_line":"  create() and save() to save the correct values of DB."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Present the object instance as target version"},{"line_number":209,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_118b7b69","line":206,"in_reply_to":"bab6814e_00eccbf1","updated":"2016-05-26 03:38:02.000000000","message":"For example, 1.15 Node object contain node.fake, but 1.14 didn\u0027t. So move the value of node.fake back to node.extra is like:\nnode.extra \u003d node.fake\nnode.fake\u003dNone\nThis is the correct value.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":210,"context_line":"During the rolling upgrade, API should return the same values to users no"},{"line_number":211,"context_line":"matter it is ``FromVer`` API or ``ToVer`` API. So there is a change"},{"line_number":212,"context_line":"to IronicObject.as_dict() to return target version of object instance to"},{"line_number":213,"context_line":"users."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_209d8f66","line":213,"updated":"2016-05-26 01:44:13.000000000","message":"To be more specific -- is it true that you want this behaviour when ironic is pinned to a particular release? Because it is not clear by \u0027rolling upgrade\u0027, which part of rolling upgrade this pertains to. Unless you mean the entire process as described above.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":210,"context_line":"During the rolling upgrade, API should return the same values to users no"},{"line_number":211,"context_line":"matter it is ``FromVer`` API or ``ToVer`` API. So there is a change"},{"line_number":212,"context_line":"to IronicObject.as_dict() to return target version of object instance to"},{"line_number":213,"context_line":"users."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_f1c5178e","line":213,"in_reply_to":"bab6814e_209d8f66","updated":"2016-05-26 03:38:02.000000000","message":"Yes, I mean, during the entire process, until unpinning, all API services should return the same values as \u0027FromVer\u0027 API","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_c0c80358","line":217,"updated":"2016-05-26 01:44:13.000000000","message":"so specifically you mean ironic.conductor.rpcapi.ConductorAPI.update_node(), etc?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_d1c29384","line":217,"in_reply_to":"bab6814e_c0c80358","updated":"2016-05-26 03:38:02.000000000","message":"Yes.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":221,"context_line":"on the target version."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_607af7f2","line":218,"updated":"2016-05-26 01:44:13.000000000","message":"I\u0027m not sure what you mean here. Do you mean that the methods will be called with object instances? Well, eg \n    def update_node(self, context, node_obj, topic\u003dNone)\nhas a node_obj parameter. Is that the object instance you are referring to?\n\nOh, is the above just describing what happens in the code now?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":215,"context_line":"Passing target version object instances via RPC"},{"line_number":216,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":221,"context_line":"on the target version."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_d149f332","line":218,"in_reply_to":"bab6814e_607af7f2","updated":"2016-05-26 03:38:02.000000000","message":"Yes, this is describe the current code. I should explain it clearer :(","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":221,"context_line":"on the target version."},{"line_number":222,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":223,"context_line":"So conductor should tolerate to accept old compatible objects."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_4066d351","line":220,"updated":"2016-05-26 01:44:13.000000000","message":"you mean after the unpinning? Or even with pinning, this could happen?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":217,"context_line":"For update_node(), update_port(), update_portgroup() RPC call, they will pass"},{"line_number":218,"context_line":"object instances and get an updated one via RPC."},{"line_number":219,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":220,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":221,"context_line":"on the target version."},{"line_number":222,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":223,"context_line":"So conductor should tolerate to accept old compatible objects."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_11153be4","line":220,"in_reply_to":"bab6814e_4066d351","updated":"2016-05-26 03:38:02.000000000","message":"It will happen With the pinning. Because ToVer Conductor will pass a \u00271.15\u0027 Node object.\nAfter unpinning, there is no more \u0027FromVer\u0027 API.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":226,"context_line":"Alternatives"},{"line_number":227,"context_line":"------------"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Cold upgrade will be the only option and it is time consuming."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"Data model impact"},{"line_number":232,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_c052c366","line":229,"updated":"2016-05-26 01:44:13.000000000","message":"It isn\u0027t just time consuming; there\u0027s going to be downtime of ironic services.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":226,"context_line":"Alternatives"},{"line_number":227,"context_line":"------------"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Cold upgrade will be the only option and it is time consuming."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"Data model impact"},{"line_number":232,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_91df6b39","line":229,"in_reply_to":"bab6814e_c052c366","updated":"2016-05-26 03:38:02.000000000","message":"Will add it","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":232,"context_line":"-----------------"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"A DB migration policy is adopted and introduced above in"},{"line_number":235,"context_line":"\u0027\u0027New DB model change policy\u0027\u0027."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"State Machine Impact"},{"line_number":238,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_a0ce9f2a","line":235,"updated":"2016-05-26 01:44:13.000000000","message":"Any idea how we are going to enforce this?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":232,"context_line":"-----------------"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"A DB migration policy is adopted and introduced above in"},{"line_number":235,"context_line":"\u0027\u0027New DB model change policy\u0027\u0027."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"State Machine Impact"},{"line_number":238,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_71bbe7e5","line":235,"in_reply_to":"bab6814e_a0ce9f2a","updated":"2016-05-26 03:38:02.000000000","message":"hmmm, a contributing guide and CI probably.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":253,"context_line":"RPC API impact"},{"line_number":254,"context_line":"--------------"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_20e3cfa5","line":256,"updated":"2016-05-26 01:44:13.000000000","message":"what is \u0027version_cap\u0027? is it a variable somewhere? Part of an object?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":253,"context_line":"RPC API impact"},{"line_number":254,"context_line":"--------------"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_f1cfd77c","line":256,"in_reply_to":"bab6814e_20e3cfa5","updated":"2016-05-26 03:38:02.000000000","message":"we have version_cap in conductor.rpcapi.py but didn\u0027t use it in a correct way. So will reuse it.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":255,"context_line":""},{"line_number":256,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"},{"line_number":260,"context_line":"IronicObjectIndirectionAPI."},{"line_number":261,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_20910ff2","line":258,"updated":"2016-05-26 01:44:13.000000000","message":"Is this something that needs to be done? The deletion of these methods?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":255,"context_line":""},{"line_number":256,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"},{"line_number":260,"context_line":"IronicObjectIndirectionAPI."},{"line_number":261,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_51a7c3bc","line":258,"in_reply_to":"bab6814e_20910ff2","updated":"2016-05-26 03:38:02.000000000","message":"Yes, remove them because the design is changed","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"},{"line_number":260,"context_line":"IronicObjectIndirectionAPI."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"Driver API impact"},{"line_number":263,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_c0ae432d","line":260,"updated":"2016-05-26 01:44:13.000000000","message":"This is a class, what does it mean to \"run\" a class/object?","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":257,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":258,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":259,"context_line":"because ironic-API should access DB directly, there is no need to run"},{"line_number":260,"context_line":"IronicObjectIndirectionAPI."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"Driver API impact"},{"line_number":263,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_71892726","line":260,"in_reply_to":"bab6814e_c0ae432d","updated":"2016-05-26 03:38:02.000000000","message":"Instantiate, I mean. In cmd/api.py, ironic-api instantiate an IronicObjectIndirectionAPI class","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":268,"context_line":"------------------"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":271,"context_line":"is no need to change the nova driver. As Irnoic is suggested to upgrade before"},{"line_number":272,"context_line":"nova and nova calling ironic using a specific micro version that will still be"},{"line_number":273,"context_line":"supported in the new version, so everything will work fine and nothing needs"},{"line_number":274,"context_line":"to be changed."}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_c075a3cb","line":271,"updated":"2016-05-26 01:44:13.000000000","message":"s/Irnoic/ironic/","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7eb6489fb68e12d03d5970379440042bb64cf8f","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"Need the integration of grenade with ironic for testing and have testing"},{"line_number":339,"context_line":"of cold upgrades [9]_."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"Testing"},{"line_number":342,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_20562f2a","line":340,"updated":"2016-05-26 01:44:13.000000000","message":"Also dependent on ironic-dbsync online-data-migration command.","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7691aad65401a2dbb8e37f698381e4820e9be152","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"Need the integration of grenade with ironic for testing and have testing"},{"line_number":339,"context_line":"of cold upgrades [9]_."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"Testing"},{"line_number":342,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"bab6814e_91848b0b","line":340,"in_reply_to":"bab6814e_20562f2a","updated":"2016-05-26 03:38:02.000000000","message":"Will add","commit_id":"af36d80cae58489d092a4a66b1adf14fb48b4ad3"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"55c739c8a3716b2a8f1940435a3a3056ed90f168","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to ``FromVer`` for all services, via"},{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_5ec59959","line":119,"range":{"start_line":119,"start_character":3,"end_line":119,"end_character":36},"updated":"2016-05-27 08:27:45.000000000","message":"Does it mean pin same version to both ironic-conductors and ironic-api? I read http://docs.openstack.org/openstack-ops/content/ops_upgrades_upgrade_levels.html and in case of nova, there seems some configs in upgrade_levels group like \"compute\" or \"conductor\".","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"9fc5b60bd7ffdedede03d7c4bd77b2daca89dfca","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to ``FromVer`` for all services, via"},{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_781d10bd","line":119,"range":{"start_line":119,"start_character":3,"end_line":119,"end_character":36},"in_reply_to":"9abb7d3a_5ec59959","updated":"2016-05-27 09:28:44.000000000","message":"Yes, it means the same version to both ironic-conductors and ironic-api. And we can set different flag with each one but I didn\u0027t see there is a strong reason to do that in case of ironic.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":135,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":136,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":137,"context_line":"   for this work)."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_9fdf3c0c","line":137,"range":{"start_line":136,"start_character":58,"end_line":137,"end_character":16},"updated":"2016-05-27 03:32:42.000000000","message":"It hard to say the new command is a dependency. Because the command will make use of the new feature implemented in this spec. But let\u0027s leave it.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0c6a9a606449e5d35c1ed4c2e7e3137b72f708bb","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":135,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":136,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":137,"context_line":"   for this work)."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_55403834","line":137,"range":{"start_line":136,"start_character":58,"end_line":137,"end_character":16},"in_reply_to":"9abb7d3a_150546bb","updated":"2016-05-31 19:01:43.000000000","message":"What if there are some nodes that don\u0027t get touched between two named releases? Eg, what if someone hasn\u0027t upgraded for years and are behind two named releases, so they want to do two rolling upgrades, one after the other within a week or so.\n\nIt would be helpful to know how this command works. Will it work in the background while the ironic services are running? While the command is running, will it block the services from doing things?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a288853d6eec928ffdf91ff4921d77f1d08e208d","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":135,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":136,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":137,"context_line":"   for this work)."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_1ba888da","line":137,"range":{"start_line":136,"start_character":58,"end_line":137,"end_character":16},"in_reply_to":"9abb7d3a_55403834","updated":"2016-06-01 08:49:25.000000000","message":"Yes, this tool is perfect for your case. This command will manually update the nodes. So in your case, services were upgraded from N to N+1, then admin should run the command to upgrade these untouched nodes to N+1 release. Then services can be upgraded to N+2 version and admin can update these untouched nodes to N+2 version.\n\nThis command will work in the background and not block conductor service.\nCurrently nova use this command by calling db api to manually update the DB. For example:\ndef node_online_data_migration():\n  results \u003d model_query(context, models.Node).filter_by(fake\u003dNone)\n  for db_node in reustls:\n    node \u003d Node._from_db_object(context, Node(), db_node)\n    node.save()\n\nThis is the basic design for this tool, but we can make it better for Ironic case.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7a7f3d92eecb6675dc6ab371496ff738f1435f59","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":135,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":136,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":137,"context_line":"   for this work)."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_150546bb","line":137,"range":{"start_line":136,"start_character":58,"end_line":137,"end_character":16},"in_reply_to":"9abb7d3a_c26e6b95","updated":"2016-05-31 02:17:47.000000000","message":"Yes, we can do rolling upgrade without this command.\nOnce all services upgrade to ToVer, if users update a node, Node._from_db_object will read old db_node record(1.14) and instantiate a 1.15 Node object(node.fake\u003ddb_node[\u0027extra\u0027]). Later, when ironic saving the node into DB, the record will become the new (1.15) record .\nThis command was used to manually trigger the above process to avoid if there are some nodes untouched.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e3c92dc8a17075551ce556ec53fc8834bbe08853","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":135,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":136,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":137,"context_line":"   for this work)."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Changes needed to support rolling upgrade"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_c26e6b95","line":137,"range":{"start_line":136,"start_character":58,"end_line":137,"end_character":16},"in_reply_to":"bab6814e_9fdf3c0c","updated":"2016-05-30 20:13:10.000000000","message":"But without the command, you can\u0027t do rolling upgrade? Is this command needed, or suggested?\n\nIt seems like there might be a circular dependency...","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":151,"context_line":"model. This new DB model change policy is as follows:"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":"* Dropping columns and tables are conditionally supported."},{"line_number":155,"context_line":"  Only columns and tables that had been deprecated prior to ``FromVer``"},{"line_number":156,"context_line":"  can be dropped in any version after ``FromVer``."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_41f18094","line":154,"updated":"2016-05-26 22:28:31.000000000","message":"Doesn\u0027t our deprecation policy mean we are already doing this?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"model. This new DB model change policy is as follows:"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":"* Dropping columns and tables are conditionally supported."},{"line_number":155,"context_line":"  Only columns and tables that had been deprecated prior to ``FromVer``"},{"line_number":156,"context_line":"  can be dropped in any version after ``FromVer``."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_1fea2cdb","line":154,"in_reply_to":"bab6814e_41f18094","updated":"2016-05-27 03:32:42.000000000","message":"The deprecation policy is wait three month and one named release. So yes, it is the same. But I still want to emphasis this point here.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_811408a0","line":160,"updated":"2016-05-26 22:28:31.000000000","message":"why does it have to be a named release? and what do you mean by \u0027next  named release\u0027. Next to what?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7a7f3d92eecb6675dc6ab371496ff738f1435f59","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_d5e8dee4","line":160,"in_reply_to":"9abb7d3a_42e1dbcf","updated":"2016-05-31 02:17:47.000000000","message":"Yes, currently ironic delete X from DB in N+1, which have a problem during upgrade.\n\nalter_column is not new, it was supported before","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0c6a9a606449e5d35c1ed4c2e7e3137b72f708bb","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_f5832c54","line":160,"in_reply_to":"9abb7d3a_d5e8dee4","updated":"2016-05-31 19:01:43.000000000","message":"i think there is a communication issue. by \u0027alter_column below is new\u0027, I mean that the line 163 is a new statement/policy. Ie, that we currently support alter_column. Yes?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"a288853d6eec928ffdf91ff4921d77f1d08e208d","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_2cd43cbb","line":160,"in_reply_to":"9abb7d3a_f5832c54","updated":"2016-06-01 08:49:25.000000000","message":"Oh, I misunderstand this. Sorry. So currently ironic support alter_column, and in New DB model change policy, alter_column is not supported anymore.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_c2428b0e","line":160,"in_reply_to":"bab6814e_811408a0","updated":"2016-05-27 03:32:42.000000000","message":"hmmm, next named release is not a good express because ToVer can be 8.1. I only consider the DB model changed between named release. But let me explain first.\n\nSo let\u0027s say FromVer is N named release(7.3). ToVer is N+1 named release(8.2). The next named release means N+2 here.\n\nIf the column is already deprecated in N named release, then we can drop it in N+1 named release, and the script can only be generated in N+2 named release.\n\nThe reason is during the upgrade from N to N+1, there are some services are still FromVer, and if the script was generated in N+1 which will be run at the beginning of rolling upgrade, the DB schema will drop the column while the FromVer service still use the old DB model and try to access the deprecated column and Unknown column error from DB.\n\nBut as FromVer and ToVer can be number release, so I would say the drop columns in SQLAlchemy DB should wait a deprecated period, and the alembic script to drop columns in DB schema has to wait one more deprecated period.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e3c92dc8a17075551ce556ec53fc8834bbe08853","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"  .. warning::"},{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_42e1dbcf","line":160,"in_reply_to":"bab6814e_c2428b0e","updated":"2016-05-30 20:13:10.000000000","message":"I\u0027m not sure \u0027deprecated period\u0027 is the right term.\n\nIs this what you are saying you want to happen:\n\n1. deprecate X in named version N\n2. remove support for X in named version N+1; ie no code refers to it. And there\u0027s some minimum 3-month deprecation period, I think we don\u0027t need to mention it unless there are some corner cases because of this.\n3. delete X from DB in N+2\n\nAnd if so, which part of the above don\u0027t we do today? I\u0027m guessing 3? Do we delete X from DB in N+1 now?\n\nThe spec should clearly mention what we do now, and what has to be changed to support this feature.\n\nBesides the above, the alter_column below is new too?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":159,"context_line":"     The alembic script to drop columns can only be generated in the"},{"line_number":160,"context_line":"     next named release, because ``FromVer`` still contain the deprecated"},{"line_number":161,"context_line":"     field in its DB model and this will result an unknown column error"},{"line_number":162,"context_line":"     if DB schema has already dropped the field."},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_a15b0c85","line":162,"updated":"2016-05-26 22:28:31.000000000","message":"I don\u0027t understand this. What if \u0027ToVer\u0027 is a named release?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":208,"context_line":"* Instantiate services\u0027 version objects."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"  ``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":211,"context_line":"  entity to a formal object. This will need to change so that it"},{"line_number":212,"context_line":"  is not a static method."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  Then, each IronicObject class will need to implement its own"},{"line_number":215,"context_line":"  ._from_db_object() to instantiate its own version objects (regardless of"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_0293f35b","line":212,"range":{"start_line":211,"start_character":29,"end_line":212,"end_character":25},"updated":"2016-05-27 03:32:42.000000000","message":"It can still be a static method, no need to change to class method.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"7a7f3d92eecb6675dc6ab371496ff738f1435f59","unresolved":false,"context_lines":[{"line_number":208,"context_line":"* Instantiate services\u0027 version objects."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"  ``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":211,"context_line":"  entity to a formal object. This will need to change so that it"},{"line_number":212,"context_line":"  is not a static method."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  Then, each IronicObject class will need to implement its own"},{"line_number":215,"context_line":"  ._from_db_object() to instantiate its own version objects (regardless of"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_751012a9","line":212,"range":{"start_line":211,"start_character":29,"end_line":212,"end_character":25},"in_reply_to":"9abb7d3a_82d583ba","updated":"2016-05-31 02:17:47.000000000","message":"Yes, I can do this, this is simply to override the method of parent class.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e3c92dc8a17075551ce556ec53fc8834bbe08853","unresolved":false,"context_lines":[{"line_number":208,"context_line":"* Instantiate services\u0027 version objects."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"  ``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":211,"context_line":"  entity to a formal object. This will need to change so that it"},{"line_number":212,"context_line":"  is not a static method."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  Then, each IronicObject class will need to implement its own"},{"line_number":215,"context_line":"  ._from_db_object() to instantiate its own version objects (regardless of"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_82d583ba","line":212,"range":{"start_line":211,"start_character":29,"end_line":212,"end_character":25},"in_reply_to":"bab6814e_0293f35b","updated":"2016-05-30 20:13:10.000000000","message":"If it isn\u0027t changed, won\u0027t it be confusing? The same method name? (Can you even do that?)","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":216,"context_line":"  any pinning) from the database."},{"line_number":217,"context_line":"  In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":218,"context_line":"  ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":219,"context_line":"  ``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":220,"context_line":"  node.fake \u003d db_obj[\u0027fake\u0027] and setting node.extra \u003d None."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"* Get target version."},{"line_number":223,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_62dabf18","line":220,"range":{"start_line":219,"start_character":2,"end_line":220,"end_character":59},"updated":"2016-05-27 03:32:42.000000000","message":"Most are correct, but with pinning, ToVer will setting node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra\u003dNone.\nBecause at the moment, db_obj[fake] is empty, only db_obj[\u0027extra\u0027] contain values.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":235,"context_line":"  ``IronicObject._fields_make_compatible`` that each IronicObject class"},{"line_number":236,"context_line":"  will implement to make itself compatible with previous versions:"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _fields_make_compatible(self, values, target_version db\u003dFalse)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"  In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":241,"context_line":"  object instance \u0027node\u0027 will make itself look like version \u00271.14\u0027, with"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_621f5fb7","line":238,"range":{"start_line":238,"start_character":56,"end_line":238,"end_character":57},"updated":"2016-05-27 03:32:42.000000000","message":"s//, /","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _fields_make_compatible(self, values, target_version db\u003dFalse)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"  In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":241,"context_line":"  object instance \u0027node\u0027 will make itself look like version \u00271.14\u0027, with"},{"line_number":242,"context_line":"  node.extra \u003d node.fake, and node.fake \u003d None."},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"* Save pinned-version values to DB."},{"line_number":245,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_ef566105","line":242,"range":{"start_line":240,"start_character":2,"end_line":242,"end_character":47},"updated":"2016-05-27 03:32:42.000000000","message":"This is incorrect. the instance running in ``ToVer`` is unchanged. The _fields_make_compatible only change the fields when the service interact with other services or DB or users. \n\nThis fields_make_compatible is only called in below three method in base.IronicObject:\n\n* obj_make_compatible \n  (Used for RPC call between API\u003c---\u003eConductor)\n* obj_get_db_compatiable_changes\n  (Used for DB call API/Conductor \u003c-----\u003e DB)\n* as_dict\n  (used for api response API ------\u003e user)\n\nSo using _fields_make_compatible to pass pinned-values","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":273,"context_line":"on the target version."},{"line_number":274,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":275,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":276,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"Alternatives"},{"line_number":279,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_a1a02c43","line":276,"updated":"2016-05-26 22:28:31.000000000","message":"I got lost here.\n\nI am trying to figure out why the pinning is at the db layer only. Which it isn\u0027t, because you mention that the API will only show the pinned version.\n\nI had expected that with pinning, *everything* deals with the objects using their pinned versions. Maybe a bad assumption on my part.\n\nI was thinking it might help (me anyway) if there was a diagram that showed where the version/conversions happened. You know, API \u003c-\u003e DB, API \u003c-\u003e Conductor, conductor \u003c-\u003e DB. Or maybe I\u0027m looking at it the wrong way?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":273,"context_line":"on the target version."},{"line_number":274,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":275,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":276,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"Alternatives"},{"line_number":279,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_5533f3f5","line":276,"in_reply_to":"bab6814e_a1a02c43","updated":"2016-05-27 03:32:42.000000000","message":"My mistake, it affects the API response too. What I want to emphasis is the pinning will not affect the running instances in ``ToVer``. I explain it in above _fields_make_compatible comment.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":306,"context_line":"RPC API impact"},{"line_number":307,"context_line":"--------------"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":310,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_a1b78c83","line":309,"updated":"2016-05-26 22:28:31.000000000","message":"It isn\u0027t \u0027will be added\u0027 since it already exists. Maybe describe why it wasn\u0027t correct and what it means to \u0027reuse\u0027 it. Also, please indicate where version_cap is located.\nAnd why is it mentioned here; shouldn\u0027t it be above with the proposed changes?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":306,"context_line":"RPC API impact"},{"line_number":307,"context_line":"--------------"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":310,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_4f004dab","line":309,"in_reply_to":"bab6814e_a1b78c83","updated":"2016-05-27 03:32:42.000000000","message":"version_cap was added in ConductorAPI(conductor/rpcapi.py) as an initialize parameter of RPCClient. RPCClient use version_cap to determine the maximum requested message version it can send. \nCurrently, Conductor\u0027s version_cap was always set to the latest RPC_API_VERSION. But in order to make a compatible RPC call of previous release, the version_cap should be set according to ``[DEFAULT]/pin_release_version``, then each RPC call will customize the request up to the version_cap.\n\nOh, I thought this is too detail for the implementation, so I put it here. But let\u0027s move it above.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":309,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":310,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":313,"context_line":"because ironic-API should access DB directly, there is no need to instantiate"},{"line_number":314,"context_line":"IronicObjectIndirectionAPI."},{"line_number":315,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_e1ad1432","line":312,"updated":"2016-05-26 22:28:31.000000000","message":"I did a quick search and couldn\u0027t find object_class(). Where is it in the code base?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"A version_cap will be added to make a compatible RPC call of previous release."},{"line_number":310,"context_line":"Developers should keep this in mind when change an existing RCP call."},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":313,"context_line":"because ironic-API should access DB directly, there is no need to instantiate"},{"line_number":314,"context_line":"IronicObjectIndirectionAPI."},{"line_number":315,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_2f6869ba","line":312,"in_reply_to":"bab6814e_e1ad1432","updated":"2016-05-27 03:32:42.000000000","message":"Sorry, it\u0027s object_action()/object_class_action_versions()/object_backport_versions()\nThey are located in conductor/rpcapi.py and conductor/manager.py","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"63e9c22bd26e4fb0eb4cb92bebdb2c93479410fd","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":313,"context_line":"because ironic-API should access DB directly, there is no need to instantiate"},{"line_number":314,"context_line":"IronicObjectIndirectionAPI."},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"Driver API impact"},{"line_number":317,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"bab6814e_21a43c49","line":314,"updated":"2016-05-26 22:28:31.000000000","message":"I don\u0027t understand this part. If IronicObjectIndirectionAPI doesn\u0027t need to be instantiated, are you saying it isn\u0027t needed? And if it isn\u0027t needed, should we delete that class?\n\nAnd maybe this should be done in a bug, separate from this RFE?","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"04f3b807ba1365c92eea79bba8462868ce65761f","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Remove object_class()/object_class_action_version()/object_backport_version(),"},{"line_number":313,"context_line":"because ironic-API should access DB directly, there is no need to instantiate"},{"line_number":314,"context_line":"IronicObjectIndirectionAPI."},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"Driver API impact"},{"line_number":317,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9abb7d3a_cfa9dde1","line":314,"in_reply_to":"bab6814e_21a43c49","updated":"2016-05-27 03:32:42.000000000","message":"It\u0027s not needed. Yes, this should be a bug. I will do it.","commit_id":"bb6227dc7e92859a87943db088f4a70d9df23601"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":54,"context_line":"be necessary to upgrade all the ironic-api and ironic-conductor"},{"line_number":55,"context_line":"services simultaneously as in a cold upgrade. A rolling upgrade would allow"},{"line_number":56,"context_line":"individual ironic-api and ironic-conductor services to be upgraded one at a"},{"line_number":57,"context_line":"time, with the rest of the services still available. This upgrade would have"},{"line_number":58,"context_line":"minimal or even zero downtime."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_9b47014b","line":58,"range":{"start_line":57,"start_character":53,"end_line":58,"end_character":30},"updated":"2016-06-10 14:25:37.000000000","message":"From the first paragraph:\n\nThere should be no downtime when upgrading ironic services.\n\nIs ironic different from other services in this sense? Let\u0027s stick to either \u0027minimal\u0027 or \u0027no downtime\u0027 (or both) everywhere.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"6879a9d4d325afbb025826edc9700f31d97fca95","unresolved":false,"context_lines":[{"line_number":54,"context_line":"be necessary to upgrade all the ironic-api and ironic-conductor"},{"line_number":55,"context_line":"services simultaneously as in a cold upgrade. A rolling upgrade would allow"},{"line_number":56,"context_line":"individual ironic-api and ironic-conductor services to be upgraded one at a"},{"line_number":57,"context_line":"time, with the rest of the services still available. This upgrade would have"},{"line_number":58,"context_line":"minimal or even zero downtime."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_2525f6c1","line":58,"range":{"start_line":57,"start_character":53,"end_line":58,"end_character":30},"in_reply_to":"9abb7d3a_9b47014b","updated":"2016-06-28 09:19:25.000000000","message":"Done","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_5b6e3997","line":62,"range":{"start_line":62,"start_character":44,"end_line":62,"end_character":61},"updated":"2016-06-10 14:25:37.000000000","message":"nit - you could use # instead of directly numbers :)","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a922fb191b23df3963a60b273c2ee3e9e2c3af9b","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The rolling upgrade solution presented here is modelled after nova\u0027s"},{"line_number":61,"context_line":"upgrade process [2]_, with some differences. In addition, there have been"},{"line_number":62,"context_line":"several discussions about rolling upgrades ([3]_, [9]_, [10]_)."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_d8daac4a","line":62,"range":{"start_line":62,"start_character":44,"end_line":62,"end_character":61},"in_reply_to":"9abb7d3a_5b6e3997","updated":"2016-06-13 14:29:10.000000000","message":"Hey, how could you use # to indicate that you want the 3rd, 9th, and 10th references?","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"074f842cc18dfe633c2749fb19013b6799771852","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to ``FromVer`` for all services, via"},{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_4503a50d","line":119,"updated":"2016-05-30 20:12:22.000000000","message":"because Yuiko asked, maybe s/all services/both ironic-api and ironic-conductor services/\n\nand s/versions to/versions to the same/","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"0c5babee69cad9fe4a19df329163df8b8da3ce21","unresolved":false,"context_lines":[{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to ``FromVer`` for all services, via"},{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_b5227aff","line":119,"in_reply_to":"9abb7d3a_4503a50d","updated":"2016-05-31 02:15:49.000000000","message":"OK, will add this.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"710a21ab10ac0aed54e706d5f6ffaacf6f7a7426","unresolved":false,"context_lines":[{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a9d85d2_6edcebe4","line":123,"updated":"2016-06-21 03:58:38.000000000","message":"The line suggests the following arrangement is supported:\n- 1 node running ir-api \"FromVer\" and ir-cond \"FromVer\"\n- 1 node running ir-cond \"ToVer\"\n\nThis arrangement is not tested according to the Testing section below.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"cdf7a33916aac31c310020c5ee143f0bfaf17f25","unresolved":false,"context_lines":[{"line_number":120,"context_line":"   the new configuration option described below in \"RPC and object version"},{"line_number":121,"context_line":"   pinning\"."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_e12c85ad","line":123,"in_reply_to":"5a9d85d2_6edcebe4","updated":"2016-06-22 10:41:57.000000000","message":"Thanks for the suggestion, but I think the testing section is focus on the interaction between different version services. So in your case, ir-api \"FromVer\" with  ir-cond \"ToVer\" is covered.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"710a21ab10ac0aed54e706d5f6ffaacf6f7a7426","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a9d85d2_2ea02343","line":125,"updated":"2016-06-21 03:58:38.000000000","message":"This line suggests the following arrangement is supported:\n- 1 node running ir-api \"ToVer\" and ir-cond \"ToVer\"\n- 1 node running ir-api \"FromVer\"\n\nThis is consistent with the multi-node notes in the Testing section.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"074f842cc18dfe633c2749fb19013b6799771852","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* Dropping columns and tables is subject to ironic depreciation policy."},{"line_number":156,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":157,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":158,"context_line":"  accessing DB."}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_e2fa8fbc","line":155,"updated":"2016-05-30 20:12:22.000000000","message":"s/depreciation/deprecation/. You could also refer to [8].","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"0c5babee69cad9fe4a19df329163df8b8da3ce21","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* Dropping columns and tables is subject to ironic depreciation policy."},{"line_number":156,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":157,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":158,"context_line":"  accessing DB."}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_758772d7","line":155,"in_reply_to":"9abb7d3a_e2fa8fbc","updated":"2016-05-31 02:15:49.000000000","message":"Will add it.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* Dropping columns and tables is subject to ironic depreciation policy."},{"line_number":156,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":157,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":158,"context_line":"  accessing DB."},{"line_number":159,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":160,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_1cbc7a6b","line":157,"updated":"2016-06-10 14:25:37.000000000","message":"During this \"intermediate\" period, in case of ToVer objects, are these fields that are being removed dropped in the dbapi methods, or in objects layer?","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a922fb191b23df3963a60b273c2ee3e9e2c3af9b","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* Dropping columns and tables is subject to ironic depreciation policy."},{"line_number":156,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":157,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":158,"context_line":"  accessing DB."},{"line_number":159,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":160,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_f8932859","line":157,"in_reply_to":"7aa08908_1cbc7a6b","updated":"2016-06-13 14:29:10.000000000","message":"by \u0027intermediate\u0027, I think you mean \u0027deprecation period\u0027? In which case, I think they still have to exist, just that they should not be used any more. (But Tan should confirm.)","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"cdf7a33916aac31c310020c5ee143f0bfaf17f25","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* Dropping columns and tables is subject to ironic depreciation policy."},{"line_number":156,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":157,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":158,"context_line":"  accessing DB."},{"line_number":159,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":160,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_5cb0def4","line":157,"in_reply_to":"7aa08908_f8932859","updated":"2016-06-22 10:41:57.000000000","message":"Hi ruby, these fields are dropped in objects layer too when dropping the columns in Sqlalchemy DB model. The SQL DB schema will wait one more depreciation period before run alembic script.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"074f842cc18dfe633c2749fb19013b6799771852","unresolved":false,"context_lines":[{"line_number":201,"context_line":"Add target_version to object class"},{"line_number":202,"context_line":"::::::::::::::::::::::::::::::::::"},{"line_number":203,"context_line":"In addition to the attribute ``VERSION``, each object class will contain a"},{"line_number":204,"context_line":"new value ``target_version``. If pinned version was given, the value of"},{"line_number":205,"context_line":"``target_version`` for each object class will be set to a corresponding value"},{"line_number":206,"context_line":"in the ``objects_mapping``. Otherwise, the value is None."},{"line_number":207,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_e2272f10","line":204,"updated":"2016-05-30 20:12:22.000000000","message":"s/new value/new attribute/ ?","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"0c5babee69cad9fe4a19df329163df8b8da3ce21","unresolved":false,"context_lines":[{"line_number":201,"context_line":"Add target_version to object class"},{"line_number":202,"context_line":"::::::::::::::::::::::::::::::::::"},{"line_number":203,"context_line":"In addition to the attribute ``VERSION``, each object class will contain a"},{"line_number":204,"context_line":"new value ``target_version``. If pinned version was given, the value of"},{"line_number":205,"context_line":"``target_version`` for each object class will be set to a corresponding value"},{"line_number":206,"context_line":"in the ``objects_mapping``. Otherwise, the value is None."},{"line_number":207,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_956e56ff","line":204,"in_reply_to":"9abb7d3a_e2272f10","updated":"2016-05-31 02:15:49.000000000","message":"hmmm, target_version is not a attribute object class. Object instances will dynamically fetch the value from objects_mapping when it needed. This is because the pinned version will vary and target_version should also change too.\nSo I prefer to rephrase it like:\neach object instances will dynamically fetch a new value ``target_version``.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"074f842cc18dfe633c2749fb19013b6799771852","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"* API/Conductor ---------\u003e DB"},{"line_number":215,"context_line":"* API -----------\u003e Users"},{"line_number":216,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"To support this, several methods will be added or changed for"},{"line_number":219,"context_line":"``ironic.objects.base.IronicObject``."}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_424efb96","line":216,"updated":"2016-05-30 20:12:22.000000000","message":"What I don\u0027t understand, is why a service doesn\u0027t use a particular/same version of an object throughout the object\u0027s lifetime.\n\nIs this what nova is doing? Do they have some documentation that explains how this works? I feel like I am missing something. Which you may have described, dunno, but that I don\u0027t understand.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"0c5babee69cad9fe4a19df329163df8b8da3ce21","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"* API/Conductor ---------\u003e DB"},{"line_number":215,"context_line":"* API -----------\u003e Users"},{"line_number":216,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"To support this, several methods will be added or changed for"},{"line_number":219,"context_line":"``ironic.objects.base.IronicObject``."}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_58d4231f","line":216,"in_reply_to":"9abb7d3a_424efb96","updated":"2016-05-31 02:15:49.000000000","message":"So you are asking why not initialize objects of ``ToVer`` services to ``FromVer`` as same as pinned version, right? There are two reasons.\n\n1. In the latest code (``ToVer``), developers should able to access \u0027fake\u0027 field using node.fake. But if we run a ``FromVer`` node in ``ToVer`` services, there are some extra work to do. Because node.fake is None, we have to return node.extra, which is exactly the same as the solution did. So why not do this once when initializing the instance?\n\n2. This is useful to do online data migration. With pinned version, ``ToVer`` services only save ``FromVer`` values to DB. But once unpin the version, ``ToVer`` will save ``ToVer`` to DB directly.\n\nNova is doing a similar thing but with different implementation.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"6ac77e3b994577eb3d3ac79c75ac4d1303f329b4","unresolved":false,"context_lines":[{"line_number":229,"context_line":"``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":230,"context_line":"entity to a formal object."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Then, each IronicObject class will need to implement its own"},{"line_number":233,"context_line":"_from_db_object() to instantiate its own version objects (regardless of"},{"line_number":234,"context_line":"any pinning) from the database."},{"line_number":235,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_98b16be4","line":232,"range":{"start_line":232,"start_character":6,"end_line":232,"end_character":29},"updated":"2016-05-31 02:32:12.000000000","message":"\"each IronicObject\" means all of Node, Chassis, Port... class has its own _from_db_object() method, right? I assume you are following to Nova basically, and _from_db_object() is also copied from Nova like https://github.com/openstack/nova/blob/bc5035343d366a18cae587f92ecb4e871aba974a/nova/objects/security_group.py#L38 , right? It\u0027d be better to add some references to Nova, which may help people to understand :)","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b64a09b364116132e14cd216b32aceb1361807c1","unresolved":false,"context_lines":[{"line_number":229,"context_line":"``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":230,"context_line":"entity to a formal object."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Then, each IronicObject class will need to implement its own"},{"line_number":233,"context_line":"_from_db_object() to instantiate its own version objects (regardless of"},{"line_number":234,"context_line":"any pinning) from the database."},{"line_number":235,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9abb7d3a_2c0f1c89","line":232,"range":{"start_line":232,"start_character":6,"end_line":232,"end_character":29},"in_reply_to":"9abb7d3a_98b16be4","updated":"2016-06-01 07:05:51.000000000","message":"Thanks, I add a reference to Nova in [2] and I have more in previous patch set. But people told me I should focus on the changes of ironic in the spec. So I will add more in the future upgrade doc.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":235,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":236,"context_line":"ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":237,"context_line":"``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":238,"context_line":"node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra \u003d None. Because with"},{"line_number":239,"context_line":"pinning, the db_obj[\u0027fake\u0027] is still empty."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"Get target version"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_b403ba75","line":238,"updated":"2016-06-10 14:25:37.000000000","message":"And then, e.g. in version 1.16 that corresponds to (ToVer release + 1), it will be changed to node.fake \u003d db_obj[\u0027fake\u0027] ? Is it going to be some if statements added to _from_db_object? If so, we\u0027re going to maintain all the ifs for all the object versions introduced during last one cycle and then remove them?","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"cdf7a33916aac31c310020c5ee143f0bfaf17f25","unresolved":false,"context_lines":[{"line_number":235,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":236,"context_line":"ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":237,"context_line":"``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":238,"context_line":"node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra \u003d None. Because with"},{"line_number":239,"context_line":"pinning, the db_obj[\u0027fake\u0027] is still empty."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"Get target version"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_dc74cefe","line":238,"in_reply_to":"7aa08908_b403ba75","updated":"2016-06-22 10:41:57.000000000","message":"unfortunately, yes.But it should not be too much in one release.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":268,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":269,"context_line":"the unpinning."},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"A new method ``IronicObject._obj_get_db_compatible_changes(self)``"},{"line_number":272,"context_line":"will return a dictionary of DB-compatible changed fields and values."},{"line_number":273,"context_line":"These will be compatible with the pinned version."},{"line_number":274,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_b74c5c77","line":271,"updated":"2016-06-10 14:25:37.000000000","message":"Do we need a new method, or maybe adding additional logic in obj_get_changes that will check if pinning exists would be enough?","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"cdf7a33916aac31c310020c5ee143f0bfaf17f25","unresolved":false,"context_lines":[{"line_number":268,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":269,"context_line":"the unpinning."},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"A new method ``IronicObject._obj_get_db_compatible_changes(self)``"},{"line_number":272,"context_line":"will return a dictionary of DB-compatible changed fields and values."},{"line_number":273,"context_line":"These will be compatible with the pinned version."},{"line_number":274,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_c5aa32d4","line":271,"in_reply_to":"7aa08908_b74c5c77","updated":"2016-06-22 10:41:57.000000000","message":"It is possible. But obj_get_changes was called in obj_reset_changes() too, so I prefer to write a new method, this is clean and safe.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6f749a4f4a3321a2b14629d46770a5f57dc56889","unresolved":false,"context_lines":[{"line_number":298,"context_line":"on the target version."},{"line_number":299,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":300,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":301,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"Alternatives"},{"line_number":304,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7aa08908_d7b2c8e4","line":301,"updated":"2016-06-10 14:25:37.000000000","message":"Hmm, can we just change all the destroy calls to accept uuid instead? I\u0027m not sure I understand why destroy_port and portgroup are called with objects rather then uuids.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"cdf7a33916aac31c310020c5ee143f0bfaf17f25","unresolved":false,"context_lines":[{"line_number":298,"context_line":"on the target version."},{"line_number":299,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":300,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":301,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"Alternatives"},{"line_number":304,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_05c27a85","line":301,"in_reply_to":"7aa08908_d7b2c8e4","updated":"2016-06-22 10:41:57.000000000","message":"I also have the doubts too! But this is out the scope of the spec :) I will change it later","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"710a21ab10ac0aed54e706d5f6ffaacf6f7a7426","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":430,"context_line":"    ironic-api only."},{"line_number":431,"context_line":"  * Node A will be upgraded to using \u003dtoVer\u003d and then we can test the"},{"line_number":432,"context_line":"    interaction of \u003dfromVer\u003d and \u003dtoVer\u003d ironic-api services with \u003dtoVer\u003d"},{"line_number":433,"context_line":"    version of ironic-conductor"},{"line_number":434,"context_line":"  * Tests should cover the use cases describe in"},{"line_number":435,"context_line":"    \u0027\u0027Rolling upgrades between releases\u0027\u0027 as much as possible."},{"line_number":436,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a9d85d2_8e7dd7b3","line":433,"range":{"start_line":431,"start_character":4,"end_line":433,"end_character":31},"updated":"2016-06-21 03:58:38.000000000","message":"That only covers running \"partial\" ir-api. The upgrade notes above suggest upgrading ironic-conductor services one-by-one first, which is not tested here.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"6879a9d4d325afbb025826edc9700f31d97fca95","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":430,"context_line":"    ironic-api only."},{"line_number":431,"context_line":"  * Node A will be upgraded to using \u003dtoVer\u003d and then we can test the"},{"line_number":432,"context_line":"    interaction of \u003dfromVer\u003d and \u003dtoVer\u003d ironic-api services with \u003dtoVer\u003d"},{"line_number":433,"context_line":"    version of ironic-conductor"},{"line_number":434,"context_line":"  * Tests should cover the use cases describe in"},{"line_number":435,"context_line":"    \u0027\u0027Rolling upgrades between releases\u0027\u0027 as much as possible."},{"line_number":436,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_a9a9bce1","line":433,"range":{"start_line":431,"start_character":4,"end_line":433,"end_character":31},"in_reply_to":"5a9d85d2_8e7dd7b3","updated":"2016-06-28 09:19:25.000000000","message":"As you said, when upgrading ironic-conductor services one-by-one, we will have  \u003dfromVer\u003d and \u003dtoVer\u003d ironic-conductor services co-existed. But I doubt the necessary to test \u003dfromVer\u003d ironic-api and \u003dfromVer\u003d ironic-conductor again because this is already covered by other testing.","commit_id":"e7b17984c098ea6587b6a2d0bc2464690c618d31"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"#. upgrade neutron"},{"line_number":38,"context_line":"#. upgrade cinder"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"A \"cold upgrade\" of ironic could be done, but it means that the ironic services"},{"line_number":41,"context_line":"would be unavailable for the duration of the upgrade and the whole process"},{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_73ace835","line":40,"range":{"start_line":40,"start_character":3,"end_line":40,"end_character":15},"updated":"2016-10-05 20:00:53.000000000","message":"Can you please define the phrase \"cold upgrade\" in the same place you use it? It\u0027s done in the next paragraph, but here would be better I think. Maybe it\u0027s unnecessary to define it at all, not sure.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"#. upgrade neutron"},{"line_number":38,"context_line":"#. upgrade cinder"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"A \"cold upgrade\" of ironic could be done, but it means that the ironic services"},{"line_number":41,"context_line":"would be unavailable for the duration of the upgrade and the whole process"},{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_d7e13d9c","line":40,"range":{"start_line":40,"start_character":3,"end_line":40,"end_character":15},"in_reply_to":"1a95cdbc_73ace835","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"#. upgrade cinder"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"A \"cold upgrade\" of ironic could be done, but it means that the ironic services"},{"line_number":41,"context_line":"would be unavailable for the duration of the upgrade and the whole process"},{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_93309403","line":41,"updated":"2016-10-05 20:00:53.000000000","message":"nit: This is a run on sentence.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"#. upgrade cinder"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"A \"cold upgrade\" of ironic could be done, but it means that the ironic services"},{"line_number":41,"context_line":"would be unavailable for the duration of the upgrade and the whole process"},{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_77da31eb","line":41,"in_reply_to":"1a95cdbc_93309403","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"#. stop all ironic-api and ironic-conductor services"},{"line_number":46,"context_line":"#. uninstall old code"},{"line_number":47,"context_line":"#. install new code"},{"line_number":48,"context_line":"#. update configurations"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_b302f009","line":45,"updated":"2016-10-05 20:00:53.000000000","message":"You may want to reference this: http://docs.openstack.org/developer/ironic/deploy/upgrade-guide.html\n\nYou have it at the end under documentation impact, but it may be good to have it as a numbered reference and cite it in both places.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"might be time-consuming. For example, the steps to do a cold upgrade"},{"line_number":43,"context_line":"could be:"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"#. stop all ironic-api and ironic-conductor services"},{"line_number":46,"context_line":"#. uninstall old code"},{"line_number":47,"context_line":"#. install new code"},{"line_number":48,"context_line":"#. update configurations"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_17f2d56f","line":45,"in_reply_to":"1a95cdbc_b302f009","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":74,"context_line":"To support rolling upgrade for ironic, the following are needed:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contributing guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for users."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_f08c6181","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":16},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/contributing/contribution","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"To support rolling upgrade for ironic, the following are needed:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contributing guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for users."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_97fee536","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":16},"in_reply_to":"1a95cdbc_f08c6181","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"07dfaf9ec3d11772d8d55801886476793e7dc40f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"* named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":104,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.2, a rolling upgrade"},{"line_number":105,"context_line":"  will work between 7.3 to 7.9; 7.4 to 8.1; and of course 7.3 to 8.2 (which"},{"line_number":106,"context_line":"  is Name1 to Name2)"},{"line_number":107,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Rolling upgrade process"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_d0e20b03","line":106,"range":{"start_line":103,"start_character":2,"end_line":106,"end_character":20},"updated":"2016-10-28 10:01:11.000000000","message":"Are we able to backport upgrade fixes to all of these versions? (like 7.x)","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e2d4d27450d9243324693fe9fb87853416844830","unresolved":false,"context_lines":[{"line_number":100,"context_line":"* named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":104,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.2, a rolling upgrade"},{"line_number":105,"context_line":"  will work between 7.3 to 7.9; 7.4 to 8.1; and of course 7.3 to 8.2 (which"},{"line_number":106,"context_line":"  is Name1 to Name2)"},{"line_number":107,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Rolling upgrade process"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_5c8a3f1c","line":106,"range":{"start_line":103,"start_character":2,"end_line":106,"end_character":20},"in_reply_to":"ba5da102_6936eae8","updated":"2016-11-09 22:12:14.000000000","message":"Ah, good question. So we don\u0027t backport to any release that is not a named release. So we should put a caveat here about supporting rolling upgrades wrt non-named releases.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"110afd52d81941470abad7a386960f815ba4afbd","unresolved":false,"context_lines":[{"line_number":100,"context_line":"* named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":104,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.2, a rolling upgrade"},{"line_number":105,"context_line":"  will work between 7.3 to 7.9; 7.4 to 8.1; and of course 7.3 to 8.2 (which"},{"line_number":106,"context_line":"  is Name1 to Name2)"},{"line_number":107,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Rolling upgrade process"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_6936eae8","line":106,"range":{"start_line":103,"start_character":2,"end_line":106,"end_character":20},"in_reply_to":"ba5da102_b2332213","updated":"2016-11-04 13:00:53.000000000","message":"I think the spec should be clarified here, since when there is a bug in the upgrade process that needs to be backported to actually provide a fix, it will be backported to the latest version of 7.x, ex 7.9 and not 7.3. So after fixing this bug, we will only support an upgrade path of 7.3 -\u003e 7.9 (or latest 7.x) -\u003e 8.2 (latest 8.x).","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":100,"context_line":"* named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* any releases between two named releases N and N+1. For example, if"},{"line_number":104,"context_line":"  Name1 corresponds to 7.3 and Name2 corresponds to 8.2, a rolling upgrade"},{"line_number":105,"context_line":"  will work between 7.3 to 7.9; 7.4 to 8.1; and of course 7.3 to 8.2 (which"},{"line_number":106,"context_line":"  is Name1 to Name2)"},{"line_number":107,"context_line":"* most recent named release N (and semver releases newer than N) to master"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Rolling upgrade process"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_b2332213","line":106,"range":{"start_line":103,"start_character":2,"end_line":106,"end_character":20},"in_reply_to":"ba5da102_d0e20b03","updated":"2016-11-03 20:45:00.000000000","message":"Not sure what you mean here. Will try to catch you on irc.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"The rolling upgrade process to upgrade ironic from version ``FromVer`` to the"},{"line_number":112,"context_line":"next version ``ToVer`` is as follows:"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":115,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_10062dce","line":114,"range":{"start_line":114,"start_character":3,"end_line":114,"end_character":10},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/upgrade/Upgrade, since all points below are capitalized","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":111,"context_line":"The rolling upgrade process to upgrade ironic from version ``FromVer`` to the"},{"line_number":112,"context_line":"next version ``ToVer`` is as follows:"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":115,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_d3ca306e","line":114,"range":{"start_line":114,"start_character":3,"end_line":114,"end_character":10},"in_reply_to":"1a95cdbc_10062dce","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"07dfaf9ec3d11772d8d55801886476793e7dc40f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":115,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":120,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_70a13fa9","line":117,"updated":"2016-10-28 10:01:11.000000000","message":"from what I learnt, the policy to split shema-braking changes into multiple releases (like in Nova) is already in place?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":114,"context_line":"#. upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":115,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":116,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":117,"context_line":"   to be agreed upon."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":120,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_ed077f15","line":117,"in_reply_to":"ba5da102_70a13fa9","updated":"2016-11-03 20:45:00.000000000","message":"Yes, it is in place. I think. I hope. This spec formalizes it, because we don\u0027t have it written down.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":120,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":121,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_f0ff01a8","line":123,"range":{"start_line":123,"start_character":38,"end_line":123,"end_character":48},"updated":"2016-10-05 20:00:53.000000000","message":"nit: may want to say \"one at a time\" here and in L125 instead. I think that\u0027s a bit more specific.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":121,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_56644e48","line":123,"range":{"start_line":123,"start_character":38,"end_line":123,"end_character":48},"in_reply_to":"1a95cdbc_f0ff01a8","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_d0f205d2","line":125,"updated":"2016-10-05 20:00:53.000000000","message":"I\u0027m curious; why conductors before API?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"07dfaf9ec3d11772d8d55801886476793e7dc40f","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_708f7f23","line":125,"in_reply_to":"1a95cdbc_d0f205d2","updated":"2016-10-28 10:01:11.000000000","message":"Conductors may be used to backport objects. Backporting is used when an older service instance receives an object with a newer version, which the old code release can\u0027t parse, so it calls the backporting mechanism.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade ironic-conductor services, one by one."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"#. Upgrade ironic-api services, one by one."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_8d70c341","line":125,"in_reply_to":"ba5da102_708f7f23","updated":"2016-11-03 20:45:00.000000000","message":"Mario, also (besides the object version stuff), the api services is what our users see. It doesn\u0027t make sense to upgrade them first to expose \u0027new\u0027 features via new microversions, when the conductor cannot support those new features yet. Hmm, I suspect something would break in that case; I think we have coded with the assumption that the conductor must be upgraded first.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":129,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":130,"context_line":"   restarting the services. Although it doesn\u0027t really matter, we suggest"},{"line_number":131,"context_line":"   restarting all the ironic-conductor services first, followed by the"},{"line_number":132,"context_line":"   ironic-api services."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_90cf9d7e","line":130,"range":{"start_line":130,"start_character":18,"end_line":130,"end_character":26},"updated":"2016-10-05 20:00:53.000000000","message":"Restarting the services one at a time, right?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":129,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":130,"context_line":"   restarting the services. Although it doesn\u0027t really matter, we suggest"},{"line_number":131,"context_line":"   restarting all the ironic-conductor services first, followed by the"},{"line_number":132,"context_line":"   ironic-api services."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_9096bd4a","line":130,"range":{"start_line":130,"start_character":66,"end_line":130,"end_character":73},"updated":"2016-10-05 20:00:53.000000000","message":"Why do you suggest this if it doesn\u0027t matter? Does it matter for the actual upgrade, even if it doesn\u0027t matter for the restart?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"07dfaf9ec3d11772d8d55801886476793e7dc40f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":128,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":129,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":130,"context_line":"   restarting the services. Although it doesn\u0027t really matter, we suggest"},{"line_number":131,"context_line":"   restarting all the ironic-conductor services first, followed by the"},{"line_number":132,"context_line":"   ironic-api services."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_30dc2712","line":130,"range":{"start_line":130,"start_character":18,"end_line":130,"end_character":26},"in_reply_to":"1a95cdbc_90cf9d7e","updated":"2016-10-28 10:01:11.000000000","message":"It doesn\u0027t matter in this case, because all services would understand all versions of versioned objects, so they won\u0027t use the backporting mechanism.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"* The dropping of columns/tables and corresponding objects fields is subject"},{"line_number":156,"context_line":"  to ironic deprecation policy [8]_."},{"line_number":157,"context_line":"  But it\u0027s alembic script has to wait one more depreciation period, otherwise"},{"line_number":158,"context_line":"  an \"unknown column\" exception will be thrown when ``FromVer`` services"},{"line_number":159,"context_line":"  accessing DB."},{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_70869114","line":157,"range":{"start_line":157,"start_character":6,"end_line":157,"end_character":10},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/it\u0027s/its, or s/it\u0027s/the","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"8198696227f5c7aeab4e2a75b185815354e52dde","unresolved":false,"context_lines":[{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":161,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"},{"line_number":166,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_36e67f44","line":163,"range":{"start_line":163,"start_character":1,"end_line":163,"end_character":14},"updated":"2016-11-10 06:27:02.000000000","message":"Just out of curiosity, considering ironic-api accesses db through ironic-conductor, similar as nova-compute and nova-conductor, can\u0027t we support alter_column by taking advantage of OVO and span this process in only one release?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":161,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"},{"line_number":166,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_b0c65947","line":163,"updated":"2016-10-05 20:00:53.000000000","message":"Why wouldn\u0027t this be allowed with a valid deprecation policy? I know some implementations of ALTER TABLE lock everything, but maybe not all of them?\n\nMaybe you could note that it\u0027s allowed, but only with an alternative like this:\n\n1. deprecation notice matching policy\n2. create new column with new name or new size\n3. copy data and perform simultaneous writes to both during the upgrade\n4. once everything\u0027s upgraded, drop old column\n\nI\u0027m using something similar to that method in this patch set: https://review.openstack.org/#/c/376978/ but for a field, not an entire column.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"7e73a548f37b161a60faf0a266f044f327e39bdf","unresolved":false,"context_lines":[{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":161,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"},{"line_number":166,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_8e7aa686","line":163,"range":{"start_line":163,"start_character":1,"end_line":163,"end_character":14},"in_reply_to":"9a629dbe_1e9c1b0e","updated":"2016-11-10 23:44:54.000000000","message":"Ah, right. I found it in L215. Thanks. But it would be more appreciated to provide some background why we do not support this anymore, since it is technically doable, right? Maybe some clarifications like we choose not to support it for the benefit of easy maintenance of rolling upgrades, or so. :)","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2249d3090c4ed54797b18249f8d5adb1c31e357c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":161,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"},{"line_number":166,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_1e9c1b0e","line":163,"range":{"start_line":163,"start_character":1,"end_line":163,"end_character":14},"in_reply_to":"9a629dbe_36e67f44","updated":"2016-11-10 14:30:07.000000000","message":"I thought it was mentioned in this spec (too lazy to look) but the ironic-api service doesn\u0027t always go through ironic-conductor; it may access the db directly, eg when a node is created.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":160,"context_line":"  Because :command:`ironic-dbsync upgrade` is already upgrade DB schema but"},{"line_number":161,"context_line":"  ``FromVer`` services still contain the dropped field in its DB model."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* alter_column like rename or resize is not supported any more."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"RPC and object version pinning"},{"line_number":166,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_2246b4bf","line":163,"range":{"start_line":163,"start_character":1,"end_line":163,"end_character":14},"in_reply_to":"9a629dbe_8e7aa686","updated":"2016-11-14 16:48:08.000000000","message":"I split this into two bullet points, noting that a change may be split into multiple operations. In addition, I added a provision that when there is a concern that a table lock may cause downtime, it should be noted in the release notes. It\u0027s a policy keystone also adopted.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_f04541b3","line":178,"updated":"2016-10-05 20:00:53.000000000","message":"Will this be done automatically or will devs have to maintain this? It can wait for the implementation, just curious.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"07dfaf9ec3d11772d8d55801886476793e7dc40f","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_264a31c6","line":178,"in_reply_to":"1a95cdbc_f04541b3","updated":"2016-10-28 10:01:11.000000000","message":"This happens automatically. Each service has a list of registered objects from which it can read each object version.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_8d7b317b","line":178,"in_reply_to":"9a629dbe_04e4cede","updated":"2016-11-14 16:48:08.000000000","message":"This describes how OVO is used in cinder. Cinder doesn\u0027t have a conductor to backport objects, so it maintains a mapping, pins the object versions and backports them _before_ they are sent over the wire. This is why it has to have this information for the previous version it is interfacing with before it makes a contact.\n\nIn case of ironic (and nova), the request to backport an object is sent after the object is received by an older release which doesn\u0027t \"know\" how to parse and interpret it\u0027s contents. It calls an RPC method which will contact the conductor which makes the backport.\n\nBut from the implementation details below, I see that Tan Lin describes the \"cinder flavor\" of OVO. It has some benefits in that it should have a lesser performance impact then what nova does with the backporting of objects through an RPC call. If other cores agree, we can implement this version. I see no drawbacks apart from the object mapping that would have to be maintained.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"4db3ed8646d60e63d9dfc848bb82ec142ded8cc3","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_a4ff47a9","line":178,"in_reply_to":"ba5da102_0d0e738b","updated":"2016-11-04 13:39:08.000000000","message":"In case of object version mapping, when there is a need of backporting an object, all currently supported versions of objects are gathered in a version_manifest. This manifest is passed together with the object than needs backporting to the conductor and obj_make_compatible_from_manifest is called on the conductor to do the backporting of all related objects and the object itself.\n\nIn case of RPC you\u0027re right, here is an example from nova:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/rpcapi.py#L318-L337","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_0d0e738b","line":178,"in_reply_to":"ba5da102_264a31c6","updated":"2016-11-03 20:45:00.000000000","message":"Greg -- I think we/developer will have to manually update the objects_mapping \u0026 rpc_mapping dicts, 1. for each release; 2. every time we have a new version of an object.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"05d1935874c88952820c3a976586eab672c78da0","unresolved":false,"context_lines":[{"line_number":175,"context_line":"will use the latest versions of RPC and IronicObjects. Its possible values are"},{"line_number":176,"context_line":"releases, named (e.g. ``newton``) or sem-versioned (e.g. ``5.2``)."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":179,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* objects_mapping::"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_04e4cede","line":178,"in_reply_to":"ba5da102_a4ff47a9","updated":"2016-11-10 14:52:18.000000000","message":"What about nested objects?\n\nI tried to do some reading on OVO, and if i understand correctly, the way to do it is mentioned here - https://gorka.eguileor.com/learning-something-new-about-oslo-versioned-objects/.\n\nAn example of nested object are tags, there is a plan to have them - https://review.openstack.org/233357","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"Set version_cap to pinned version"},{"line_number":193,"context_line":":::::::::::::::::::::::::::::::::"},{"line_number":194,"context_line":"The ``version_cap`` was already added in ``ConductorAPI.__init__()`` and passed"},{"line_number":195,"context_line":"to ``RPCClient`` as an initialize parameter. The ``version_cap`` was used to"},{"line_number":196,"context_line":"determine the maximum requested message version ``RPCClient`` can send."},{"line_number":197,"context_line":"In order to make a compatible RPC call of previous release, the ``version_cap``"},{"line_number":198,"context_line":"should be set to pinned version rather than the latest ``RPC_API_VERSION``."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_b022d9ff","line":195,"range":{"start_line":195,"start_character":23,"end_line":195,"end_character":33},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/initialize/initialization","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":248,"context_line":"In this case, ``ToVer`` is pinned to ``FromVer``, so"},{"line_number":249,"context_line":"Node._get_target_version() would return version \u00271.14\u0027."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"Convert the passing instance values to the target version"},{"line_number":252,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":253,"context_line":"Based on the target version, an IronicObject instance will convert its values"},{"line_number":254,"context_line":"to correspond to the target version. This will be done via the new method"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_cbbfb8f9","line":251,"range":{"start_line":251,"start_character":8,"end_line":251,"end_character":11},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/the passing/passed","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":255,"context_line":"``IronicObject._fields_make_compatible`` that each IronicObject class"},{"line_number":256,"context_line":"will implement to make itself compatible with previous versions:"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"  _fields_make_compatible(self, values, target_version, db\u003dFalse)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":261,"context_line":"object instance \u0027node\u0027 will make the passing values look like version \u00271.14\u0027,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_cb56d8d1","line":258,"range":{"start_line":258,"start_character":56,"end_line":258,"end_character":64},"updated":"2016-10-05 20:00:53.000000000","message":"I\u0027m not sure I understand what this parameter does (also calls _from_db_object?), but it can wait for the implementation.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":261,"context_line":"object instance \u0027node\u0027 will make the passing values look like version \u00271.14\u0027,"},{"line_number":262,"context_line":"with node.extra \u003d node.fake, and node.fake \u003d None."},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"Save pinned-version values to DB (API/Condutor--\u003e DB)"},{"line_number":265,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":266,"context_line":"During the rolling upgrade when pinned to ``FromVer``, some services will be"},{"line_number":267,"context_line":"running ``ToVer`` while the rest are still running ``FromVer``."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_4b272864","line":264,"range":{"start_line":264,"start_character":38,"end_line":264,"end_character":46},"updated":"2016-10-05 20:00:53.000000000","message":"nit:s/Condutor/Conductor","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":297,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":298,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":299,"context_line":"on the target version."},{"line_number":300,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":301,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":302,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_0b90c042","line":300,"range":{"start_line":300,"start_character":12,"end_line":300,"end_character":26},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/reuslt to sent/result in sending","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":298,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":299,"context_line":"on the target version."},{"line_number":300,"context_line":"But it will reuslt to sent an old version object to ``ToVer`` conductor."},{"line_number":301,"context_line":"So conductor should tolerate to accept old compatible objects."},{"line_number":302,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_eba9d47c","line":301,"range":{"start_line":301,"start_character":20,"end_line":301,"end_character":53},"updated":"2016-10-05 20:00:53.000000000","message":"nit: change this to \"tolerate accepting old, compatible\"","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"2fb8b7ba9d5c5ca97736c71aa6a704fccf683c40","unresolved":false,"context_lines":[{"line_number":304,"context_line":"Alternatives"},{"line_number":305,"context_line":"------------"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"A cold upgrade can be done, but it means the ironic services will not be"},{"line_number":308,"context_line":"available during the upgrade, which may be time consuming."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Data model impact"},{"line_number":311,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa7ab95a_4e713077","line":308,"range":{"start_line":307,"start_character":0,"end_line":308,"end_character":58},"updated":"2016-08-31 07:26:12.000000000","message":"this seems to ignore the fact that one could manually perform a rolling upgrade without downtime right now","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"e30996b618f0d5de43974e3b3b08de44470a702f","unresolved":false,"context_lines":[{"line_number":304,"context_line":"Alternatives"},{"line_number":305,"context_line":"------------"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"A cold upgrade can be done, but it means the ironic services will not be"},{"line_number":308,"context_line":"available during the upgrade, which may be time consuming."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Data model impact"},{"line_number":311,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a89bdaa_066929f9","line":308,"range":{"start_line":307,"start_character":0,"end_line":308,"end_character":58},"in_reply_to":"fa7ab95a_4e713077","updated":"2016-09-13 12:03:53.000000000","message":"Assuming we (the community) do everything right around only adding to the schema, not breaking RPC compatibility, etc. :)","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":316,"context_line":"State Machine Impact"},{"line_number":317,"context_line":"--------------------"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"None"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"REST API impact"},{"line_number":322,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_4be808b5","line":319,"updated":"2016-10-05 20:00:53.000000000","message":"What if we do a rolling upgrade between versions where the state machine changes?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":316,"context_line":"State Machine Impact"},{"line_number":317,"context_line":"--------------------"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"None"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"REST API impact"},{"line_number":322,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_adbe6762","line":319,"in_reply_to":"1a95cdbc_4be808b5","updated":"2016-11-03 20:45:00.000000000","message":"I think things will still work but I haven\u0027t thought about this in detail. If the state machine change is user-visible, it will be guarded by a microversion. And that means to use it requires an upgraded API service -- which won\u0027t happen until after the conductors are upgraded.\n\nIf the state machine change is not user visible, then the change is internal only (adding a new wait state or something?). State machine changes are done at the conductor level (on a per node basis) so I think we should be fine. Is there some case you\u0027re thinking of?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"``version_cap`` will be set to pinned version to make a compatible RPC call of"},{"line_number":336,"context_line":"previous release. Developers should keep this in mind when change an existing"},{"line_number":337,"context_line":"RCP call."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Driver API impact"},{"line_number":340,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_0b052079","line":337,"range":{"start_line":337,"start_character":0,"end_line":337,"end_character":3},"updated":"2016-10-05 20:00:53.000000000","message":"nit: s/RCP/RPC","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":347,"context_line":"Since there is no change to the REST or Driver APIs, there"},{"line_number":348,"context_line":"is no need to change the nova driver. Since ironic should be upgraded before"},{"line_number":349,"context_line":"nova and nova calls ironic using a specific micro version that will still be"},{"line_number":350,"context_line":"supported in the upgraded ironic, everything will work fine and nothing needs"},{"line_number":351,"context_line":"to be changed."},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_8bf93083","line":350,"updated":"2016-10-05 20:00:53.000000000","message":"nit: this is a run on sentence","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":363,"context_line":"Scalability impact"},{"line_number":364,"context_line":"------------------"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"None"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"Performance Impact"},{"line_number":369,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_8b4050a7","line":366,"updated":"2016-10-05 20:00:53.000000000","message":"This will require that users run at least 2 APIs and 2 conductors to have rolling upgrade support. It\u0027s obvious, but it may be worth mentioning.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":363,"context_line":"Scalability impact"},{"line_number":364,"context_line":"------------------"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"None"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"Performance Impact"},{"line_number":369,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_6d80cf8b","line":366,"in_reply_to":"1a95cdbc_8b4050a7","updated":"2016-11-03 20:45:00.000000000","message":"I\u0027m not sure mentioning this falls under \u0027scalability\u0027. Wouldn\u0027t something under here refer to eg two conductors \u0026 two api, and want to scale to 20 conductors \u0026 5 api, how would rolling upgrades affect that?","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0de19a7883e0458def1af262c77371a5d17fcea7","unresolved":false,"context_lines":[{"line_number":368,"context_line":"Performance Impact"},{"line_number":369,"context_line":"------------------"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"None"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"Other deployer impact"},{"line_number":374,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_eb4554b3","line":371,"updated":"2016-10-05 20:00:53.000000000","message":"You mentioned in the introduction that operations against baremetal nodes could take longer during the upgrade.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":394,"context_line":"-----------"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"Primary assignee:"},{"line_number":397,"context_line":"  irc: lintan; \u003ctan-lin-good\u003e"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"Other contributors:"},{"line_number":400,"context_line":"  anyone interested in this is warmly welcome"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_8d528333","line":397,"updated":"2016-11-03 20:45:00.000000000","message":"this needs to change","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":394,"context_line":"-----------"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"Primary assignee:"},{"line_number":397,"context_line":"  irc: lintan; \u003ctan-lin-good\u003e"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"Other contributors:"},{"line_number":400,"context_line":"  anyone interested in this is warmly welcome"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_1652d6dd","line":397,"in_reply_to":"ba5da102_8d528333","updated":"2016-11-14 16:48:08.000000000","message":"Done","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"c98d1364d17d1ef5b7475fcd78cb3312433bbaba","unresolved":false,"context_lines":[{"line_number":397,"context_line":"  irc: lintan; \u003ctan-lin-good\u003e"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"Other contributors:"},{"line_number":400,"context_line":"  anyone interested in this is warmly welcome"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"Work Items"},{"line_number":403,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"1a95cdbc_66725baf","line":400,"range":{"start_line":400,"start_character":2,"end_line":400,"end_character":45},"updated":"2016-10-05 20:10:18.000000000","message":"also, feel free to put me here and assign a few work items. I don\u0027t mind writing lots of documentation. :)","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":397,"context_line":"  irc: lintan; \u003ctan-lin-good\u003e"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"Other contributors:"},{"line_number":400,"context_line":"  anyone interested in this is warmly welcome"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"Work Items"},{"line_number":403,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_d6477e1b","line":400,"range":{"start_line":400,"start_character":2,"end_line":400,"end_character":45},"in_reply_to":"1a95cdbc_66725baf","updated":"2016-11-14 16:48:08.000000000","message":"ok :)","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d9017d669cd5562c9a2a81c0a3834180e0d99389","unresolved":false,"context_lines":[{"line_number":450,"context_line":"  http://docs.openstack.org/developer/ironic/deploy/upgrade-guide.html."},{"line_number":451,"context_line":"* developers. This will describe what a developer needs to know so that"},{"line_number":452,"context_line":"  the rolling upgrade process continues to work."},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"References"},{"line_number":455,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":456,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba5da102_d82b5780","line":453,"updated":"2016-11-03 20:45:00.000000000","message":"If it isn\u0027t mentioned in this document, I wonder if we want to mention that this doesn\u0027t address trying to stop/roll back to a previous release.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"42b89a192b39d7dd112be9b42a9373b657aa83b9","unresolved":false,"context_lines":[{"line_number":450,"context_line":"  http://docs.openstack.org/developer/ironic/deploy/upgrade-guide.html."},{"line_number":451,"context_line":"* developers. This will describe what a developer needs to know so that"},{"line_number":452,"context_line":"  the rolling upgrade process continues to work."},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"References"},{"line_number":455,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":456,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a629dbe_768232ca","line":453,"in_reply_to":"ba5da102_d82b5780","updated":"2016-11-14 16:48:08.000000000","message":"Ok, I put this info in other deployer impact.","commit_id":"d84113e47279d0dc8bbabba3ba75bd47cdb82aa9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contribution guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for users."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Support for rolling upgrades between ironic releases is first discussed,"},{"line_number":82,"context_line":"followed by the proposed rolling upgrade process. The changes that are needed"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_7ab92ae9","line":79,"range":{"start_line":79,"start_character":40,"end_line":79,"end_character":45},"updated":"2016-11-15 15:18:58.000000000","message":"operators","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"538fab8f6293aafe2029e4e1fb365034c7906150","unresolved":false,"context_lines":[{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contribution guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for users."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Support for rolling upgrades between ironic releases is first discussed,"},{"line_number":82,"context_line":"followed by the proposed rolling upgrade process. The changes that are needed"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_b2cafb9f","line":79,"range":{"start_line":79,"start_character":40,"end_line":79,"end_character":45},"in_reply_to":"7a77a97e_7ab92ae9","updated":"2016-11-15 19:34:17.000000000","message":"done","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Rolling upgrades will be supported between:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* Any named release to its latest revision, containing backported bugfixes."},{"line_number":104,"context_line":"  Because those bugfixes can contain improvements to the upgrade process, the"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_95f897e7","line":101,"range":{"start_line":100,"start_character":26,"end_line":101,"end_character":21},"updated":"2016-11-15 15:18:58.000000000","message":"Well, actually it isn\u0027t. It\u0027s typical development pattern in OpenStack, but a lot of operators are upgrading or wishing to upgrade with release skipping.\n\nIt\u0027s not that I\u0027m requesting release skipping support here, just clarifying. :)","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"538fab8f6293aafe2029e4e1fb365034c7906150","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Rolling upgrades will be supported between:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* Named release N to N+1. This is the typical usage when upgrading"},{"line_number":101,"context_line":"  an OpenStack cloud. (N would start with Mitaka if this feature is merged"},{"line_number":102,"context_line":"  in Newton.)"},{"line_number":103,"context_line":"* Any named release to its latest revision, containing backported bugfixes."},{"line_number":104,"context_line":"  Because those bugfixes can contain improvements to the upgrade process, the"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_92d5ff44","line":101,"range":{"start_line":100,"start_character":26,"end_line":101,"end_character":21},"in_reply_to":"7a77a97e_95f897e7","updated":"2016-11-15 19:34:17.000000000","message":"true; will delete that sentence :)","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":110,"context_line":"The rolling upgrade process to upgrade ironic from version ``FromVer`` to the"},{"line_number":111,"context_line":"next version ``ToVer`` is as follows:"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"#. Upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":114,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":115,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":116,"context_line":"   to be documented."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":119,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_357983fd","line":116,"range":{"start_line":113,"start_character":0,"end_line":116,"end_character":20},"updated":"2016-11-15 15:18:58.000000000","message":"You need to deploy ``ToVer`` code in some container or virtualenv first. I guess this will go into ops guide, so nothing to update in the spec.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":115,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":116,"context_line":"   to be documented."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":119,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":120,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_3560a335","line":120,"range":{"start_line":118,"start_character":0,"end_line":120,"end_character":55},"updated":"2016-11-15 15:18:58.000000000","message":"Haven\u0027t you thought about making it autodiscoverable like in Cinder or Nova with version pin set to auto?","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"538fab8f6293aafe2029e4e1fb365034c7906150","unresolved":false,"context_lines":[{"line_number":115,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":116,"context_line":"   to be documented."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":119,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":120,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_d2ecd7c9","line":120,"range":{"start_line":118,"start_character":0,"end_line":120,"end_character":55},"in_reply_to":"7a77a97e_3560a335","updated":"2016-11-15 19:34:17.000000000","message":"++. I was wondering about that too.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":184,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":185,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"* objects_mapping::"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"              {\u0027mitaka\u0027: {\u0027Node\u0027: \u00271.14\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":190,"context_line":"                          \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027},"},{"line_number":191,"context_line":"               \u00275.23\u0027: {\u0027Node\u0027: \u00271.15\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":192,"context_line":"                        \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"* rpc_mapping::"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"              {\u0027mitaka\u0027: \u00271.33\u0027, \u00275.23\u0027: \u00271.33\u0027}"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"Set version_cap to pinned version"},{"line_number":199,"context_line":":::::::::::::::::::::::::::::::::"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_f0e7193e","line":196,"range":{"start_line":187,"start_character":0,"end_line":196,"end_character":48},"updated":"2016-11-15 15:18:58.000000000","message":"Do you need explicit \u0027mitaka\u0027 item if you\u0027re allowing continuous deployment from master? Definitely if versions would be autodetected, that wouldn\u0027t be needed.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"26e0e218725cc1e564d4df305a5e337e93a5704a","unresolved":false,"context_lines":[{"line_number":184,"context_line":"Internally, ironic will maintain a mapping that indicates the RPC and"},{"line_number":185,"context_line":"IronicObject versions associated with each release. Here is an example:"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"* objects_mapping::"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"              {\u0027mitaka\u0027: {\u0027Node\u0027: \u00271.14\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":190,"context_line":"                          \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027},"},{"line_number":191,"context_line":"               \u00275.23\u0027: {\u0027Node\u0027: \u00271.15\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":192,"context_line":"                        \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"* rpc_mapping::"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"              {\u0027mitaka\u0027: \u00271.33\u0027, \u00275.23\u0027: \u00271.33\u0027}"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"Set version_cap to pinned version"},{"line_number":199,"context_line":":::::::::::::::::::::::::::::::::"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_b784220b","line":196,"range":{"start_line":187,"start_character":0,"end_line":196,"end_character":48},"in_reply_to":"7a77a97e_f0e7193e","updated":"2016-11-18 10:24:30.000000000","message":"mitaka would be an alias to use when doing named release upgrades, and you would use release versions (what Tan calls sem-version) to pin versions when continuously deploying a rolling upgrade from master.\n\nWe will implement autodetection at a later stage. It may be useful when you would like to do some automatic rolling upgrades...","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":205,"context_line":"Then each RPC call will customize the request according to the ``version_cap``."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Make use of target_version"},{"line_number":209,"context_line":"::::::::::::::::::::::::::"},{"line_number":210,"context_line":"Object instances will make use of a new value ``target_version`` when"},{"line_number":211,"context_line":"the service interacts with another service."},{"line_number":212,"context_line":"If pinned version was given, the value of ``target_version`` will be set"},{"line_number":213,"context_line":"to a corresponding value in ``objects_mapping``. Otherwise, the value is None."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Object instances were instantiated according to ``VERSION``, so ``FromVer``"},{"line_number":216,"context_line":"and ``ToVer`` services are still running their own version object instances"},{"line_number":217,"context_line":"although the database only contains old record in ``FromVer``."},{"line_number":218,"context_line":"But when they interacting with other services, the passing values of object"},{"line_number":219,"context_line":"instances will be converted to ``target_version`` in below scenarios:"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"* API/Conductor ---------\u003e DB"},{"line_number":222,"context_line":"* API -----------\u003e Users"},{"line_number":223,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"To support this, several methods will be added or changed for"},{"line_number":226,"context_line":"``ironic.objects.base.IronicObject``."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"In the following examples, ``FromVer`` uses version \u00271.14\u0027 of a Node object."},{"line_number":229,"context_line":"``ToVer`` uses version \u00271.15\u0027 of a Node object -- this has a deprecated"},{"line_number":230,"context_line":"``extra`` field and a new ``fake`` field that replaces ``extra``."},{"line_number":231,"context_line":"db_obj[\u0027fake\u0027] and db_obj[\u0027extra\u0027] are the database representations of those"},{"line_number":232,"context_line":"node fields."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"Instantiate services\u0027 version objects"},{"line_number":235,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":236,"context_line":"``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":237,"context_line":"entity to a formal object."},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Then, each IronicObject class will need to implement its own"},{"line_number":240,"context_line":"_from_db_object() to instantiate its own version objects (regardless of"},{"line_number":241,"context_line":"any pinning) from the database."},{"line_number":242,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":243,"context_line":"ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":244,"context_line":"``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":245,"context_line":"node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra \u003d None. Because with"},{"line_number":246,"context_line":"pinning, the db_obj[\u0027fake\u0027] is still empty."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"Get target version"},{"line_number":249,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":250,"context_line":"A new method ``IronicObject._get_target_version()`` will be added."},{"line_number":251,"context_line":"This will return a string, the IronicObject version corresponding to the"},{"line_number":252,"context_line":"pinned release version. If there is no pinning, it will return the"},{"line_number":253,"context_line":"latest version for that IronicObject."},{"line_number":254,"context_line":"In this case, ``ToVer`` is pinned to ``FromVer``, so"},{"line_number":255,"context_line":"Node._get_target_version() would return version \u00271.14\u0027."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Convert passed instance values to the target version"},{"line_number":258,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":259,"context_line":"Based on the target version, an IronicObject instance will convert its values"},{"line_number":260,"context_line":"to correspond to the target version. This will be done via the new method"},{"line_number":261,"context_line":"``IronicObject._fields_make_compatible`` that each IronicObject class"},{"line_number":262,"context_line":"will implement to make itself compatible with previous versions:"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"  _fields_make_compatible(self, values, target_version, db\u003dFalse)"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":267,"context_line":"object instance \u0027node\u0027 will make the passing values look like version \u00271.14\u0027,"},{"line_number":268,"context_line":"with node.extra \u003d node.fake, and node.fake \u003d None."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"Save pinned-version values to DB (API/Conductor--\u003e DB)"},{"line_number":271,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":272,"context_line":"During the rolling upgrade when pinned to ``FromVer``, some services will be"},{"line_number":273,"context_line":"running ``ToVer`` while the rest are still running ``FromVer``."},{"line_number":274,"context_line":"Because these services access the same database and in order to avoid saving"},{"line_number":275,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":276,"context_line":"the unpinning."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"A new method ``IronicObject._obj_get_db_compatible_changes(self)``"},{"line_number":279,"context_line":"will return a dictionary of DB-compatible changed fields and values."},{"line_number":280,"context_line":"These will be compatible with the pinned version."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"Wherever an IronicObject writes to the database (typically in .create() and"},{"line_number":283,"context_line":".save()), it will call ._obj_get_db_compatible_changes() instead of"},{"line_number":284,"context_line":".obj_get_changes(), to get changes that are compatible with the database"},{"line_number":285,"context_line":"(i.e., the database that corresponds to the pinned version)."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"Present the object instance as target version (API ----\u003e Users)"},{"line_number":288,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":289,"context_line":"During the rolling upgrade process, until it is unpinned, the API should return"},{"line_number":290,"context_line":"the same values to users, regardless of whether the API is running ``FromVer``"},{"line_number":291,"context_line":"or ``ToVer``. To do this, ``IronicObject.as_dict()`` will be changed"},{"line_number":292,"context_line":"to return the version of the Object instance corresponding to the"},{"line_number":293,"context_line":"pinned release version."},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":"When ironic-api makes RPC calls to update an object instance (in"},{"line_number":298,"context_line":"ironic.conductor.rpcapi.ConductorAPI: update_node(), update_port() and"},{"line_number":299,"context_line":"update_portgroup()), the object instance `with updates` is passed as a"},{"line_number":300,"context_line":"parameter to the method. After updating the database, an updated object"},{"line_number":301,"context_line":"instance is returned."},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":304,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":305,"context_line":"on the target version."},{"line_number":306,"context_line":"But it will result to sent an old version object to ``ToVer`` conductor."},{"line_number":307,"context_line":"So conductor should tolerate accepting old, compatible objects."},{"line_number":308,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Alternatives"},{"line_number":311,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_f0db9919","line":308,"range":{"start_line":208,"start_character":0,"end_line":308,"end_character":74},"updated":"2016-11-15 15:18:58.000000000","message":"I wonder why you\u0027re following such complicated route? Cinder\u0027s model here is:\n\n* We\u0027re keeping track of objects version history [1].\n* All services are reporting it latest supported objects version to the DB (`services` table).\n* When sending, all objects are backported to the lowest common denominator (as RabbitMQ will decide which service will receive the object). We\u0027re doing that through a simple serializer [2].\n* It\u0027s receiving side responsibility to be able to process older objects. We haven\u0027t really hit any case where this was problematic.\n\n[1] https://github.com/openstack/cinder/blob/d2ec5787253349e89302bd569c4d36d21fb989c3/cinder/objects/base.py#L91-L122\n[2] https://github.com/openstack/cinder/blob/d2ec5787253349e89302bd569c4d36d21fb989c3/cinder/objects/base.py#L461-L505","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"26e0e218725cc1e564d4df305a5e337e93a5704a","unresolved":false,"context_lines":[{"line_number":205,"context_line":"Then each RPC call will customize the request according to the ``version_cap``."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Make use of target_version"},{"line_number":209,"context_line":"::::::::::::::::::::::::::"},{"line_number":210,"context_line":"Object instances will make use of a new value ``target_version`` when"},{"line_number":211,"context_line":"the service interacts with another service."},{"line_number":212,"context_line":"If pinned version was given, the value of ``target_version`` will be set"},{"line_number":213,"context_line":"to a corresponding value in ``objects_mapping``. Otherwise, the value is None."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Object instances were instantiated according to ``VERSION``, so ``FromVer``"},{"line_number":216,"context_line":"and ``ToVer`` services are still running their own version object instances"},{"line_number":217,"context_line":"although the database only contains old record in ``FromVer``."},{"line_number":218,"context_line":"But when they interacting with other services, the passing values of object"},{"line_number":219,"context_line":"instances will be converted to ``target_version`` in below scenarios:"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"* API/Conductor ---------\u003e DB"},{"line_number":222,"context_line":"* API -----------\u003e Users"},{"line_number":223,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"To support this, several methods will be added or changed for"},{"line_number":226,"context_line":"``ironic.objects.base.IronicObject``."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"In the following examples, ``FromVer`` uses version \u00271.14\u0027 of a Node object."},{"line_number":229,"context_line":"``ToVer`` uses version \u00271.15\u0027 of a Node object -- this has a deprecated"},{"line_number":230,"context_line":"``extra`` field and a new ``fake`` field that replaces ``extra``."},{"line_number":231,"context_line":"db_obj[\u0027fake\u0027] and db_obj[\u0027extra\u0027] are the database representations of those"},{"line_number":232,"context_line":"node fields."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"Instantiate services\u0027 version objects"},{"line_number":235,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":236,"context_line":"``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":237,"context_line":"entity to a formal object."},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Then, each IronicObject class will need to implement its own"},{"line_number":240,"context_line":"_from_db_object() to instantiate its own version objects (regardless of"},{"line_number":241,"context_line":"any pinning) from the database."},{"line_number":242,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":243,"context_line":"ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":244,"context_line":"``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":245,"context_line":"node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra \u003d None. Because with"},{"line_number":246,"context_line":"pinning, the db_obj[\u0027fake\u0027] is still empty."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"Get target version"},{"line_number":249,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":250,"context_line":"A new method ``IronicObject._get_target_version()`` will be added."},{"line_number":251,"context_line":"This will return a string, the IronicObject version corresponding to the"},{"line_number":252,"context_line":"pinned release version. If there is no pinning, it will return the"},{"line_number":253,"context_line":"latest version for that IronicObject."},{"line_number":254,"context_line":"In this case, ``ToVer`` is pinned to ``FromVer``, so"},{"line_number":255,"context_line":"Node._get_target_version() would return version \u00271.14\u0027."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Convert passed instance values to the target version"},{"line_number":258,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":259,"context_line":"Based on the target version, an IronicObject instance will convert its values"},{"line_number":260,"context_line":"to correspond to the target version. This will be done via the new method"},{"line_number":261,"context_line":"``IronicObject._fields_make_compatible`` that each IronicObject class"},{"line_number":262,"context_line":"will implement to make itself compatible with previous versions:"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"  _fields_make_compatible(self, values, target_version, db\u003dFalse)"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":267,"context_line":"object instance \u0027node\u0027 will make the passing values look like version \u00271.14\u0027,"},{"line_number":268,"context_line":"with node.extra \u003d node.fake, and node.fake \u003d None."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"Save pinned-version values to DB (API/Conductor--\u003e DB)"},{"line_number":271,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":272,"context_line":"During the rolling upgrade when pinned to ``FromVer``, some services will be"},{"line_number":273,"context_line":"running ``ToVer`` while the rest are still running ``FromVer``."},{"line_number":274,"context_line":"Because these services access the same database and in order to avoid saving"},{"line_number":275,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":276,"context_line":"the unpinning."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"A new method ``IronicObject._obj_get_db_compatible_changes(self)``"},{"line_number":279,"context_line":"will return a dictionary of DB-compatible changed fields and values."},{"line_number":280,"context_line":"These will be compatible with the pinned version."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"Wherever an IronicObject writes to the database (typically in .create() and"},{"line_number":283,"context_line":".save()), it will call ._obj_get_db_compatible_changes() instead of"},{"line_number":284,"context_line":".obj_get_changes(), to get changes that are compatible with the database"},{"line_number":285,"context_line":"(i.e., the database that corresponds to the pinned version)."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"Present the object instance as target version (API ----\u003e Users)"},{"line_number":288,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":289,"context_line":"During the rolling upgrade process, until it is unpinned, the API should return"},{"line_number":290,"context_line":"the same values to users, regardless of whether the API is running ``FromVer``"},{"line_number":291,"context_line":"or ``ToVer``. To do this, ``IronicObject.as_dict()`` will be changed"},{"line_number":292,"context_line":"to return the version of the Object instance corresponding to the"},{"line_number":293,"context_line":"pinned release version."},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":"When ironic-api makes RPC calls to update an object instance (in"},{"line_number":298,"context_line":"ironic.conductor.rpcapi.ConductorAPI: update_node(), update_port() and"},{"line_number":299,"context_line":"update_portgroup()), the object instance `with updates` is passed as a"},{"line_number":300,"context_line":"parameter to the method. After updating the database, an updated object"},{"line_number":301,"context_line":"instance is returned."},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":304,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":305,"context_line":"on the target version."},{"line_number":306,"context_line":"But it will result to sent an old version object to ``ToVer`` conductor."},{"line_number":307,"context_line":"So conductor should tolerate accepting old, compatible objects."},{"line_number":308,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Alternatives"},{"line_number":311,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_83cd2433","line":308,"range":{"start_line":208,"start_character":0,"end_line":308,"end_character":74},"in_reply_to":"7a77a97e_32f34ba0","updated":"2016-11-18 10:24:30.000000000","message":"I agree it was overly complicated, particularly with introduction of \"conversion of values\" (line 257). It is unnecessary or even inexpedient, because you would like for the rest of the code, outside versioned objects to have a consistent version of the object it interacts with.\n\nI updated this section to more closely follow cinder\u0027s approach.\n\nI also don\u0027t think the change to return different results by the API service when pinned to different versions is good. It would result in changing the API without changing the API version! I think we shouldn\u0027t mix RPC communication, which is an internal ironic thing, with the external HTTP API versioning. So I\u0027m removing this section.\n\nTan also wanted to introduce some structure to api/conductor -\u003e DB communication which I think we should keep. I think I found a flaw in that, because \"unpinning\" is not an atomic operation, so I extended this paragraph to take this into account.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"538fab8f6293aafe2029e4e1fb365034c7906150","unresolved":false,"context_lines":[{"line_number":205,"context_line":"Then each RPC call will customize the request according to the ``version_cap``."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Make use of target_version"},{"line_number":209,"context_line":"::::::::::::::::::::::::::"},{"line_number":210,"context_line":"Object instances will make use of a new value ``target_version`` when"},{"line_number":211,"context_line":"the service interacts with another service."},{"line_number":212,"context_line":"If pinned version was given, the value of ``target_version`` will be set"},{"line_number":213,"context_line":"to a corresponding value in ``objects_mapping``. Otherwise, the value is None."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"Object instances were instantiated according to ``VERSION``, so ``FromVer``"},{"line_number":216,"context_line":"and ``ToVer`` services are still running their own version object instances"},{"line_number":217,"context_line":"although the database only contains old record in ``FromVer``."},{"line_number":218,"context_line":"But when they interacting with other services, the passing values of object"},{"line_number":219,"context_line":"instances will be converted to ``target_version`` in below scenarios:"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"* API/Conductor ---------\u003e DB"},{"line_number":222,"context_line":"* API -----------\u003e Users"},{"line_number":223,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"To support this, several methods will be added or changed for"},{"line_number":226,"context_line":"``ironic.objects.base.IronicObject``."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"In the following examples, ``FromVer`` uses version \u00271.14\u0027 of a Node object."},{"line_number":229,"context_line":"``ToVer`` uses version \u00271.15\u0027 of a Node object -- this has a deprecated"},{"line_number":230,"context_line":"``extra`` field and a new ``fake`` field that replaces ``extra``."},{"line_number":231,"context_line":"db_obj[\u0027fake\u0027] and db_obj[\u0027extra\u0027] are the database representations of those"},{"line_number":232,"context_line":"node fields."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"Instantiate services\u0027 version objects"},{"line_number":235,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":236,"context_line":"``IronicObject._from_db_object(obj, db_object)`` converts a database"},{"line_number":237,"context_line":"entity to a formal object."},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Then, each IronicObject class will need to implement its own"},{"line_number":240,"context_line":"_from_db_object() to instantiate its own version objects (regardless of"},{"line_number":241,"context_line":"any pinning) from the database."},{"line_number":242,"context_line":"In this case, ``FromVer`` will instantiate version \u00271.14\u0027 of Node object,"},{"line_number":243,"context_line":"ignoring db_obj[\u0027fake\u0027] but setting node.extra \u003d db_obj[\u0027extra\u0027]."},{"line_number":244,"context_line":"``ToVer`` will instantiate version \u00271.15\u0027 of the Node object, setting"},{"line_number":245,"context_line":"node.fake \u003d db_obj[\u0027extra\u0027] and setting node.extra \u003d None. Because with"},{"line_number":246,"context_line":"pinning, the db_obj[\u0027fake\u0027] is still empty."},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"Get target version"},{"line_number":249,"context_line":"~~~~~~~~~~~~~~~~~~"},{"line_number":250,"context_line":"A new method ``IronicObject._get_target_version()`` will be added."},{"line_number":251,"context_line":"This will return a string, the IronicObject version corresponding to the"},{"line_number":252,"context_line":"pinned release version. If there is no pinning, it will return the"},{"line_number":253,"context_line":"latest version for that IronicObject."},{"line_number":254,"context_line":"In this case, ``ToVer`` is pinned to ``FromVer``, so"},{"line_number":255,"context_line":"Node._get_target_version() would return version \u00271.14\u0027."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"Convert passed instance values to the target version"},{"line_number":258,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":259,"context_line":"Based on the target version, an IronicObject instance will convert its values"},{"line_number":260,"context_line":"to correspond to the target version. This will be done via the new method"},{"line_number":261,"context_line":"``IronicObject._fields_make_compatible`` that each IronicObject class"},{"line_number":262,"context_line":"will implement to make itself compatible with previous versions:"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"  _fields_make_compatible(self, values, target_version, db\u003dFalse)"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"In this case, since ``ToVer`` is pinned to ``FromVer``, a ``ToVer`` Node"},{"line_number":267,"context_line":"object instance \u0027node\u0027 will make the passing values look like version \u00271.14\u0027,"},{"line_number":268,"context_line":"with node.extra \u003d node.fake, and node.fake \u003d None."},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"Save pinned-version values to DB (API/Conductor--\u003e DB)"},{"line_number":271,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":272,"context_line":"During the rolling upgrade when pinned to ``FromVer``, some services will be"},{"line_number":273,"context_line":"running ``ToVer`` while the rest are still running ``FromVer``."},{"line_number":274,"context_line":"Because these services access the same database and in order to avoid saving"},{"line_number":275,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":276,"context_line":"the unpinning."},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"A new method ``IronicObject._obj_get_db_compatible_changes(self)``"},{"line_number":279,"context_line":"will return a dictionary of DB-compatible changed fields and values."},{"line_number":280,"context_line":"These will be compatible with the pinned version."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"Wherever an IronicObject writes to the database (typically in .create() and"},{"line_number":283,"context_line":".save()), it will call ._obj_get_db_compatible_changes() instead of"},{"line_number":284,"context_line":".obj_get_changes(), to get changes that are compatible with the database"},{"line_number":285,"context_line":"(i.e., the database that corresponds to the pinned version)."},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"Present the object instance as target version (API ----\u003e Users)"},{"line_number":288,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":289,"context_line":"During the rolling upgrade process, until it is unpinned, the API should return"},{"line_number":290,"context_line":"the same values to users, regardless of whether the API is running ``FromVer``"},{"line_number":291,"context_line":"or ``ToVer``. To do this, ``IronicObject.as_dict()`` will be changed"},{"line_number":292,"context_line":"to return the version of the Object instance corresponding to the"},{"line_number":293,"context_line":"pinned release version."},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":"When ironic-api makes RPC calls to update an object instance (in"},{"line_number":298,"context_line":"ironic.conductor.rpcapi.ConductorAPI: update_node(), update_port() and"},{"line_number":299,"context_line":"update_portgroup()), the object instance `with updates` is passed as a"},{"line_number":300,"context_line":"parameter to the method. After updating the database, an updated object"},{"line_number":301,"context_line":"instance is returned."},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"So it could happen that ``FromVer`` API get a \u00271.15\u0027 Node object from"},{"line_number":304,"context_line":"a ``ToVer`` Conductor. So IronicObjectSerializer has to convert instance based"},{"line_number":305,"context_line":"on the target version."},{"line_number":306,"context_line":"But it will result to sent an old version object to ``ToVer`` conductor."},{"line_number":307,"context_line":"So conductor should tolerate accepting old, compatible objects."},{"line_number":308,"context_line":"destroy_port() and destroy_portgroup() RPC call are also affected by this."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Alternatives"},{"line_number":311,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_32f34ba0","line":308,"range":{"start_line":208,"start_character":0,"end_line":308,"end_character":74},"in_reply_to":"7a77a97e_f0db9919","updated":"2016-11-15 19:34:17.000000000","message":"I think this is a good question. The original author is no longer available to ask that question of him. We need to look into it.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":327,"context_line":"REST API impact"},{"line_number":328,"context_line":"---------------"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"During the upgrade process, the API may return information corresponding"},{"line_number":331,"context_line":"to older objects, rather than the newer information that it supports. After"},{"line_number":332,"context_line":"unpinning, the newer information will be available."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Client (CLI) impact"},{"line_number":335,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_10f01590","line":332,"range":{"start_line":330,"start_character":0,"end_line":332,"end_character":51},"updated":"2016-11-15 15:18:58.000000000","message":"In Cinder we\u0027re thinking of some kind of microversion pinning to prevent that. It\u0027s not implemented yet however.","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"98936db30337408d689647d44204c231e27bd036","unresolved":false,"context_lines":[{"line_number":445,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":446,"context_line":"  continues to work between \u003dfromVer\u003d to \u003dtoVer\u003d."},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":449,"context_line":"    ironic-api only."},{"line_number":450,"context_line":"  * Node A will be upgraded to using \u003dtoVer\u003d and then we can test the"},{"line_number":451,"context_line":"    interaction of \u003dfromVer\u003d and \u003dtoVer\u003d ironic-api services with \u003dtoVer\u003d"},{"line_number":452,"context_line":"    version of ironic-conductor"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_2b9be2ca","line":449,"range":{"start_line":448,"start_character":0,"end_line":449,"end_character":20},"updated":"2016-11-15 15:18:58.000000000","message":"Maybe I\u0027m misunderstanding something, but how are you supposed to test a deployment with two versions of ironic-api in a deterministic way? Only way of doing deterministic tests is to keep only one instance of each service. Otherwise you don\u0027t know where the particular request will go (HAProxy or RabbitMQ will decide that).","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"538fab8f6293aafe2029e4e1fb365034c7906150","unresolved":false,"context_lines":[{"line_number":445,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":446,"context_line":"  continues to work between \u003dfromVer\u003d to \u003dtoVer\u003d."},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":449,"context_line":"    ironic-api only."},{"line_number":450,"context_line":"  * Node A will be upgraded to using \u003dtoVer\u003d and then we can test the"},{"line_number":451,"context_line":"    interaction of \u003dfromVer\u003d and \u003dtoVer\u003d ironic-api services with \u003dtoVer\u003d"},{"line_number":452,"context_line":"    version of ironic-conductor"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7a77a97e_2f59245b","line":449,"range":{"start_line":448,"start_character":0,"end_line":449,"end_character":20},"in_reply_to":"7a77a97e_2b9be2ca","updated":"2016-11-15 19:34:17.000000000","message":"Both ironic-api services will be configured to point to the same ironic-conductor. Requests can be sent directly to either nodeA.ironic-api or nodeB.ironic-api. Is that what you\u0027re asking?","commit_id":"ce67b6036e3dc8a4b2d9c3a928b91e8823060425"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"307f88bc73e2ef65ea06d27a7cdb7616ea0cd5b3","unresolved":false,"context_lines":[{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"   `TODO: look into Cinder/Nova\u0027s autodiscoverability with config option"},{"line_number":122,"context_line":"   [upgrade_level]compute\u003dauto.`"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_d2476c49","line":122,"range":{"start_line":121,"start_character":3,"end_line":122,"end_character":32},"updated":"2016-11-16 01:35:50.000000000","message":"To the best of my knowledge, Nova uses config option [upgrade_level]compute\u003dauto. But Cinder uses ``services`` table to store the versions of cinder-* services. Let\u0027s see what Michal\u0027s comments are.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"8c686c3cb2a2cc481202da2716a8b136b5cf161f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"   `TODO: look into Cinder/Nova\u0027s autodiscoverability with config option"},{"line_number":122,"context_line":"   [upgrade_level]compute\u003dauto.`"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_a5240f60","line":122,"range":{"start_line":121,"start_character":3,"end_line":122,"end_character":32},"in_reply_to":"7a77a97e_61dcf212","updated":"2016-11-17 14:52:25.000000000","message":"Both nova and cinder do this by scanning the services table, read the versions values of all services and pin to the min() version.\n\nIronic currently doesn\u0027t have a services table. We could add a version column in the conductors table, but this wouldn\u0027t take api services into account... So it may require some refactoring before we implement auto-discovery of running versions.\n\nWe can add this auto-discovery option at a later time, with followup patches.\n\nI think it\u0027s better to have the configuration option (like nova does), to have the ability to override any issues with the service (conductor) table records that Michal mentioned. It would also serve as additional documentation for operators even after we implement the auto-discovery feature.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"798a9fdbd96ecd0797fdeac7ca05a04ee69fd2cc","unresolved":false,"context_lines":[{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"   `TODO: look into Cinder/Nova\u0027s autodiscoverability with config option"},{"line_number":122,"context_line":"   [upgrade_level]compute\u003dauto.`"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_7cb6e3f9","line":122,"range":{"start_line":121,"start_character":3,"end_line":122,"end_character":32},"in_reply_to":"7a77a97e_a5240f60","updated":"2016-11-18 12:50:21.000000000","message":"Cinder doesn\u0027t care about cinder-api version either. API service doesn\u0027t expose RPC API, so it\u0027s irrelevant for compatibility purposes.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1ada4a4c754a5cb9dc7344b7dbd95ba03e897cce","unresolved":false,"context_lines":[{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"   `TODO: look into Cinder/Nova\u0027s autodiscoverability with config option"},{"line_number":122,"context_line":"   [upgrade_level]compute\u003dauto.`"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"#. Upgrade ironic-conductor services, one at a time."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_61dcf212","line":122,"range":{"start_line":121,"start_character":3,"end_line":122,"end_character":32},"in_reply_to":"7a77a97e_d2476c49","updated":"2016-11-16 11:02:16.000000000","message":"Yes, exactly. Basically in Cinder we went directly into ``auto`` route, without implementing manual pinning. It has it\u0027s disadvantages - if user has old, orphaned records in ``services`` table, then well… here be dragons. We\u0027re informing about that in release notes, docs, summit talks, but still people are asking about that.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"307f88bc73e2ef65ea06d27a7cdb7616ea0cd5b3","unresolved":false,"context_lines":[{"line_number":128,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":129,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":130,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":131,"context_line":"   restarting the services. Although it shouldn\u0027t matter in this case, we"},{"line_number":132,"context_line":"   suggest restarting all the ironic-conductor services first, followed by the"},{"line_number":133,"context_line":"   ironic-api services."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_129f24b5","line":131,"range":{"start_line":131,"start_character":28,"end_line":131,"end_character":70},"updated":"2016-11-16 01:35:50.000000000","message":"I think it does matter. By leaving ironic-api services to be the last ones to be updated, we can ensure new version API calls fail at ironic-api level, not somewhere between ironic-api and ironic-conductors.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":11347,"name":"Rui Zang","email":"rui.zang@yandex.com","username":"rzang"},"change_message_id":"204f9e37fbff192cb81a8c8616ae4cc1e3bb4044","unresolved":false,"context_lines":[{"line_number":128,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":129,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":130,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":131,"context_line":"   restarting the services. Although it shouldn\u0027t matter in this case, we"},{"line_number":132,"context_line":"   suggest restarting all the ironic-conductor services first, followed by the"},{"line_number":133,"context_line":"   ironic-api services."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_783bd9d1","line":131,"range":{"start_line":131,"start_character":28,"end_line":131,"end_character":70},"in_reply_to":"7a77a97e_129f24b5","updated":"2016-11-16 02:15:48.000000000","message":"Why should API calls fail? At this moment ironic-api and ironic-conductor instances are all upgrade and can understand \u0027ToVer\u0027 even though some of them is pined to \u0027FromVer\u0027. Pinning to \"FromVer\" only means using \"FromVer\" objects when it talks to others, this does not mean it does not understand \"ToVer\", i.e., it can receive RPC calls in \"ToVer\" at this moment.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"8c686c3cb2a2cc481202da2716a8b136b5cf161f","unresolved":false,"context_lines":[{"line_number":128,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":129,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":130,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":131,"context_line":"   restarting the services. Although it shouldn\u0027t matter in this case, we"},{"line_number":132,"context_line":"   suggest restarting all the ironic-conductor services first, followed by the"},{"line_number":133,"context_line":"   ironic-api services."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_c05bb9f4","line":131,"range":{"start_line":131,"start_character":28,"end_line":131,"end_character":70},"in_reply_to":"7a77a97e_614f92bd","updated":"2016-11-17 14:52:25.000000000","message":"Each of the \"Upgrade ironic-conductor...\", \"Upgrade ironic-api...\" steps involve a restart, I will mention it in a revised spec.\n\nI will also mention that the order of unpinning matters.\n\nThere can be a hypothetical situation where an unpinned api service accepts a request with additional parameters, sends an object to conductor, but if the conductor is still pinned, it may remove the newer attributes, before sending a response back with that object (or use another \"old\" object, which doesn\u0027t have the newly introduced fields).\n\nTo make sure this doesn\u0027t happen, API services should be unpinned last.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"9b8852ba75b0cb2436336861badb86e21f8ed425","unresolved":false,"context_lines":[{"line_number":128,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":129,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":130,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":131,"context_line":"   restarting the services. Although it shouldn\u0027t matter in this case, we"},{"line_number":132,"context_line":"   suggest restarting all the ironic-conductor services first, followed by the"},{"line_number":133,"context_line":"   ironic-api services."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_78d2f901","line":131,"range":{"start_line":131,"start_character":28,"end_line":131,"end_character":70},"in_reply_to":"7a77a97e_783bd9d1","updated":"2016-11-16 04:04:35.000000000","message":"I might be wrong, but my concerns are some new features may required services restarting. If we restart ironic-api services first and new feature requests come in, which are not supported by not-yet-restarted ironic-conductors(even though objects may be handled correctly), we will meet failures which are difficult to discover. To be safe,  restarting ironic-conductor services first is required.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1ada4a4c754a5cb9dc7344b7dbd95ba03e897cce","unresolved":false,"context_lines":[{"line_number":128,"context_line":"#. Unpin RPC and object versions so that the services can now use the latest"},{"line_number":129,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":130,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":131,"context_line":"   restarting the services. Although it shouldn\u0027t matter in this case, we"},{"line_number":132,"context_line":"   suggest restarting all the ironic-conductor services first, followed by the"},{"line_number":133,"context_line":"   ironic-api services."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_614f92bd","line":131,"range":{"start_line":131,"start_character":28,"end_line":131,"end_character":70},"in_reply_to":"7a77a97e_78d2f901","updated":"2016-11-16 11:02:16.000000000","message":"+1 to what Lujin said. If you\u0027re introducing new RPC parameters to support a new feature, then you don\u0027t really want them to be silently dropped anywhere after API passed the request further.\n\nTo prevent that you can either unpin API last, or implement some kind of microversion pinning.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"307f88bc73e2ef65ea06d27a7cdb7616ea0cd5b3","unresolved":false,"context_lines":[{"line_number":161,"context_line":"  DB schema but ``FromVer`` services still contain the dropped field in their"},{"line_number":162,"context_line":"  SQLAlchemy DB model."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"* alter_column like rename or resize is not supported anymore. This has to"},{"line_number":165,"context_line":"  be split into multiple operations, like add column, then remove column."},{"line_number":166,"context_line":"  Some changes may have to be split into multiple releases to maintain"},{"line_number":167,"context_line":"  compatibility with an old SQLAlchemy model."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_929fb44f","line":164,"range":{"start_line":164,"start_character":0,"end_line":164,"end_character":63},"updated":"2016-11-16 01:35:50.000000000","message":"I know Neutron altered \u0027\u0027tenant_id\u0027\u0027 column to \u0027\u0027project_id\u0027\u0027 for compatibility with Keystone V3 in Newton release. The strategy Neutron developers use to keep backward compatibility between these two in Newton and Ocata release is through OVO [1] [2]. Just proposing another possible alternative here.\n\n \n[1]https://github.com/openstack/neutron/blob/master/neutron/objects/utils.py#L18\n[2]https://review.openstack.org/#/c/336518/10/doc/source/devref/objects_usage.rst L474","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"8c686c3cb2a2cc481202da2716a8b136b5cf161f","unresolved":false,"context_lines":[{"line_number":161,"context_line":"  DB schema but ``FromVer`` services still contain the dropped field in their"},{"line_number":162,"context_line":"  SQLAlchemy DB model."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"* alter_column like rename or resize is not supported anymore. This has to"},{"line_number":165,"context_line":"  be split into multiple operations, like add column, then remove column."},{"line_number":166,"context_line":"  Some changes may have to be split into multiple releases to maintain"},{"line_number":167,"context_line":"  compatibility with an old SQLAlchemy model."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_c001f96b","line":164,"range":{"start_line":164,"start_character":0,"end_line":164,"end_character":63},"in_reply_to":"7a77a97e_929fb44f","updated":"2016-11-17 14:52:25.000000000","message":"Neutron doesn\u0027t have a separate api service, and it requires all the conductors (neutron-server) to be taken offline for the duration of the upgrade. You can do a rolling-upgrade of agents because they don\u0027t access the database.\n\nFrom Ocata they are also banning renames, to have the ability to do rolling upgrades of the neutron-server, so this is the last rename that made it into neutron. This is also the same approach nova takes.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"9b8852ba75b0cb2436336861badb86e21f8ed425","unresolved":false,"context_lines":[{"line_number":208,"context_line":"be changed so that the ``version_cap`` is set to a pinned version"},{"line_number":209,"context_line":"(corresponding to the desired release) rather than the latest"},{"line_number":210,"context_line":"``RPC_API_VERSION``. Then each RPC call will customize the request according"},{"line_number":211,"context_line":"to thise ``version_cap``."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"Make use of target_version"}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_182f45f7","line":211,"range":{"start_line":211,"start_character":3,"end_line":211,"end_character":8},"updated":"2016-11-16 04:04:35.000000000","message":"s/thise/this","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"9b8852ba75b0cb2436336861badb86e21f8ed425","unresolved":false,"context_lines":[{"line_number":284,"context_line":"Save pinned-version values to DB (API/Conductor--\u003e DB)"},{"line_number":285,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":286,"context_line":"During the rolling upgrade, some services will be running ``ToVer`` and pinned"},{"line_number":287,"context_line":"to ``ToVer``, while the others are still running ``FromVer``."},{"line_number":288,"context_line":"Since these services access the same database and to avoid saving"},{"line_number":289,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":290,"context_line":"the unpinning."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_181665a7","line":287,"range":{"start_line":287,"start_character":3,"end_line":287,"end_character":12},"updated":"2016-11-16 04:04:35.000000000","message":"``FromVer`` ?","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"d275322e230ad648cc7f095958cdd4d0eeb74eb9","unresolved":false,"context_lines":[{"line_number":284,"context_line":"Save pinned-version values to DB (API/Conductor--\u003e DB)"},{"line_number":285,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":286,"context_line":"During the rolling upgrade, some services will be running ``ToVer`` and pinned"},{"line_number":287,"context_line":"to ``ToVer``, while the others are still running ``FromVer``."},{"line_number":288,"context_line":"Since these services access the same database and to avoid saving"},{"line_number":289,"context_line":"into different columns, ironic won\u0027t save values in new columns until after"},{"line_number":290,"context_line":"the unpinning."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_0b7bea28","line":287,"range":{"start_line":287,"start_character":3,"end_line":287,"end_character":12},"in_reply_to":"7a77a97e_181665a7","updated":"2016-11-18 11:28:47.000000000","message":"Done","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"d275322e230ad648cc7f095958cdd4d0eeb74eb9","unresolved":false,"context_lines":[{"line_number":348,"context_line":""},{"line_number":349,"context_line":"During the upgrade process (while pinning), the API may return information"},{"line_number":350,"context_line":"corresponding to older objects, rather than the newer information that it"},{"line_number":351,"context_line":"supports. After unpinning, the newer information will be available."},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"Client (CLI) impact"},{"line_number":354,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_389f1e60","line":351,"updated":"2016-11-18 11:28:47.000000000","message":"I\u0027m changing this, since I removed the versioned objects \u003c-\u003e user interaction (see patchset 16 comments)","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"d1b5b92ddb80fa3e4f0c2420149812f901b91ffb","unresolved":false,"context_lines":[{"line_number":466,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":467,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":470,"context_line":"    ironic-api only."},{"line_number":471,"context_line":"  * Node A will be upgraded to \u003dtoVer\u003d and then we can test the"},{"line_number":472,"context_line":"    interaction of ``fromVer`` and ``toVer`` ironic-api services with ``toVer``"},{"line_number":473,"context_line":"    version of ironic-conductor."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_6135d2d8","line":470,"range":{"start_line":469,"start_character":0,"end_line":470,"end_character":20},"updated":"2016-11-16 10:57:23.000000000","message":"Continuing discussion from patchset #16:\n\n\u003e Both ironic-api services will be configured to point to the same ironic-conductor. Requests can be sent directly to either nodeA.ironic-api or nodeB.ironic-api. Is that what you\u0027re asking?\n\nYes, exactly. Multinode grenade works more-or-less like that:\n\n* Deploy latest stable DevStack on both primary and sub nodes.\n* Create some resources.\n* Upgrade the primary node.\n* Check if resources still exist.\n* Run tempest.\n* Delete resources.\n\nNow if you\u0027re having API services on both nodes, how do you plan making Tempest address correct ones? You don\u0027t have any HAProxy there that will load-balance the requests. In grenade\u0027s model if you want to test compatibility of new i-api with old i-cond, then you should place i-api on primary and i-cond on sub.\n\nCurrently Grenade can only check compatibility of different versions of services and it\u0027s impossible to check real no-downtime rolling upgrade.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"d275322e230ad648cc7f095958cdd4d0eeb74eb9","unresolved":false,"context_lines":[{"line_number":466,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":467,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"  * Node A will run ironic-api and ironic-conductor and node B will run"},{"line_number":470,"context_line":"    ironic-api only."},{"line_number":471,"context_line":"  * Node A will be upgraded to \u003dtoVer\u003d and then we can test the"},{"line_number":472,"context_line":"    interaction of ``fromVer`` and ``toVer`` ironic-api services with ``toVer``"},{"line_number":473,"context_line":"    version of ironic-conductor."}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a77a97e_b75c227e","line":470,"range":{"start_line":469,"start_character":0,"end_line":470,"end_character":20},"in_reply_to":"7a77a97e_6135d2d8","updated":"2016-11-18 11:28:47.000000000","message":"I agree, I\u0027ll make the changes to take into account what grenade can and can\u0027t do.\n\nWe should definitely think of extending those tests later on, when applying for the new zero-downtime tag, but it\u0027s not yet well defined how to test to get it.","commit_id":"25063d433e9feca7b7ccf118a562ff02b2d39496"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"#. Upgrade code and restart ironic-conductor services, one at a time."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"#. Upgrade code and restart ironic-api services, one at a time."},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_75903496","line":121,"updated":"2016-11-22 18:33:26.000000000","message":"It is probably more like \u0027upgrade code, pin RPC \u0026 IronicObject versions..\u0027, then restart, but I think people will understand. We just need to be clear about it in the admin/upgrade docs.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":227,"context_line":"To support this, several methods will be added or changed for"},{"line_number":228,"context_line":"``ironic.objects.base.IronicObject``."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"Putting it together"},{"line_number":232,"context_line":":::::::::::::::::::"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_0c6abe80","line":230,"updated":"2016-11-23 18:59:36.000000000","message":"Maybe add:\n\nThe target (pinned) version is ignored, and the actual version is used in this scenario:\n\n* API/Conductor \u003c-------- DB","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":227,"context_line":"To support this, several methods will be added or changed for"},{"line_number":228,"context_line":"``ironic.objects.base.IronicObject``."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"Putting it together"},{"line_number":232,"context_line":":::::::::::::::::::"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_b21004aa","line":230,"in_reply_to":"5a74a57a_0c6abe80","updated":"2016-11-25 08:29:18.000000000","message":"I added a section title like that.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":294,"context_line":"(i.e., the database that corresponds to the pinned version)."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"The unpinning operation is not atomic. There can also be a situation, where"},{"line_number":297,"context_line":"all services are running in ``FromVer``, but some of the conductors are"},{"line_number":298,"context_line":"unpinned. On the other extreme, all conductors can be unpinned and some of"},{"line_number":299,"context_line":"api services may still be pinned. Because of this, a service may retrieve or"},{"line_number":300,"context_line":"receive a ``ToVer`` object instance, while it is still pinned to ``FromVer``."}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_a678e0f9","line":297,"updated":"2016-11-22 18:33:26.000000000","message":"I don\u0027t understand this. If the services are all running FromVer code, what might the pinning be for those that are pinned, FromVer-1 version? The unpinned conductors would be using FromVer, right?\n\nOr maybe you mean -- all the services have upgraded their to code to use \u0027ToVer\u0027 and are pinned to FromVer. We start the unpinning, so one or more conductors are now unpinned and using ToVer.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":294,"context_line":"(i.e., the database that corresponds to the pinned version)."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"The unpinning operation is not atomic. There can also be a situation, where"},{"line_number":297,"context_line":"all services are running in ``FromVer``, but some of the conductors are"},{"line_number":298,"context_line":"unpinned. On the other extreme, all conductors can be unpinned and some of"},{"line_number":299,"context_line":"api services may still be pinned. Because of this, a service may retrieve or"},{"line_number":300,"context_line":"receive a ``ToVer`` object instance, while it is still pinned to ``FromVer``."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_dd032d75","line":297,"in_reply_to":"7a77a97e_a678e0f9","updated":"2016-11-23 12:05:22.000000000","message":"Sorry, I ment ToVer","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":296,"context_line":"The unpinning operation is not atomic. There can also be a situation, where"},{"line_number":297,"context_line":"all services are running in ``FromVer``, but some of the conductors are"},{"line_number":298,"context_line":"unpinned. On the other extreme, all conductors can be unpinned and some of"},{"line_number":299,"context_line":"api services may still be pinned. Because of this, a service may retrieve or"},{"line_number":300,"context_line":"receive a ``ToVer`` object instance, while it is still pinned to ``FromVer``."},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_e108022b","line":299,"updated":"2016-11-22 18:33:26.000000000","message":"The \u0027a service may retrieve\u0027 is really only the API service that it can happen to. A service talking to the DB will get the version based on pinning/no pinning. It is in the \u0027API \u003c--\u003e conductor\u0027, where the API service could get a ToVer object from an unpinned conductor, right?\n\n(My guess is that to deal with this, Tan Lin was converting the object at the receiving end, not the sending ending.)","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":296,"context_line":"The unpinning operation is not atomic. There can also be a situation, where"},{"line_number":297,"context_line":"all services are running in ``FromVer``, but some of the conductors are"},{"line_number":298,"context_line":"unpinned. On the other extreme, all conductors can be unpinned and some of"},{"line_number":299,"context_line":"api services may still be pinned. Because of this, a service may retrieve or"},{"line_number":300,"context_line":"receive a ``ToVer`` object instance, while it is still pinned to ``FromVer``."},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_f8671723","line":299,"in_reply_to":"7a77a97e_e108022b","updated":"2016-11-23 12:05:22.000000000","message":"I\u0027m talking here about both retrieving data from DB or receiving it through RPC.\nIn case of retrieving it from a DB, it could happen that one conductor is pinned, the other is not. When data is\n\n1. saved by the unpinned conductor\n2. retrieved and saved by the pinned conductor\n\nand if the pinned conductor assumes the data is in a previous (pinned) version, the resulting state is, that the data is inconsistent.\n\nIt may happen because there was a new column introduced, so:\n\n1. the unpinned conductor saves data into a new column\n2. the pinned conductor reads and updates data in an old column\n\nThe end result is that we don\u0027t know in which column we have the up-to date values. At the same time, if an outdated value was used to calculate a new one, data is lost.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"},{"line_number":303,"context_line":"by a ``ToVer`` service, which is still pinned to ``FromVer``, it should ignore"},{"line_number":304,"context_line":"the globaly configured pin for this instance of the object. The same follows"},{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_017fbe66","line":304,"updated":"2016-11-22 18:33:26.000000000","message":"s/globaly/globally/\n\nSo:\n\nuse target version: api/conductor --\u003e db\nuse actual (unpinned) version: api/conductor \u003c-- db","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"},{"line_number":303,"context_line":"by a ``ToVer`` service, which is still pinned to ``FromVer``, it should ignore"},{"line_number":304,"context_line":"the globaly configured pin for this instance of the object. The same follows"},{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_ec8d987c","line":304,"in_reply_to":"7a77a97e_017fbe66","updated":"2016-11-23 12:05:22.000000000","message":"Yes, and when we get an object from the db, we should save it in it\u0027s actual version, so that we don\u0027t loose data which may have been added to it in the newest version.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"},{"line_number":303,"context_line":"by a ``ToVer`` service, which is still pinned to ``FromVer``, it should ignore"},{"line_number":304,"context_line":"the globaly configured pin for this instance of the object. The same follows"},{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":308,"context_line":"developer, a version column will be introduced to SQLAlchemy models."}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_0c58d2f9","line":305,"updated":"2016-11-22 18:33:26.000000000","message":"This seems contradictory to line 221 above wrt API \u003c---\u003e Conductor. or I am confused :)","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":302,"context_line":"To maintain data consistency, when a ``ToVer`` object is retrieved from the DB"},{"line_number":303,"context_line":"by a ``ToVer`` service, which is still pinned to ``FromVer``, it should ignore"},{"line_number":304,"context_line":"the globaly configured pin for this instance of the object. The same follows"},{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":308,"context_line":"developer, a version column will be introduced to SQLAlchemy models."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_d88edb26","line":305,"in_reply_to":"7a77a97e_0c58d2f9","updated":"2016-11-23 12:05:22.000000000","message":"When a service is pinned, but receives an unpinned object, it can assume, that the \"unpinning\" upgrade phase has started. The service which sent an object through an RPC request was unpinned, so it expects an action or response to complete with any new feautures, as though it was an unpinned object.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":308,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":311,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_a73ac5cb","line":308,"updated":"2016-11-23 18:59:36.000000000","message":"Do you know how nova or cinder handle this? Are they using version columns? By \u0027version column\u0027, I assume it is a column in which we indicate the version of that object?","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":305,"context_line":"for receiving a ``ToVer`` object through RPC."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":308,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":311,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_f25e26e8","line":308,"in_reply_to":"5a74a57a_a73ac5cb","updated":"2016-11-25 08:29:18.000000000","message":"Nova uses the alternative approach I described below. They null the old columns when converting data, so a null in one place is an indicator that the data was or wasn\u0027t converted.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":312,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"In this case, when ``ToVer`` is pinned to ``FromVer`` and it reads a"},{"line_number":315,"context_line":"``FromVer`` Node object instance from the DB, it can check wether the fake"},{"line_number":316,"context_line":"column was written to. If it is, it means the object was saved by an unpinned"},{"line_number":317,"context_line":"instance of the service, so node._unpin(\u00271.15\u0027) is called when instantiating"},{"line_number":318,"context_line":"the object. The version parameter makes sure that the call is ignored in any"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_acd1cafd","line":315,"updated":"2016-11-23 18:59:36.000000000","message":"I think you mean s/FromVer/ToVer/\n\ns/wether/whether/","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":312,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"In this case, when ``ToVer`` is pinned to ``FromVer`` and it reads a"},{"line_number":315,"context_line":"``FromVer`` Node object instance from the DB, it can check wether the fake"},{"line_number":316,"context_line":"column was written to. If it is, it means the object was saved by an unpinned"},{"line_number":317,"context_line":"instance of the service, so node._unpin(\u00271.15\u0027) is called when instantiating"},{"line_number":318,"context_line":"the object. The version parameter makes sure that the call is ignored in any"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_121642a7","line":315,"in_reply_to":"5a74a57a_acd1cafd","updated":"2016-11-25 08:29:18.000000000","message":"Yes :P","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"In this case, when ``ToVer`` is pinned to ``FromVer`` and it reads a"},{"line_number":315,"context_line":"``FromVer`` Node object instance from the DB, it can check wether the fake"},{"line_number":316,"context_line":"column was written to. If it is, it means the object was saved by an unpinned"},{"line_number":317,"context_line":"instance of the service, so node._unpin(\u00271.15\u0027) is called when instantiating"},{"line_number":318,"context_line":"the object. The version parameter makes sure that the call is ignored in any"},{"line_number":319,"context_line":"future releases."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_ac262a14","line":316,"updated":"2016-11-23 18:59:36.000000000","message":"How can we check whether the new column was written to? Do we mark them when the column is added, with some \u0027undef\u0027 marker? (I\u0027m showing my ignorance of DBs here...)","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"In this case, when ``ToVer`` is pinned to ``FromVer`` and it reads a"},{"line_number":315,"context_line":"``FromVer`` Node object instance from the DB, it can check wether the fake"},{"line_number":316,"context_line":"column was written to. If it is, it means the object was saved by an unpinned"},{"line_number":317,"context_line":"instance of the service, so node._unpin(\u00271.15\u0027) is called when instantiating"},{"line_number":318,"context_line":"the object. The version parameter makes sure that the call is ignored in any"},{"line_number":319,"context_line":"future releases."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_c6bfabf9","line":316,"in_reply_to":"5a74a57a_ac262a14","updated":"2016-11-25 08:29:18.000000000","message":"What I had in mind is that when you add a new column, it\u0027s null. So this would usually check for null values, but it would depend on the particular change.\n\nGenerally, columns with default values shouldn\u0027t be added to the DB, because it causes a table lock in most implementations, at writing defaults for all rows in a table takes time. Default values can be added later, with an online migration, and for new data with a second ALTER.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_07b7f939","line":331,"updated":"2016-11-23 18:59:36.000000000","message":"I think if we\u0027re talking about an unpinned conductor, maybe we should clarify that \u0027target version\u0027 is relative to the `FromVer` API (not the conductor), so it is \u0027FromVer\u0027.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_d5b1ea90","line":331,"in_reply_to":"5a74a57a_07b7f939","updated":"2016-11-25 08:29:18.000000000","message":"Done","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"},{"line_number":335,"context_line":"``ToVer`` conductor. So the conductor has to accept and handle older,"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_4ca3aa9e","line":332,"updated":"2016-11-22 18:33:26.000000000","message":"Is this correct then, based on your comment at L296?","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"},{"line_number":335,"context_line":"``ToVer`` conductor. So the conductor has to accept and handle older,"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_acaf0ae2","line":332,"in_reply_to":"5a74a57a_2c095096","updated":"2016-11-23 18:59:36.000000000","message":"So this would happen only if the ``ToVer`` conductor is unpinned, right?\n\nIs this the sequence of events to handle this case:\n\n    API (FromVer) -\u003e RPC -\u003e conductor (unpinned ToVer)\n    conductor -\u003e (1.15 obj) -\u003e RPC -\u003e API\n    API raises eyebrow, err exception -\u003e RPC -\u003e conductor\n    conductor -\u003e (1.14 obj) -\u003e RPC -\u003e API\n\n??","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"},{"line_number":335,"context_line":"``ToVer`` conductor. So the conductor has to accept and handle older,"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_86d213ff","line":332,"in_reply_to":"5a74a57a_acaf0ae2","updated":"2016-11-25 08:29:18.000000000","message":"Exactly.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":329,"context_line":"It could happen that a ``FromVer`` API gets a \u00271.15\u0027 Node object from"},{"line_number":330,"context_line":"a ``ToVer`` Conductor. In this case, IronicObjectSerializer will convert"},{"line_number":331,"context_line":"the object based on the target version, so that the API is dealing with"},{"line_number":332,"context_line":"the correctly versioned node object."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"Likewise, a ``FromVer`` API could send an older version object to a"},{"line_number":335,"context_line":"``ToVer`` conductor. So the conductor has to accept and handle older,"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_2c095096","line":332,"in_reply_to":"7a77a97e_4ca3aa9e","updated":"2016-11-23 12:05:22.000000000","message":"Yes. Because it is a FromVer service, it doesn\u0027t know how to interpret a ToVer object. It raises an exception inside IronicObjectSerializer, which results in a call being made to the conductor object backport method through RPC.\n\nIf the object pinning is in place and the upgrade procedure is followed, this doesn\u0027t happen.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"During the rolling upgrade process, the API services run in different versions"},{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_e1fd626f","line":363,"updated":"2016-11-22 18:33:26.000000000","message":"Compatible in the sense that the older client libraries will be able to handle requests up to the API version that the older ironic version could handle. So an API service running ToVer is backwards compatible and will be able to handle requests for those older API versions.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":360,"context_line":""},{"line_number":361,"context_line":"During the rolling upgrade process, the API services run in different versions"},{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_ec1d98be","line":363,"in_reply_to":"7a77a97e_e1fd626f","updated":"2016-11-23 12:05:22.000000000","message":"Yes.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Client (CLI) impact"},{"line_number":368,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_6176b23f","line":365,"updated":"2016-11-22 18:33:26.000000000","message":"Hmm. If I understand this, I\u0027m not sure how we are going to code it. \n\nWe didn\u0027t mention it, but I think we will want to tweak the code at the API layer so that a pinned API service will not honour any new features (via new API versions) and return some appropriate msg.\n\nFor an unpinned API service... if a user specifies a new API version to this service (even though not ALL the API services have been unpinned), how will ironic know not to make the new functionality available to the user?","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Client (CLI) impact"},{"line_number":368,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_5827cfb5","line":365,"in_reply_to":"5a74a57a_11a81b1f","updated":"2016-11-25 08:29:18.000000000","message":"Done","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cd1f9185caac6ce36e591b39909b111db3deec5d","unresolved":false,"context_lines":[{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Client (CLI) impact"},{"line_number":368,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_11a81b1f","line":365,"in_reply_to":"5a74a57a_ef558a1d","updated":"2016-11-23 18:59:36.000000000","message":"Ah, so you meant this as a FYI to operators. I think it is worth noting the above 2? points then, and documenting them in our future operator documentation about rolling upgrades.\n\nThat during the rolling upgrade, the upgraded (pinned or unpinned, although i think it might be worth coding the pinned so that a more user friendly error is returned, but can defer thinking about this until after!) API service will expose new features via new API versions. However, to ensure that the user/operator experience is the same, we do not recommend issuing requests using the new API versions until after the entire rolling upgrade has been done and all the services are running the new version of code.\n\nand Any ironic client packages (eg python-ironicclient) should be updated only after the rolling upgrade is completed. \n\nI suppose we could add another step after L135, to mention upgrading any ironic client packages.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"97adf550d7c4e9bab25d95ef75e4192c83ad096a","unresolved":false,"context_lines":[{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Client (CLI) impact"},{"line_number":368,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_ef558a1d","line":365,"in_reply_to":"7a77a97e_05e8a0e1","updated":"2016-11-23 12:05:22.000000000","message":"Another option would be to use an old (FromVer) client, which doesn\u0027t know about the new features.\n\nWhat I\u0027m saying here is that other programs, which depend on new API features (rolled out with a new ironic version), should be introduced to the system after ironic upgrade is complete.\n\nI think the operator shouldn\u0027t use the new features before he/she finishes the upgrade. We can\u0027t guarantee a consistent set of API features if he chooses to use them during the upgrade, as they became available.\n\nDo you have a usage case of when that could happen?","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"996444471f8dcc29fb4bffc5a78c9e5ba491401a","unresolved":false,"context_lines":[{"line_number":362,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":363,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":364,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":365,"context_line":"communication versions on all ironic services."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Client (CLI) impact"},{"line_number":368,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_05e8a0e1","line":365,"in_reply_to":"7a77a97e_6176b23f","updated":"2016-11-22 21:06:34.000000000","message":"I agree that this should be clarified a bit more.\n\nIn my mind what would happen here now, based on the order of operations (after all code upgrades, unpin conductor version caps 1 at a time + restart, then unpin API version caps 1 at a time and restart), is that you\u0027ll have some API services that fully support new features and some that don\u0027t mid-upgrade.\n\nThis would lead to inconsistent behavior in the sense that a client using the new API version would have the possibility of succeeding or not succeeding for a new operation depending on which API service they hit (or to which API service a load balancer directs that traffic to).\n\nI\u0027m not sure what the best solution to this issue would be. You could have some sort of smart load balancing that checks max supported API versions during the upgrade and redirects traffic for the new version to fully upgraded APIs, but that shouldn\u0027t be in the scope of the spec.\n\nAnother option could be to require that API services register in the DB at startup and only allow the new version to be used once all known APIs share the same upgraded version, with each API updating the value one at a time. I don\u0027t think that\u0027s an ideal solution either, though.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":483,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":484,"context_line":"  * Resources will be created."},{"line_number":485,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":486,"context_line":"  * Test the interaction of ``fromVer`` ironic-api services with ``toVer``"},{"line_number":487,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"Tests should cover the use cases described in"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_81490eba","line":486,"updated":"2016-11-22 18:33:26.000000000","message":"s/services/service/ (there is only one now)","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4a2f4c479991e6227625db4a6aa45600a1237f0","unresolved":false,"context_lines":[{"line_number":484,"context_line":"  * Resources will be created."},{"line_number":485,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":486,"context_line":"  * Test the interaction of ``fromVer`` ironic-api services with ``toVer``"},{"line_number":487,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"Tests should cover the use cases described in"},{"line_number":490,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a77a97e_818e6ece","line":487,"updated":"2016-11-22 18:33:26.000000000","message":"we\u0027d want to do this twice, same fromver API service, once with pinned conductor, then with unpinned conductor?","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"f8ecad3a72e7bb8ce03250415db3d55e8cf72b00","unresolved":false,"context_lines":[{"line_number":484,"context_line":"  * Resources will be created."},{"line_number":485,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":486,"context_line":"  * Test the interaction of ``fromVer`` ironic-api services with ``toVer``"},{"line_number":487,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"Tests should cover the use cases described in"},{"line_number":490,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":18,"id":"5a74a57a_78ed6b24","line":487,"in_reply_to":"7a77a97e_818e6ece","updated":"2016-11-25 08:29:18.000000000","message":"I added a point like you suggested, this is also what I had in mind in the below statement, but I\u0027m not sure what\u0027s possible in current multi-node grenade.","commit_id":"914eff0a483acd5ee93167bc9e24025ae883d06f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"c9e68aa76ab917bf2f03ea0a770882a76dcdc2f5","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"},{"line_number":8,"context_line":"Support Rolling Upgrade"},{"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"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_1baea3e7","line":8,"updated":"2016-11-29 16:23:49.000000000","message":"I kind of think this should be plural for \"Upgrades\"","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","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"},{"line_number":8,"context_line":"Support Rolling Upgrade"},{"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"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_bc401309","line":8,"in_reply_to":"5a74a57a_1baea3e7","updated":"2016-11-30 16:06:13.000000000","message":"+1, just a nit though","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f1c955169851f0890770d01f45b423be60b499b3","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"},{"line_number":8,"context_line":"Support Rolling Upgrade"},{"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"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_d5ad8f89","line":8,"in_reply_to":"5a74a57a_1c61f4a8","updated":"2016-11-30 22:13:12.000000000","message":"NOOOOO, don\u0027t change the file name. It makes it harder to look at the older patch sets :-(","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"1235561e4c10d705c996998979f38bdeaf5d355b","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"},{"line_number":8,"context_line":"Support Rolling Upgrade"},{"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"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_1c61f4a8","line":8,"in_reply_to":"5a74a57a_bc401309","updated":"2016-11-30 21:14:17.000000000","message":"If you make this change, please change the filename too :).","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d297385534fc6635eaaf9c5cd3ca264ce85f4f97","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"},{"line_number":8,"context_line":"Support Rolling Upgrade"},{"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"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/1526283"}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_5a95633e","line":8,"in_reply_to":"5a74a57a_d5ad8f89","updated":"2016-12-01 13:55:26.000000000","message":"Agree, let\u0027s wait to change the file name","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":74,"context_line":"To support rolling upgrade for ironic, the following are needed:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contribution guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for operators."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_3c9fa360","line":77,"updated":"2016-11-30 16:06:13.000000000","message":"and reviewers :)","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":74,"context_line":"To support rolling upgrade for ironic, the following are needed:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"* code changes"},{"line_number":77,"context_line":"* a contribution guide for developers"},{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for operators."},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_afaabb17","line":77,"in_reply_to":"5a74a57a_3c9fa360","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Rolling upgrades between releases"},{"line_number":87,"context_line":"---------------------------------"},{"line_number":88,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."},{"line_number":89,"context_line":"The releases are semantic-versioned [7]_, in the form \u003cmajor\u003e.\u003cminor\u003e."},{"line_number":90,"context_line":"We refer to a \"named release\" of ironic as the release associated with a"},{"line_number":91,"context_line":"development cycle like Mitaka."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_dc86af12","line":89,"updated":"2016-11-30 16:06:13.000000000","message":"nit: \u003cmajor\u003e.\u003cminor\u003e.\u003cpatch\u003e","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Rolling upgrades between releases"},{"line_number":87,"context_line":"---------------------------------"},{"line_number":88,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."},{"line_number":89,"context_line":"The releases are semantic-versioned [7]_, in the form \u003cmajor\u003e.\u003cminor\u003e."},{"line_number":90,"context_line":"We refer to a \"named release\" of ironic as the release associated with a"},{"line_number":91,"context_line":"development cycle like Mitaka."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_6f77c3d4","line":89,"in_reply_to":"5a74a57a_dc86af12","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":93,"context_line":"In addition, ironic follows the standard deprecation policy [8]_, which says"},{"line_number":94,"context_line":"that the deprecation period must be at least three months and a cycle"},{"line_number":95,"context_line":"boundary. This means that there will never be anything that is both"},{"line_number":96,"context_line":"deprecated *and* removed between two named releases."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"Rolling upgrades will be supported between:"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_fcc9ab5b","line":96,"updated":"2016-11-30 16:06:13.000000000","message":"++ thank you for making this clear, many people overlook this.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":132,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":133,"context_line":"   that all DB records are \"upgraded\" to the new data version."},{"line_number":134,"context_line":"   This new command is discussed in a separate RFE [12]_ (and is a dependency"},{"line_number":135,"context_line":"   for this work)."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"#. Upgrade ironic client libraries and other services which use the newly"},{"line_number":138,"context_line":"   introduced API features and depend on the new version."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_1c6ae71a","line":135,"updated":"2016-11-30 16:06:13.000000000","message":"Hm, I\u0027d almost rather that work be bundled in here, but not a big deal.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":148,"context_line":"``````````````````````````"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"This is not a code change but it impacts the SQLAlchemy DB model."},{"line_number":151,"context_line":"This new DB model change policy is as follows:"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_50efe3af","line":151,"updated":"2016-11-30 16:06:13.000000000","message":"Can we note that this needs to be documented well for devs/reviewers?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":148,"context_line":"``````````````````````````"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"This is not a code change but it impacts the SQLAlchemy DB model."},{"line_number":151,"context_line":"This new DB model change policy is as follows:"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* Adding new items to the DB model is supported."},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_dae89319","line":151,"in_reply_to":"5a74a57a_50efe3af","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* some implementations of ALTER TABLE like adding foreign keys in PostgreSQL"},{"line_number":169,"context_line":"  may impose table locks and cause downtime. These cases must be mentioned"},{"line_number":170,"context_line":"  in release notes."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_50a7e34e","line":170,"updated":"2016-11-30 16:06:13.000000000","message":"Or should we avoid them? (I\u0027m not sure, but wanted to put the question out there)","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be541b5dae967dde231115d3e26cc6ba01678107","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* some implementations of ALTER TABLE like adding foreign keys in PostgreSQL"},{"line_number":169,"context_line":"  may impose table locks and cause downtime. These cases must be mentioned"},{"line_number":170,"context_line":"  in release notes."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_9f98a46c","line":170,"in_reply_to":"5a74a57a_50a7e34e","updated":"2016-11-30 16:28:18.000000000","message":"There are two ways to deal with this. 1. Just avoid it. and re-open the discussion when/if there is a need.\n2. Mention it but say that we strongly advise not using it.\n\nHaving written that, I think I agree, let\u0027s just avoid them. So eg \u0027ALTER TABLE is not supported. This is because implementations ... and cause downtime\u0027.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* some implementations of ALTER TABLE like adding foreign keys in PostgreSQL"},{"line_number":169,"context_line":"  may impose table locks and cause downtime. These cases must be mentioned"},{"line_number":170,"context_line":"  in release notes."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_baaaf76e","line":170,"in_reply_to":"5a74a57a_9c6d049c","updated":"2016-12-01 14:39:28.000000000","message":"I modified it so that it states we should do locking alters only if they cannot be otherwise avoided.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"1235561e4c10d705c996998979f38bdeaf5d355b","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"* some implementations of ALTER TABLE like adding foreign keys in PostgreSQL"},{"line_number":169,"context_line":"  may impose table locks and cause downtime. These cases must be mentioned"},{"line_number":170,"context_line":"  in release notes."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"RPC and object version pinning"},{"line_number":173,"context_line":"``````````````````````````````"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_9c6d049c","line":170,"in_reply_to":"5a74a57a_9f98a46c","updated":"2016-11-30 21:14:17.000000000","message":"+1 to disallowing ALTER TABLE","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":19213,"name":"Szymon Borkowski","email":"szymon.borkowski@intel.com","username":"sborkows"},"change_message_id":"41a9995d78fc6f66e430251139f46db28567c3c9","unresolved":false,"context_lines":[{"line_number":218,"context_line":"to a corresponding value in ``objects_mapping``. Otherwise, the value is None."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"Object instances are instantiated according to ``VERSION``, so ``FromVer``"},{"line_number":221,"context_line":"and ``ToVer`` services are still running their own version object instances"},{"line_number":222,"context_line":"although, at first, the database only contains old records in ``FromVer``."},{"line_number":223,"context_line":"When services interact, the serialized object instances will be converted to"},{"line_number":224,"context_line":"``target_version`` in these scenarios:"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_a8afa328","line":222,"range":{"start_line":221,"start_character":51,"end_line":222,"end_character":9},"updated":"2016-11-25 14:22:41.000000000","message":"s/instances although/instances. However","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":218,"context_line":"to a corresponding value in ``objects_mapping``. Otherwise, the value is None."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"Object instances are instantiated according to ``VERSION``, so ``FromVer``"},{"line_number":221,"context_line":"and ``ToVer`` services are still running their own version object instances"},{"line_number":222,"context_line":"although, at first, the database only contains old records in ``FromVer``."},{"line_number":223,"context_line":"When services interact, the serialized object instances will be converted to"},{"line_number":224,"context_line":"``target_version`` in these scenarios:"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_da2a53e7","line":222,"range":{"start_line":221,"start_character":51,"end_line":222,"end_character":9},"in_reply_to":"5a74a57a_a8afa328","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d7f0464a640f2f3f64abba11b5bd4765faaf645b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"When services interact, the serialized object instances will be converted to"},{"line_number":224,"context_line":"``target_version`` in these scenarios:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* API/Conductor \u003c-------\u003e DB"},{"line_number":227,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"To support this, several methods will be added or changed for"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_cf4813cf","line":226,"updated":"2016-11-28 21:02:54.000000000","message":"I don\u0027t think this is correct. The instance is only converted to target version in API/Conductor --\u003e DB.\n\nWhen going the other way, we\u0027re using the actual version, not the target version: API/Conductor \u003c-- DB. (Line 298).\n\nWould it be easier to depict as something like:\n\n  When services interact, the serialized object instances will be converted in these scenarios as follows:\n\n  * API/Conductor -- target version --\u003e DB\n  * API/Conductor \u003c-- actual version -- DB\n\nAnd I\u0027m not sure how to depict API \u003c-----\u003e Conductor because it isn\u0027t that straightforward. I guess at the end of the day, it ends up after some bouncing around, like this?\n\n  * API \u003c-- target version --\u003e Conductor\n\n---\n\nI\u0027d be fine if you wanted to delete the sentence from L223.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":223,"context_line":"When services interact, the serialized object instances will be converted to"},{"line_number":224,"context_line":"``target_version`` in these scenarios:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* API/Conductor \u003c-------\u003e DB"},{"line_number":227,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"To support this, several methods will be added or changed for"}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_d5dce41a","line":226,"in_reply_to":"5a74a57a_9eb53c33","updated":"2016-12-01 14:39:28.000000000","message":"I removed the graphical depictions here because they would get too complicated and fixed the sentence.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5ddc89bc5af65b99fd3f9db6d73edac1e270f4d","unresolved":false,"context_lines":[{"line_number":223,"context_line":"When services interact, the serialized object instances will be converted to"},{"line_number":224,"context_line":"``target_version`` in these scenarios:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"* API/Conductor \u003c-------\u003e DB"},{"line_number":227,"context_line":"* API \u003c-------\u003e Conductor"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"To support this, several methods will be added or changed for"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_9eb53c33","line":226,"in_reply_to":"5a74a57a_cf4813cf","updated":"2016-11-29 18:11:47.000000000","message":"I think I see your point. The conversions to \"target_version\" are only done by the new code release (when pinned), but the new release also supports reading data in both old and new versions, which we call the \"actual version\".","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3e0eab5ebe65115ad3bdae6f123727c232c27034","unresolved":false,"context_lines":[{"line_number":328,"context_line":"version. The same follows for receiving a ``ToVer`` object through RPC."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"In short, use target version: api/conductor --\u003e db (when creating a new object)"},{"line_number":331,"context_line":"use actual (unpinned) version: api/conductor \u003c-- db."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"When we receive an unpinned object, we should save it in it\u0027s actual version,"},{"line_number":334,"context_line":"so that we don\u0027t loose data which may have been added to it in ``ToVer``."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_24f1ae6b","line":331,"updated":"2016-11-28 20:54:17.000000000","message":"nit s/use/and use/ ?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3e0eab5ebe65115ad3bdae6f123727c232c27034","unresolved":false,"context_lines":[{"line_number":331,"context_line":"use actual (unpinned) version: api/conductor \u003c-- db."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"When we receive an unpinned object, we should save it in it\u0027s actual version,"},{"line_number":334,"context_line":"so that we don\u0027t loose data which may have been added to it in ``ToVer``."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_64d006ca","line":334,"updated":"2016-11-28 20:54:17.000000000","message":"nit s/loose/lose/","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3e0eab5ebe65115ad3bdae6f123727c232c27034","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_afc2f782","line":339,"updated":"2016-11-28 20:54:17.000000000","message":"We should decide in this spec, whether to go with the above version column or with this alternative.\n\nI prefer this alternative because 1. nova uses this and we love nova; 2. it doesn\u0027t add a new column that is just used for versioning. (Unless there are other advantages to the version column?)","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"e2f13d28e084f3d5a6cc2dafe55aef137439400f","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_dc36c5e6","line":339,"in_reply_to":"5a74a57a_0db3bc0b","updated":"2016-11-30 08:10:43.000000000","message":"I think we should introduce the version column. It will be null at first and will be filled with the appropriate versions by a data migration script. If there is a change in Ocata, that requires to migrate data, we will check for null in the new version column.\n\nNo project uses the version column, but in my opinion it is just more complicated without it. Cinder has a migration policy which spans 4 releases in which data is duplicated for some time. https://specs.openstack.org/openstack/cinder-specs/specs/mitaka/online-schema-upgrades.html\n\nKeystone uses triggers to maintain duplicated data in one release cycle.\n\nApart from the data duplication, we can close in on otherwise hard to debug errors that result in data loss. For example, data saved in a new format can get updated by an old service which the operator forgot about upgrading. When data is versioned, it would raise an exception because of an incompatible version, just like versioned objects do.\n\nOn the other hand, if we are not comfortable introducing versioning of data in the database as part of this spec, we could do it at a later time. Some changes, like the one I described above will require something like the version column, so we can introduce it when a particular change requires it.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be541b5dae967dde231115d3e26cc6ba01678107","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_9f3a64e6","line":339,"in_reply_to":"5a74a57a_662a65e9","updated":"2016-11-30 16:28:18.000000000","message":"Jim and I discussed this briefly [1]. Given your reasoning and Jim\u0027s thoughts about how the version column may help with zero downtime, I think that is the way to go.\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2016-11-30.log.html#t2016-11-30T16:06:30","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_3588b8e7","line":339,"in_reply_to":"5a74a57a_9f3a64e6","updated":"2016-12-01 14:39:28.000000000","message":"Ok, I\u0027ll remove this and the following paragraphs then.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5ddc89bc5af65b99fd3f9db6d73edac1e270f4d","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_debdf4d8","line":339,"in_reply_to":"5a74a57a_afc2f782","updated":"2016-11-29 18:11:47.000000000","message":"There is an advantage in that the developer doesn\u0027t have to implement these version checks each time he/she makes a change. \n\nI think that there are also changes which, without an extra version identifier, are not as straightforward, particularly those changes in which you can\u0027t identify the version of the data just by looking at it, because it has the same format.\n\nA hypothetical example would be a conversion of status codes, when some of those status codes are literally the same, but mean different things in different versions.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_662a65e9","line":339,"in_reply_to":"5a74a57a_dc36c5e6","updated":"2016-11-30 16:06:13.000000000","message":"So the reason Nova can work without this is that they restart everything except nova-compute at the same time, and nova-compute puts all DB calls through nova-conductor (which handles the object versioning and the different schemas).\n\nI think I quite like this version column, I don\u0027t see much harm in it. I assume the object version is what is saved there, not a different version that we attach to the DB schema, yes?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0d102091d3506d0d2e7ed877431b3310d3dcb352","unresolved":false,"context_lines":[{"line_number":336,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":337,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"Alternatively, each object\u0027s ``IronicObject._from_db_object(obj, db_object)``"},{"line_number":340,"context_line":"implementation could call a new method, ``IronicObject._unpin(self, version)``"},{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_0db3bc0b","line":339,"in_reply_to":"5a74a57a_debdf4d8","updated":"2016-11-29 20:25:49.000000000","message":"What do you suggest? I am wondering how we are going to decide. Or is this something we can decide after approving the spec? If we add a version column, does it need to exist and be populated in fromver, before being used for rolling upgrades? What OpenStack projects are using the version column method?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3e0eab5ebe65115ad3bdae6f123727c232c27034","unresolved":false,"context_lines":[{"line_number":341,"context_line":"when it detects that the retrieved object was saved in a particular format."},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"In this case, when ``ToVer`` is pinned to ``FromVer`` and it reads a"},{"line_number":344,"context_line":"``ToVer`` Node object instance from the DB, it can check wether the fake"},{"line_number":345,"context_line":"column was written to (this would usually check if the new column is not null)."},{"line_number":346,"context_line":"If it is, it means the object was saved by an unpinned instance of the service,"},{"line_number":347,"context_line":"so node._unpin(\u00271.15\u0027) is called when instantiating the object. The version"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_04f75259","line":344,"updated":"2016-11-28 20:54:17.000000000","message":"nit s/wether/whether/","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"272c3bf326887b8c79145913115fe2b5db37aaaa","unresolved":false,"context_lines":[{"line_number":395,"context_line":"There is no change to the REST API itself."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"During the rolling upgrade process, the API services run in different versions"},{"line_number":398,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":399,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":400,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":401,"context_line":"communication versions on all ironic services."},{"line_number":402,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_d8d024f9","line":399,"range":{"start_line":398,"start_character":18,"end_line":399,"end_character":33},"updated":"2016-11-25 18:08:13.000000000","message":"nit: Please indicate that the client being mentioned is the python-ironicclient.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":395,"context_line":"There is no change to the REST API itself."},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"During the rolling upgrade process, the API services run in different versions"},{"line_number":398,"context_line":"at the same time. Both API service versions should be compatible with client"},{"line_number":399,"context_line":"libraries from the older release. New API functionality is available only after"},{"line_number":400,"context_line":"completing the upgrade process, which includes unpinning of the internal RPC"},{"line_number":401,"context_line":"communication versions on all ironic services."},{"line_number":402,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_842a197d","line":399,"range":{"start_line":398,"start_character":18,"end_line":399,"end_character":33},"in_reply_to":"5a74a57a_d8d024f9","updated":"2016-11-30 16:06:13.000000000","message":"Honestly, I think this entire section is unnecessary, we use microversions to guarantee this.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"272c3bf326887b8c79145913115fe2b5db37aaaa","unresolved":false,"context_lines":[{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":474,"context_line":"  with the associated RPC and Object versions"},{"line_number":475,"context_line":"* the new DB model change policy"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"Implementation"},{"line_number":478,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_789d5009","line":475,"updated":"2016-11-25 18:08:13.000000000","message":"I suspect that the contribution guide will also need to point to any design documentation as it relates to how new features should be implemented in accordance with rolling upgrades.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":474,"context_line":"  with the associated RPC and Object versions"},{"line_number":475,"context_line":"* the new DB model change policy"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"Implementation"},{"line_number":478,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_849f79b3","line":475,"in_reply_to":"5a74a57a_789d5009","updated":"2016-11-30 16:06:13.000000000","message":"+1","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* before a release is cut, add the mapping of release (named or sem-versioned)"},{"line_number":474,"context_line":"  with the associated RPC and Object versions"},{"line_number":475,"context_line":"* the new DB model change policy"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"Implementation"},{"line_number":478,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_e004c0c7","line":475,"in_reply_to":"5a74a57a_849f79b3","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":19213,"name":"Szymon Borkowski","email":"szymon.borkowski@intel.com","username":"sborkows"},"change_message_id":"69f96eef051c7a95fa0d822101863eb004a000a4","unresolved":false,"context_lines":[{"line_number":490,"context_line":"Work Items"},{"line_number":491,"context_line":"----------"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"#. Add new configuration option ``[DEFAULT]/target_service_version``"},{"line_number":494,"context_line":"   and RPC/Object version mappings to releases."},{"line_number":495,"context_line":"#. Make Objects compatible with a previous version and handle the interaction"},{"line_number":496,"context_line":"   with DB and user."}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_6593845b","line":493,"range":{"start_line":493,"start_character":44,"end_line":493,"end_character":66},"updated":"2016-11-29 11:56:31.000000000","message":"s/target_service_version/pin_release_version","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":490,"context_line":"Work Items"},{"line_number":491,"context_line":"----------"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"#. Add new configuration option ``[DEFAULT]/target_service_version``"},{"line_number":494,"context_line":"   and RPC/Object version mappings to releases."},{"line_number":495,"context_line":"#. Make Objects compatible with a previous version and handle the interaction"},{"line_number":496,"context_line":"   with DB and user."}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_a0f2c898","line":493,"range":{"start_line":493,"start_character":44,"end_line":493,"end_character":66},"in_reply_to":"5a74a57a_6593845b","updated":"2016-12-01 14:39:28.000000000","message":"Done","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"5bd028f7b4af917b65235f667d413c49106500be","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_58058112","line":519,"updated":"2016-11-29 16:22:29.000000000","message":"I think there should be two of each service running. And at least one of each will be upgraded.\n\nI\u0027m thinking. Upgrade one conductor, test, upgrade 2nd conductor, test, upgrade one API, test.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8554fdfdce5207214c1e31c864766b97ff1b5d31","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_4c701fdd","line":519,"in_reply_to":"5a74a57a_04da8978","updated":"2016-11-30 18:51:43.000000000","message":"I agree that we should run two of each service. This sentence makes me think that ironic-conductor only runs on the primary node and ironic-api only runs on the sub-node.\n\nAm I reading that wrong?\n\nUnsure yet on how we will test the API service in Grenade with one upgraded and one not. But I think that should be the goal. If we discover we can\u0027t make the goal then okay. But let\u0027s try.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2855852a1b508464f1af8afa34770368a958168d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_e9e0f898","line":519,"in_reply_to":"5a74a57a_37d170ce","updated":"2016-11-30 20:42:43.000000000","message":"Hm, agree this is going to be really difficult to implement APis on both nodes. We\u0027d essentially have to run tempest twice, once against each API node.\n\nI\u0027m not sure how much extra coverage this gives us, over running a single API service on the primary node that doesn\u0027t get upgraded.\n\nWhat I imagine our test cases look like:\n\n* grenade does a full upgrade, without pinning. This tests old API/conductor unpinned, and new API/conductor unpinned. I assume here that we won\u0027t run online data migrations, so the new will be reading the old format of the data.\n* grenade multinode will be running old API/conductor, pinned, on the primary, which won\u0027t be upgraded, and the subnode will have conductor only, which does get upgraded, but is pinned. This tests old API with old data, old conductor, and new conductor with a pin. Tests are run pre/post-upgrade.\n* We could also upgrade the primary node and test again, if we want to test new API code with the pin. Since all the object translation happens at the objects layer, I\u0027m skeptical that this tests much that doesn\u0027t get exercised in the conductor.\n* I guess we need to test the online data migrations somehow, but that feels like it could happen in unit tests.\n\nI think that covers all the things, yes?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0acc14f1285c4183e7e24f8d11ac2c52636d5bf4","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_37d170ce","line":519,"in_reply_to":"5a74a57a_4c701fdd","updated":"2016-11-30 19:24:25.000000000","message":"So my wording for this line would be:\n\n * The primary node and sub node will each run both the ironic-api and ironic-conductor services.\n\nAnd update line 521 to be specific that the conductor service will be upgraded.\n\nMy ultimate goal is that we can also have upgraded ironic-conductor and 1 oldver API + 1 newver API. I have ideas on how to test this by skipping haproxy and contacting the API service directly. But that is TBD and a stretch goal. If we determine it is too difficult then don\u0027t do it. It is an implementation detail for the testing portion. So we don\u0027t need to go into the details here.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"b5ddc89bc5af65b99fd3f9db6d73edac1e270f4d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_afb485d4","line":519,"in_reply_to":"5a74a57a_58058112","updated":"2016-11-29 18:11:47.000000000","message":"Is it possible in grenade? From what I know, you start with a base release and perform only one upgrade of a set of nodes.\n\nMichal comented on this here:\nhttps://review.openstack.org/#/c/299245/17/specs/approved/support-rolling-upgrade.rst@470","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"4056c0a912a9920c5494fa1c5c74286acbb16f94","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_9fc9767c","line":519,"in_reply_to":"5a74a57a_5c7fec65","updated":"2016-11-30 21:36:07.000000000","message":"@Jim. That seems good what you said. I like it.\n\nThanks.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ae2e81f65fd2c030fd908d86e92738ec602eda7","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"3a71b18c_bb5f590d","line":519,"in_reply_to":"5a74a57a_9fc9767c","updated":"2016-12-01 14:39:28.000000000","message":"I fixed the sentence. I agree that we should eventually test all of those scenarios.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"668912092694b3379a5348d20850e3e91e428166","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_04da8978","line":519,"in_reply_to":"5a74a57a_afb485d4","updated":"2016-11-30 16:06:13.000000000","message":"I think xek is correct. I think primary and subnodes should both run ironic-api and ironic-conductor, so that we get one of each upgraded. Right?","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"03abedc076b240f01273bb9c279e8326effa1ebf","unresolved":false,"context_lines":[{"line_number":516,"context_line":"* multi-node grenade CI. This tests that the rolling upgrade process"},{"line_number":517,"context_line":"  continues to work from ``fromVer`` to ``toVer``."},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"  * Primary node will run ironic-conductor and sub node will run ironic-api."},{"line_number":520,"context_line":"  * Resources will be created."},{"line_number":521,"context_line":"  * Primary node will be upgraded to ``toVer``."},{"line_number":522,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a74a57a_5c7fec65","line":519,"in_reply_to":"5a74a57a_e9e0f898","updated":"2016-11-30 20:53:43.000000000","message":"@Jim. That seems fine to me. We\u0027ll need to upgrade the db schema, but I think it is fine not to test the online data migration with this\n\nwrt the 3rd point. The thing worth testing I think is new API pinned, talking to new conductors pinned.","commit_id":"00eccfcdd5109edcc00899bacf129ce310b1aa0d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da618d2e35e6a451ebc8b83c535d337f5248720f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"Rolling upgrades between releases"},{"line_number":87,"context_line":"---------------------------------"},{"line_number":88,"context_line":"Ironic follows the release-cycle-with-intermediary release model [6]_."},{"line_number":89,"context_line":"The releases are semantic-versioned [7]_, in the form \u003cmajor\u003e.\u003cminor\u003e.\u003cpatch\u003e"},{"line_number":90,"context_line":"We refer to a \"named release\" of ironic as the release associated with a"},{"line_number":91,"context_line":"development cycle like Mitaka."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_b093f3a2","line":89,"updated":"2016-12-01 15:17:35.000000000","message":"nit, missing period at the end.","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da618d2e35e6a451ebc8b83c535d337f5248720f","unresolved":false,"context_lines":[{"line_number":327,"context_line":"and use actual (unpinned) version: api/conductor \u003c-- db."},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"When we receive an unpinned object, we should save it in it\u0027s actual version,"},{"line_number":330,"context_line":"so that we don\u0027t loose data which may have been added to it in ``ToVer``."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":333,"context_line":"developer, a version column will be introduced to SQLAlchemy models."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_5041bf0a","line":330,"updated":"2016-12-01 15:17:35.000000000","message":"nit: s/loose/lose/","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da618d2e35e6a451ebc8b83c535d337f5248720f","unresolved":false,"context_lines":[{"line_number":330,"context_line":"so that we don\u0027t loose data which may have been added to it in ``ToVer``."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":333,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":336,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_9072777b","line":333,"updated":"2016-12-01 15:17:35.000000000","message":"It would be nice to have more details about how this version column will work.\n\nMaybe some of the stuff you mentioned in your comment. Eg\n\nThis version column will be null at first and will be filled with the appropriate versions by a data migration script. If there is a change in Ocata that requires migration of data, we will check for null in the new version column.\n\nNo project uses the version column, but it is more complicated without it. For example, Cinder has a migration policy which spans 4 releases in which data is duplicated for some time. Keystone uses triggers to maintain duplicated data in one release cycle. In addition, this may prove useful for a zero-downtime upgrade (in the future).","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"76ac87f686d78aff75f7498eb931e782a6578321","unresolved":false,"context_lines":[{"line_number":330,"context_line":"so that we don\u0027t loose data which may have been added to it in ``ToVer``."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"To make sure reading the DB object versions happens transparently for the"},{"line_number":333,"context_line":"developer, a version column will be introduced to SQLAlchemy models."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":336,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_22378bb1","line":333,"in_reply_to":"3a71b18c_9072777b","updated":"2016-12-01 19:52:19.000000000","message":"done","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b18e6aa4521c7e145bb4a7a02380b1dc11afe919","unresolved":false,"context_lines":[{"line_number":511,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"},{"line_number":512,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":513,"context_line":"  * If possible, there should be multiple runs of tempest with changes to"},{"line_number":514,"context_line":"    the pinning configuration."},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"Tests should cover the use cases described in"},{"line_number":517,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_ed55981d","line":514,"updated":"2016-12-01 15:01:58.000000000","message":"Hm, I\u0027d like to rewrite this a bit. I think the subnode should only run the conductor, and only the subnode should be upgraded. Later we can talk about also upgrading the primary, but I don\u0027t think that\u0027s built into multinode grenade stuff yet. Maybe I\u0027m wrong.","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"76ac87f686d78aff75f7498eb931e782a6578321","unresolved":false,"context_lines":[{"line_number":511,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"},{"line_number":512,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":513,"context_line":"  * If possible, there should be multiple runs of tempest with changes to"},{"line_number":514,"context_line":"    the pinning configuration."},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"Tests should cover the use cases described in"},{"line_number":517,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_82469f21","line":514,"in_reply_to":"3a71b18c_4db67ddd","updated":"2016-12-01 19:52:19.000000000","message":"done","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2ba743b1b1f2709b5feca919001c22440bc4f8c9","unresolved":false,"context_lines":[{"line_number":511,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"},{"line_number":512,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":513,"context_line":"  * If possible, there should be multiple runs of tempest with changes to"},{"line_number":514,"context_line":"    the pinning configuration."},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"Tests should cover the use cases described in"},{"line_number":517,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_4db67ddd","line":514,"in_reply_to":"3a71b18c_d0930ff9","updated":"2016-12-01 19:15:36.000000000","message":"+1 on Ruby\u0027s change","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da618d2e35e6a451ebc8b83c535d337f5248720f","unresolved":false,"context_lines":[{"line_number":511,"context_line":"  * Test the interaction of ``fromVer`` ironic-api service with ``toVer``"},{"line_number":512,"context_line":"    ironic-conductor by checking if resources still exist and running tempest."},{"line_number":513,"context_line":"  * If possible, there should be multiple runs of tempest with changes to"},{"line_number":514,"context_line":"    the pinning configuration."},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"Tests should cover the use cases described in"},{"line_number":517,"context_line":"\"Rolling upgrades between releases\" as much as possible."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3a71b18c_d0930ff9","line":514,"in_reply_to":"3a71b18c_ed55981d","updated":"2016-12-01 15:17:35.000000000","message":"What about replacing the above with a copy/paste of Jim\u0027s comments:\n\n- grenade does a full upgrade, without pinning. This tests old API/conductor unpinned, and new API/conductor unpinned. We won\u0027t run online data migrations, so the new will be reading the old format of the data.\n- grenade multinode will be running old API/conductor, pinned, on the primary, which won\u0027t be upgraded, and the subnode will have conductor only, which does get upgraded, but is pinned. This tests old API with old data, old conductor, and new conductor with a pin. Tests are run pre/post-upgrade.\n- We could also upgrade the primary node and test again, if we want to test new API code with the pin. Since all the object translation happens at the objects layer, this may not be needed since it may not test much that hasn\u0027t already been exercised in the conductor.","commit_id":"615b6f4c539e70ec00cad8c27efdf09063fefb9d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This proposes support for \"rolling upgrades\" of ironic, which will allow"},{"line_number":14,"context_line":"operators to roll out new code to the ironic services without having to"},{"line_number":15,"context_line":"restart all services on the new code simultaneously. There should be minimal"},{"line_number":16,"context_line":"downtime when upgrading ironic services. During the upgrade of ironic,"},{"line_number":17,"context_line":"instances will not be impacted; they should continue to run and have network"},{"line_number":18,"context_line":"access. There might be slightly longer delays for ironic operations to be"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_696de603","line":15,"range":{"start_line":15,"start_character":59,"end_line":15,"end_character":65},"updated":"2016-12-01 22:32:41.000000000","message":"s/should/could :)","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":78,"context_line":"* a multi-node grenade CI to prevent breaking the mechanism of rolling upgrade"},{"line_number":79,"context_line":"* a rolling upgrade operation guide for operators."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Support for rolling upgrades between ironic releases is first discussed,"},{"line_number":82,"context_line":"followed by the proposed rolling upgrade process. The changes that are needed"},{"line_number":83,"context_line":"are then described."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"Rolling upgrades between releases"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_29184e84","line":83,"range":{"start_line":81,"start_character":0,"end_line":83,"end_character":19},"updated":"2016-12-01 22:32:41.000000000","message":"nit - reads a bit awkward","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":102,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":103,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":104,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":105,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Rolling upgrade process"},{"line_number":108,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_e44bdb57","line":105,"range":{"start_line":105,"start_character":31,"end_line":105,"end_character":63},"updated":"2016-12-01 22:32:41.000000000","message":"Our deprecation policy in [8] states:\n\nFeatures included in an intermediate release but not a coordinated release may be deprecated in the next release of any type and must stay in place at least 3 months after being deprecated before being removed in a release of any type.\n\nSo if 7.1 \u003d\u003d N release, and 7.10 \u003d\u003d N + 1 release, we introduced something in 7.3 and after 3 months dropped it in 7.8, are we going to be able to guarantee upgrade from 7.5 to 7.8\u003c\u003dmaster\u003c7.10?","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"30af8a8d9fb8a7f86d8c49eb65f89533deb6e141","unresolved":false,"context_lines":[{"line_number":102,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":103,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":104,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":105,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Rolling upgrade process"},{"line_number":108,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_b7cd775f","line":105,"range":{"start_line":105,"start_character":31,"end_line":105,"end_character":63},"in_reply_to":"3a71b18c_2acf5d57","updated":"2016-12-02 11:08:40.000000000","message":"Well, if I read that correctly, the ploicy states it is possible. Let me make it a bit more clear.\n\n7.1 \u003d\u003d named release (e.g. 1 jan, so next named release will be 1 jul).\nin 7.2 (10 jan) we introduce some feature, it is not in any named release yet.\nin 7.3 (1 feb) we deprecate it.\nin 7.8, after 3 months (1 may), we drop some column, because the feature is still not present in any named release, and policy allows it.\nmaster now at 7.8.dev-something (15 may), and upgrade from e.g. 7.4 to master might not be possible.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6ed44c13ff401b91916356cc620385148e5aaa6c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":103,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":104,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":105,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Rolling upgrade process"},{"line_number":108,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_95eaf3aa","line":105,"range":{"start_line":105,"start_character":31,"end_line":105,"end_character":63},"in_reply_to":"3a71b18c_3d9f8151","updated":"2016-12-05 10:08:25.000000000","message":"I\u0027ll add a note here, that there may be a special upgrade path when we screw something up on master.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"df99276254b9764f3ff4e2522b156dbf5e0600df","unresolved":false,"context_lines":[{"line_number":102,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":103,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":104,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":105,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Rolling upgrade process"},{"line_number":108,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_3d9f8151","line":105,"range":{"start_line":105,"start_character":31,"end_line":105,"end_character":63},"in_reply_to":"3a71b18c_b7cd775f","updated":"2016-12-02 14:08:00.000000000","message":"Hrm, good point. FWIW, that policy is a special case for when we screw up and something got in that should not have, and we don\u0027t want to ship a stable release with a new deprecated thing. Maybe we just don\u0027t do that. And if we do need to do it, we make it clear in release notes that people on 7.4 need to do a thing to upgrade.\n\nI think it\u0027ll probably be fine.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":103,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":104,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":105,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Rolling upgrade process"},{"line_number":108,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_2acf5d57","line":105,"range":{"start_line":105,"start_character":31,"end_line":105,"end_character":63},"in_reply_to":"3a71b18c_e44bdb57","updated":"2016-12-02 00:31:21.000000000","message":"We cannot drop it in 7.8. 7.3 \u0026 7.8 are part of the same \u0027named\u0027 release. Will need to wait til after 7.10 to drop it.\n\nMaybe I don\u0027t understand your question.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"#. Upgrade DB schema to ``ToVer`` via :command:`ironic-dbsync upgrade`."},{"line_number":113,"context_line":"   Ironic already has the code in place to do this. However, a new DB"},{"line_number":114,"context_line":"   migration policy (described below in \"New DB model change policy\") needs"},{"line_number":115,"context_line":"   to be documented."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_2474f39a","line":114,"range":{"start_line":114,"start_character":41,"end_line":114,"end_character":67},"updated":"2016-12-01 22:32:41.000000000","message":"nit - could make it a link","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":115,"context_line":"   to be documented."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"#. Upgrade code and restart ironic-conductor services, one at a time."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_c4933fa2","line":118,"updated":"2016-12-01 22:32:41.000000000","message":"just to clarify - this means only setting config option, without SIGHUP, that was mentioned in the early patchsets? That option will be read from config after individual service upgrade and restart IIUC.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"5ee240930423df8ce236949fe9cc3825c0535adf","unresolved":false,"context_lines":[{"line_number":115,"context_line":"   to be documented."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"#. Upgrade code and restart ironic-conductor services, one at a time."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_c25ebe11","line":118,"in_reply_to":"3a71b18c_2a6bdd1f","updated":"2016-12-02 08:07:03.000000000","message":"I hear that cinder uses SIGHUP, but it causes a restart of the child processes, so it\u0027s pretty much an equivalent.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":115,"context_line":"   to be documented."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"#. Upgrade code and restart ironic-conductor services, one at a time."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_2a6bdd1f","line":118,"in_reply_to":"3a71b18c_c4933fa2","updated":"2016-12-02 00:31:21.000000000","message":"Yes, w/o SIGHUP. Cuz the next step is upgrading code \u0026 restarting services -- that\u0027s when it will take effect.\n\nIt isn\u0027t mentioned here, but the sighup would be useful in the unpinning part, where we wouldn\u0027t necessarily want to restart the services just to unpin. I was debating about mentioning sighup there but I decided this spec is getting too detailed, and the rolling upgrade will work with or w/o sighup.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"#. Pin RPC and IronicObject versions to the same ``FromVer`` for both"},{"line_number":118,"context_line":"   ironic-api and ironic-conductor services, via the new configuration option"},{"line_number":119,"context_line":"   described below in \"RPC and object version pinning\"."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"#. Upgrade code and restart ironic-conductor services, one at a time."},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_a46803bc","line":119,"range":{"start_line":119,"start_character":23,"end_line":119,"end_character":53},"updated":"2016-12-01 22:32:41.000000000","message":"ditto, link","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":126,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":127,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":128,"context_line":"   restarting the services. ironic-conductor services should be restarted"},{"line_number":129,"context_line":"   first, followed by the ironic-api services. This is to ensure that when new"},{"line_number":130,"context_line":"   functionality is exposed on the API service, it is available on the backend."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":133,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_ae2544c3","line":130,"range":{"start_line":129,"start_character":47,"end_line":130,"end_character":79},"updated":"2016-12-01 22:32:41.000000000","message":"Hm, but still when a pinned rpcapi on ironic-api side will be sending a message to conductor, it may drop some newly introduced things, which conductor relies on to enable some new feature? Or I misunderstand something...\n\nAlso in REST API Impact section I see: \n\nNew API functionality is available only\nafter completing the upgrade process, which includes unpinning of the internal\nRPC communication versions on all ironic services.\n\nSo, basically, there is no difference what order of unpinning to do?","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":127,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":128,"context_line":"   restarting the services. ironic-conductor services should be restarted"},{"line_number":129,"context_line":"   first, followed by the ironic-api services. This is to ensure that when new"},{"line_number":130,"context_line":"   functionality is exposed on the API service, it is available on the backend."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":133,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_cae8a97f","line":130,"range":{"start_line":129,"start_character":47,"end_line":130,"end_character":79},"in_reply_to":"3a71b18c_ae2544c3","updated":"2016-12-02 00:31:21.000000000","message":"Maybe we need to reword this. Words are hard.\n\nThere is not going to be any code to prevent/protect an end user issuing a REST API with a new microversion (ie, new feature) while the services are pinned. It will be up to the operator to not do this until everything has been upgraded and unpinned.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"5ee240930423df8ce236949fe9cc3825c0535adf","unresolved":false,"context_lines":[{"line_number":126,"context_line":"   versions in ``ToVer``. This is done via updating the new configuration"},{"line_number":127,"context_line":"   option described below in \"RPC and object version pinning\" and then"},{"line_number":128,"context_line":"   restarting the services. ironic-conductor services should be restarted"},{"line_number":129,"context_line":"   first, followed by the ironic-api services. This is to ensure that when new"},{"line_number":130,"context_line":"   functionality is exposed on the API service, it is available on the backend."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"#. Run a new command :command:`ironic-dbsync online_data_migration` to ensure"},{"line_number":133,"context_line":"   that all DB records are \"upgraded\" to the new data version."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_c2a95e7d","line":130,"range":{"start_line":129,"start_character":47,"end_line":130,"end_character":79},"in_reply_to":"3a71b18c_cae8a97f","updated":"2016-12-02 08:07:03.000000000","message":"The bottom line is that this will be the order in which we will test this. The pinned conductor won\u0027t have to support an unpinned api. A dev making a new change may even decide to not expose the new RPC API endpoints in a pinned conductor, when he knows that there may still be old services running that may cause a conflict in that particular situation.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":193,"context_line":"              {\u0027mitaka\u0027: {\u0027Node\u0027: \u00271.14\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":194,"context_line":"                          \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027},"},{"line_number":195,"context_line":"               \u00275.23\u0027: {\u0027Node\u0027: \u00271.15\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":196,"context_line":"                        \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"* rpc_mapping::"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_84b067f6","line":196,"range":{"start_line":196,"start_character":77,"end_line":196,"end_character":77},"updated":"2016-12-01 22:32:41.000000000","message":"There may have been a comment on that before, but I forgot where I\u0027ve seen it, could you state here - is this dictionary going to be somehow received from OVO manifests, or maintained manually?","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"              {\u0027mitaka\u0027: {\u0027Node\u0027: \u00271.14\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":194,"context_line":"                          \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027},"},{"line_number":195,"context_line":"               \u00275.23\u0027: {\u0027Node\u0027: \u00271.15\u0027, \u0027Conductor\u0027: \u00271.1\u0027,"},{"line_number":196,"context_line":"                        \u0027Chassis\u0027: \u00271.3\u0027, \u0027Port\u0027: \u00271.5\u0027, \u0027Portgroup\u0027: \u00271.0\u0027}}"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"* rpc_mapping::"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_ca9fc901","line":196,"range":{"start_line":196,"start_character":77,"end_line":196,"end_character":77},"in_reply_to":"3a71b18c_84b067f6","updated":"2016-12-02 00:31:21.000000000","message":"maintained manually for now. Cinder I think has some way to do it automatically, but that\u0027s outside the scope of this spec. I\u0027ll add something about it.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":211,"context_line":"(corresponding to the desired release) rather than the latest"},{"line_number":212,"context_line":"``RPC_API_VERSION``. Then each RPC call will customize the request according"},{"line_number":213,"context_line":"to this ``version_cap``."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Make use of target_version"},{"line_number":217,"context_line":"::::::::::::::::::::::::::"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_64826b02","line":214,"updated":"2016-12-01 22:32:41.000000000","message":"nit - extra newline","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":324,"context_line":"the globally configured pin for this instance of the object and use its actual"},{"line_number":325,"context_line":"version. The same follows for receiving a ``ToVer`` object through RPC."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"In short, use target version: api/conductor --\u003e db (when creating a new object)"},{"line_number":328,"context_line":"and use actual (unpinned) version: api/conductor \u003c-- db."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"When we receive an unpinned object, we should save it in it\u0027s actual version,"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_e4491bd2","line":327,"updated":"2016-12-01 22:32:41.000000000","message":"or saving","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":347,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":348,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":349,"context_line":"When ironic-api makes an RPC call to update an object instance (in"},{"line_number":350,"context_line":"ironic.conductor.rpcapi.ConductorAPI: update_node(), update_port() and"},{"line_number":351,"context_line":"update_portgroup()), the object instance `with updates` is passed as a"},{"line_number":352,"context_line":"parameter to the method. After updating the database, an updated object"},{"line_number":353,"context_line":"instance is returned."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_84d6a7c3","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":49},"updated":"2016-12-01 22:32:41.000000000","message":"nit - create_node affected now too","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":347,"context_line":"Passing target version object instances via RPC (API \u003c---\u003e Conductor)"},{"line_number":348,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":349,"context_line":"When ironic-api makes an RPC call to update an object instance (in"},{"line_number":350,"context_line":"ironic.conductor.rpcapi.ConductorAPI: update_node(), update_port() and"},{"line_number":351,"context_line":"update_portgroup()), the object instance `with updates` is passed as a"},{"line_number":352,"context_line":"parameter to the method. After updating the database, an updated object"},{"line_number":353,"context_line":"instance is returned."}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_cab6e989","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":49},"in_reply_to":"3a71b18c_84d6a7c3","updated":"2016-12-02 00:31:21.000000000","message":"yup, just today!","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":379,"context_line":"-----------------"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"A DB migration policy is adopted and introduced above in"},{"line_number":382,"context_line":"\u0027\u0027New DB model change policy\u0027\u0027."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"State Machine Impact"},{"line_number":385,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_c4d89ff2","line":382,"range":{"start_line":382,"start_character":2,"end_line":382,"end_character":29},"updated":"2016-12-01 22:32:41.000000000","message":"ditto, would be good to have a link to that section here","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":519,"context_line":"  * grenade does a full upgrade, without pinning. This tests old API/conductor"},{"line_number":520,"context_line":"    and new API/conductor unpinned. We won\u0027t run online data migrations, so"},{"line_number":521,"context_line":"    the new services will be reading the old format of the data."},{"line_number":522,"context_line":"  * grenade multi-node will be running old API/conductor on the primary,"},{"line_number":523,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":524,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":525,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":526,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_a9029e3c","line":523,"range":{"start_line":522,"start_character":4,"end_line":523,"end_character":28},"updated":"2016-12-01 22:32:41.000000000","message":"Looking at Michal\u0027s comments from PS 17, and looking at devstack-gate, https://github.com/openstack-infra/devstack-gate/blob/2b17c6e80f8845706da2cfab3dfb47bdee7fa63f/devstack-vm-gate.sh#L641, it seems to me that at the moment we upgrade only primary node. Oh, just noticed another comment - https://github.com/openstack-infra/devstack-gate/blob/2b17c6e80f8845706da2cfab3dfb47bdee7fa63f/devstack-vm-gate.sh#L105-L107, so we don\u0027t upgrade subnodes.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"df99276254b9764f3ff4e2522b156dbf5e0600df","unresolved":false,"context_lines":[{"line_number":519,"context_line":"  * grenade does a full upgrade, without pinning. This tests old API/conductor"},{"line_number":520,"context_line":"    and new API/conductor unpinned. We won\u0027t run online data migrations, so"},{"line_number":521,"context_line":"    the new services will be reading the old format of the data."},{"line_number":522,"context_line":"  * grenade multi-node will be running old API/conductor on the primary,"},{"line_number":523,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":524,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":525,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":526,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_1d55654f","line":523,"range":{"start_line":522,"start_character":4,"end_line":523,"end_character":28},"in_reply_to":"3a71b18c_2a0afd26","updated":"2016-12-02 14:08:00.000000000","message":"Oh, I guess I had this backwards. My fault!\n\nI can re-write this a bit, let me think through it.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":519,"context_line":"  * grenade does a full upgrade, without pinning. This tests old API/conductor"},{"line_number":520,"context_line":"    and new API/conductor unpinned. We won\u0027t run online data migrations, so"},{"line_number":521,"context_line":"    the new services will be reading the old format of the data."},{"line_number":522,"context_line":"  * grenade multi-node will be running old API/conductor on the primary,"},{"line_number":523,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":524,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":525,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":526,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_2a0afd26","line":523,"range":{"start_line":522,"start_character":4,"end_line":523,"end_character":28},"in_reply_to":"3a71b18c_a9029e3c","updated":"2016-12-02 00:31:21.000000000","message":"Hmm. I\u0027ll leave it for someone else to try to word this to the satisfaction of the masses.","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":529,"context_line":"    that hasn\u0027t already been exercised in the conductor."},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"Tests should cover the use cases described in"},{"line_number":532,"context_line":"\"Rolling upgrades between releases\" as much as possible."},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"Upgrades and Backwards Compatibility"},{"line_number":535,"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"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_2a111d53","line":532,"range":{"start_line":532,"start_character":1,"end_line":532,"end_character":34},"updated":"2016-12-01 22:32:41.000000000","message":"ditto, link","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a5907b443ed4a072edaa87dd2b7c0451bf8913ef","unresolved":false,"context_lines":[{"line_number":556,"context_line":".. [3] https://etherpad.openstack.org/p/ironic-mitaka-midcycle"},{"line_number":557,"context_line":".. [4] Ironic rolling upgrade framework https://review.openstack.org/#/c/306357/"},{"line_number":558,"context_line":".. [5] Refactor configdrive into a new field https://review.openstack.org/#/c/306358/"},{"line_number":559,"context_line":".. [6] http://governance.openstack.org/reference/tags/release_cycle-with-intermediary.html#tag-release-cycle-with-intermediary"},{"line_number":560,"context_line":".. [7] http://semver.org/"},{"line_number":561,"context_line":".. [8] http://governance.openstack.org/reference/tags/assert_follows-standard-deprecation.html"},{"line_number":562,"context_line":".. [9] http://lists.openstack.org/pipermail/openstack-dev/2016-April/092773.html"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_ae5e2443","line":559,"updated":"2016-12-01 22:32:41.000000000","message":"This link is dead, here is the proper one is https://releases.openstack.org/reference/release_models.html","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cac1f578a4c926d640d1402456d3e12c8e1f1a0a","unresolved":false,"context_lines":[{"line_number":556,"context_line":".. [3] https://etherpad.openstack.org/p/ironic-mitaka-midcycle"},{"line_number":557,"context_line":".. [4] Ironic rolling upgrade framework https://review.openstack.org/#/c/306357/"},{"line_number":558,"context_line":".. [5] Refactor configdrive into a new field https://review.openstack.org/#/c/306358/"},{"line_number":559,"context_line":".. [6] http://governance.openstack.org/reference/tags/release_cycle-with-intermediary.html#tag-release-cycle-with-intermediary"},{"line_number":560,"context_line":".. [7] http://semver.org/"},{"line_number":561,"context_line":".. [8] http://governance.openstack.org/reference/tags/assert_follows-standard-deprecation.html"},{"line_number":562,"context_line":".. [9] http://lists.openstack.org/pipermail/openstack-dev/2016-April/092773.html"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3a71b18c_30c8aa55","line":559,"in_reply_to":"3a71b18c_ae5e2443","updated":"2016-12-02 00:31:21.000000000","message":"Wow, if we have to ensure that our old links work, they should too :-(","commit_id":"4a0682a9f2bb4e92cccc64ee74c74980ccabbd86"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"afb7e32960345730c271f883c0d8816400e1b79c","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"#. Upgrade ironic client libraries (e.g. python-ironicclient) and other"},{"line_number":140,"context_line":"   services which use the newly introduced API features and depend on the"},{"line_number":141,"context_line":"   new version."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Changes needed to support rolling upgrade"},{"line_number":144,"context_line":"-----------------------------------------"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_b72bb0ea","line":141,"updated":"2016-12-02 13:29:18.000000000","message":"We need to explicitly state at which point we expect IPA to be updated (probably before everything)","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"a1542a7a4feb8ac777ad91c6d500e08022fb5ef4","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"#. Upgrade ironic client libraries (e.g. python-ironicclient) and other"},{"line_number":140,"context_line":"   services which use the newly introduced API features and depend on the"},{"line_number":141,"context_line":"   new version."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Changes needed to support rolling upgrade"},{"line_number":144,"context_line":"-----------------------------------------"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_164a6a55","line":141,"in_reply_to":"3a71b18c_3dace134","updated":"2016-12-05 10:48:50.000000000","message":"Added a bullet at the beginning, and a in the work items, so we don\u0027t forget.","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2a6713a19a24a00f89cedfa0de414573a4e4c19e","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"#. Upgrade ironic client libraries (e.g. python-ironicclient) and other"},{"line_number":140,"context_line":"   services which use the newly introduced API features and depend on the"},{"line_number":141,"context_line":"   new version."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Changes needed to support rolling upgrade"},{"line_number":144,"context_line":"-----------------------------------------"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_3dace134","line":141,"in_reply_to":"3a71b18c_b72bb0ea","updated":"2016-12-02 14:09:47.000000000","message":"Yes, before everything, that hasn\u0027t changed so I\u0027m not sure if we need it here :)\n\n\n... although now I see that isn\u0027t documented. :|","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":19213,"name":"Szymon Borkowski","email":"szymon.borkowski@intel.com","username":"sborkows"},"change_message_id":"bc08985c0048b90616b86121e15951e0be7ed0ad","unresolved":false,"context_lines":[{"line_number":178,"context_line":"``````````````````````````````"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"A new configuration option will be added. It will be used to pin the RPC and"},{"line_number":181,"context_line":"IronicObject (e.g., Node, Conductor, Chassis, Port, and Porgroup) versions for"},{"line_number":182,"context_line":"all the ironic services. With this configuration option, a service will be able"},{"line_number":183,"context_line":"to properly handle the communication between different versions of services."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_9c6ee294","line":181,"range":{"start_line":181,"start_character":56,"end_line":181,"end_character":64},"updated":"2016-12-02 10:55:35.000000000","message":"ditto: s/Porgroup/Portgroup","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":19213,"name":"Szymon Borkowski","email":"szymon.borkowski@intel.com","username":"sborkows"},"change_message_id":"bc08985c0048b90616b86121e15951e0be7ed0ad","unresolved":false,"context_lines":[{"line_number":317,"context_line":"It may happen because there was a new column introduced (the ``fake`` column"},{"line_number":318,"context_line":"from the above example), so:"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"1. the unpinned conductor saves data into a new column (the ``fake`` column)"},{"line_number":321,"context_line":"2. the pinned conductor reads and updates data in an old column (``extra``)."},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"The end result is that we don\u0027t know in which column we have the up-to date"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_bca0fea0","line":320,"updated":"2016-12-02 10:55:35.000000000","message":"nit: if we add a dot in the next line, we can add here a comma","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"afb7e32960345730c271f883c0d8816400e1b79c","unresolved":false,"context_lines":[{"line_number":343,"context_line":"Ocata that requires migration of data, we will check for null in the new"},{"line_number":344,"context_line":"version column."},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"No project uses the version column mechanism, but it is more complicated"},{"line_number":347,"context_line":"without it. For example, Cinder has a migration policy which spans 4 releases"},{"line_number":348,"context_line":"in which data is duplicated for some time. Keystone uses triggers to maintain"},{"line_number":349,"context_line":"duplicated data in one release cycle. In addition, the version column may prove"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_d72e6cf9","line":346,"updated":"2016-12-02 13:29:18.000000000","message":"note: ironic-inspector is introducing version column soon","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2a6713a19a24a00f89cedfa0de414573a4e4c19e","unresolved":false,"context_lines":[{"line_number":343,"context_line":"Ocata that requires migration of data, we will check for null in the new"},{"line_number":344,"context_line":"version column."},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"No project uses the version column mechanism, but it is more complicated"},{"line_number":347,"context_line":"without it. For example, Cinder has a migration policy which spans 4 releases"},{"line_number":348,"context_line":"in which data is duplicated for some time. Keystone uses triggers to maintain"},{"line_number":349,"context_line":"duplicated data in one release cycle. In addition, the version column may prove"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_fd70a9de","line":346,"in_reply_to":"3a71b18c_d72e6cf9","updated":"2016-12-02 14:09:47.000000000","message":"For this usage or something else?","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb486525a0cfd181fe8148ccef25c11a656a5a19","unresolved":false,"context_lines":[{"line_number":343,"context_line":"Ocata that requires migration of data, we will check for null in the new"},{"line_number":344,"context_line":"version column."},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"No project uses the version column mechanism, but it is more complicated"},{"line_number":347,"context_line":"without it. For example, Cinder has a migration policy which spans 4 releases"},{"line_number":348,"context_line":"in which data is duplicated for some time. Keystone uses triggers to maintain"},{"line_number":349,"context_line":"duplicated data in one release cycle. In addition, the version column may prove"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_1d5f2542","line":346,"in_reply_to":"3a71b18c_fd70a9de","updated":"2016-12-02 14:10:48.000000000","message":"As a safe-guard around state management (ask Milan for details :)","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f8e9ab5211fdf58a4152a345935d7a4d6b5eee52","unresolved":false,"context_lines":[{"line_number":534,"context_line":"  * grenade multi-node will be running old API/conductor on the primary,"},{"line_number":535,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":536,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":537,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":538,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"},{"line_number":539,"context_line":"    to test new API code with the pin. Since all the object translation happens"},{"line_number":540,"context_line":"    at the objects layer, this may not be needed since it may not test much"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_a8ffd1ff","line":537,"updated":"2016-12-02 14:24:55.000000000","message":"Knowing only the primary gets upgraded, this would read as: grenade multi-node will be running old API/conductor on the primary, which will be upgraded and pinned. The subnode will have conductor only, which does not get upgraded. This tests old API + old data, with old conductors, and new API with a mix of new and old conductors. Tests are run pre/post-upgrade.\n\nSeems like maybe multinode grenade isn\u0027t really set up (yet) for what we want to do... :/\n\nWe definitely need to upgrade conductors first (since that\u0027s the method we advertise). So it sounds like maybe the first iteration was closer to right than I thought. I see it as:\n\n* api/conductor on the primary\n* conductor on the subnode\n* TEST\n* upgrade subnode\n* TEST\n* upgrade conductor on primary\n* TEST\n* upgrade API on primary\n* TEST\n* (maybe unpin and test, though this is covered by regular grenade)\n\nThe only case this misses is a mix of old and new API services running, which I don\u0027t think is useful as those services don\u0027t interact.\n\nAlso, we\u0027ll need two nodes (and somehow ensure each conductor manages one?). Each test will need to deploy two instances, to make sure both conductors are exercised.\n\n/me has no clue how to make grenade jump through these hoops, or how to run these tests in a reasonable amount of time. :(","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"a1542a7a4feb8ac777ad91c6d500e08022fb5ef4","unresolved":false,"context_lines":[{"line_number":534,"context_line":"  * grenade multi-node will be running old API/conductor on the primary,"},{"line_number":535,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":536,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":537,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":538,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"},{"line_number":539,"context_line":"    to test new API code with the pin. Since all the object translation happens"},{"line_number":540,"context_line":"    at the objects layer, this may not be needed since it may not test much"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_96583a8c","line":537,"in_reply_to":"3a71b18c_a8ffd1ff","updated":"2016-12-05 10:48:50.000000000","message":"You still have an error there, since API is running on the primary, it would be upgraded. I switched primary\u003c-\u003esubnode in the original text to make it work.\n\nI agree on the sequence of tests. We could also stop the api on the subnode and start it on the upgraded primary at some point... I\u0027ll add this as a separate bullet.","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"a1542a7a4feb8ac777ad91c6d500e08022fb5ef4","unresolved":false,"context_lines":[{"line_number":535,"context_line":"    which won\u0027t be upgraded. The subnode will have conductor only, which does"},{"line_number":536,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":537,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":538,"context_line":"  * We could also upgrade the primary node, pinned, and test again, if we want"},{"line_number":539,"context_line":"    to test new API code with the pin. Since all the object translation happens"},{"line_number":540,"context_line":"    at the objects layer, this may not be needed since it may not test much"},{"line_number":541,"context_line":"    that hasn\u0027t already been exercised in the conductor."}],"source_content_type":"text/x-rst","patch_set":22,"id":"3a71b18c_d660f203","line":538,"updated":"2016-12-05 10:48:50.000000000","message":"We have to also change it here, so it makes sense.","commit_id":"3243ba930dd981472cd40c09c68b989bcc64ba21"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1438f559a96e65477a71fbdfba0a6fb809fc2721","unresolved":false,"context_lines":[{"line_number":103,"context_line":"* Any named release to its latest revision, containing backported bug fixes."},{"line_number":104,"context_line":"  Because those bug fixes can contain improvements to the upgrade process, the"},{"line_number":105,"context_line":"  operator should patch the system before upgrading between named releases."},{"line_number":106,"context_line":"* Most recent named release N (and semver releases newer than N) to master."},{"line_number":107,"context_line":"  As with the above bullet point, there may be a bug or a feature introduced"},{"line_number":108,"context_line":"  on a master branch, that we want to remove before publishing a named release."},{"line_number":109,"context_line":"  Deprecation policy allows to do this in a 3 month time frame [8]_."}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_455331e2","line":106,"updated":"2016-12-05 19:54:25.000000000","message":"It seems like if that\u0027s the case, we can also allow semver release to the next named release too, with same restrictions.","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5cffb0772c441124cebd922a3d12fe6f9d199a3e","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"There is no change to the REST API itself."},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"During the rolling upgrade process, the API services may run in different"},{"line_number":411,"context_line":"versions at the same time. Both API service versions should be compatible with"},{"line_number":412,"context_line":"the python-ironicclient library from the older release (we already use"},{"line_number":413,"context_line":"microversions to guarantee this). New API functionality is available"}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_48943342","line":410,"updated":"2016-12-05 16:20:08.000000000","message":"Thanks, I think this is a valid description of the caveat regarding the issue I brought up about multiple API versions on an older patch set.","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5cffb0772c441124cebd922a3d12fe6f9d199a3e","unresolved":false,"context_lines":[{"line_number":528,"context_line":"Dependencies"},{"line_number":529,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"* Needs the new command :command:`ironic-dbsync online_data_migration` [12]_."},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"* Needs multi-node grenade CI working."},{"line_number":534,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_a8b787d6","line":531,"updated":"2016-12-05 16:20:08.000000000","message":"jroll mentioned that I can help out with this part too. I\u0027ll get started this week.","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"3eb9123404a890b40713a8db7a470b7c18f91893","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    and new API/conductor unpinned. We won\u0027t run online data migrations, so"},{"line_number":545,"context_line":"    the new services will be reading the old format of the data."},{"line_number":546,"context_line":"  * grenade multi-node will be running old API/conductor on the subnode,"},{"line_number":547,"context_line":"    which won\u0027t be upgraded. The primary will have conductor only, which does"},{"line_number":548,"context_line":"    get upgraded, but is pinned. This tests old API + old data, with 1. old"},{"line_number":549,"context_line":"    conductor, and 2. new conductor with a pin. Tests are run pre/post-upgrade."},{"line_number":550,"context_line":"  * We could also move the API to the primary node, upgrade it, pinned, to test"}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_85646922","line":547,"updated":"2016-12-05 20:03:41.000000000","message":"Ugh, you\u0027re right, this all confuses me immensely. :)\n\nI think this is fine for now, we can iterate as we go if needed.","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1438f559a96e65477a71fbdfba0a6fb809fc2721","unresolved":false,"context_lines":[{"line_number":551,"context_line":"    new API code with the pin. Since all the object translation happens at the"},{"line_number":552,"context_line":"    objects layer, this may not be needed since it may not test much that"},{"line_number":553,"context_line":"    hasn\u0027t already been exercised in the conductor."},{"line_number":554,"context_line":"  * The above two tests could be merged, if grenade can be set-up to stop the"},{"line_number":555,"context_line":"    old API service on the subnode and start it on the upgraded primary after"},{"line_number":556,"context_line":"    doing the first test."},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_85b709d7","line":554,"updated":"2016-12-05 19:54:25.000000000","message":"This seems like the thing we need! Still unsure if it\u0027s currently possible, but let\u0027s start and see :)","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"3eb9123404a890b40713a8db7a470b7c18f91893","unresolved":false,"context_lines":[{"line_number":551,"context_line":"    new API code with the pin. Since all the object translation happens at the"},{"line_number":552,"context_line":"    objects layer, this may not be needed since it may not test much that"},{"line_number":553,"context_line":"    hasn\u0027t already been exercised in the conductor."},{"line_number":554,"context_line":"  * The above two tests could be merged, if grenade can be set-up to stop the"},{"line_number":555,"context_line":"    old API service on the subnode and start it on the upgraded primary after"},{"line_number":556,"context_line":"    doing the first test."},{"line_number":557,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"3a71b18c_4556d12a","line":554,"in_reply_to":"3a71b18c_85b709d7","updated":"2016-12-05 20:03:41.000000000","message":"Another option - we have two multinode grenade jobs.\n\n1) API on primary, conductor on both.\n2) API only on subnode, conductor on both.\n\nThis way we\u0027re testing mixed conductor versions, testing new API with both conductor versions in (1), and testing old API with both conductor versions in (2).","commit_id":"11bb3ac9604065b932062d3bd71c0590481223ee"}]}
