Add nova service support for composable upgrades
authorSteven Hardy <shardy@redhat.com>
Thu, 1 Dec 2016 10:02:56 +0000 (10:02 +0000)
committerOliver Walsh <owalsh@redhat.com>
Tue, 14 Feb 2017 23:23:33 +0000 (23:23 +0000)
Co-Authored-By: Mathieu Bultel <mbultel@redhat.com>
Co-Authored-By: Oliver Walsh <owalsh@redhat.com>
Change-Id: Iafad800a6819d7e75fdaab60d328999d3d3c037f
Partially-Implements: blueprint overcloud-upgrades-per-service
Related-Bug: #1662344

environments/major-upgrade-composable-steps.yaml
puppet/services/database/mysql.yaml
puppet/services/nova-api.yaml
puppet/services/nova-base.yaml
puppet/services/nova-compute.yaml
puppet/services/nova-conductor.yaml
puppet/services/nova-consoleauth.yaml
puppet/services/nova-scheduler.yaml
puppet/services/nova-vnc-proxy.yaml
puppet/upgrade_config.yaml

index 4283b21..44580b4 100644 (file)
@@ -1,2 +1,4 @@
 resource_registry:
   OS::TripleO::PostDeploySteps: ../puppet/major_upgrade_steps.yaml
+parameter_defaults:
+  UpgradeLevelNovaCompute: auto
index 8c4042d..808f135 100644 (file)
@@ -34,6 +34,10 @@ parameters:
     default: true
     description: Whether to use Galera instead of regular MariaDB.
     type: boolean
+  NovaPassword:
+    description: The password for the nova db account
+    type: string
+    hidden: true
 
 resources:
 
@@ -94,6 +98,8 @@ outputs:
               {get_param: [ServiceNetMap, MysqlNetwork]}
       step_config: |
         include ::tripleo::profile::base::database::mysql
+      metadata_settings:
+        get_attr: [MySQLTLS, role_data, metadata_settings]
       upgrade_tasks:
         - name: Check for galera root password
           tags: step0
@@ -104,6 +110,15 @@ outputs:
         - name: Start service
           tags: step4
           service: name=mariadb state=started
-      metadata_settings:
-        get_attr: [MySQLTLS, role_data, metadata_settings]
-
+        - name: Setup cell_v2 (create cell0 database)
+          tags: step4
+          mysql_db:
+            name: nova_cell0
+            state: present
+        - name: Setup cell_v2 (grant access to the nova DB user)
+          tags: step4
+          mysql_user:
+            str_replace:
+              template: "name=nova password=PASSWORD host=\"%\" priv=\"nova.*:ALL/nova_cell0.*:ALL,GRANT\" state=present"
+              params:
+                PASSWORD: {get_param: NovaPassword}
index 0c5f3af..9e097d9 100644 (file)
@@ -58,6 +58,10 @@ parameters:
     default: 'public'
     description: Default pool for floating IP addresses
     type: string
+  NovaDbSyncTimeout:
+    default: 300
+    description: Timeout for Nova db sync
+    type: number
 
 conditions:
   nova_workers_zero: {equals : [{get_param: NovaWorkers}, 0]}
@@ -178,3 +182,86 @@ outputs:
       # https://bugs.launchpad.net/nova/+bug/1661360
       # metadata_settings:
       #   get_attr: [ApacheServiceBase, role_data, metadata_settings]
+      upgrade_tasks:
+        - name: get bootstrap nodeid
+          tags: common
+          command: hiera bootstrap_nodeid
+          register: bootstrap_node
+        - name: set is_bootstrap_node fact
+          tags: common
+          set_fact: is_bootstrap_node={{bootstrap_node.stdout == ansible_hostname}}
+        - name: Extra migration for nova tripleo/+bug/1656791
+          tags: step0,pre-upgrade
+          when: is_bootstrap_node
+          command: nova-manage db online_data_migrations
+        - name: update nova api
+          tags: step2
+          yum: name=openstack-nova-api state=latest
+        - name: Stop and disable nova_api service (pre-upgrade not under httpd)
+          tags: step2
+          service: name=openstack-nova-api state=stopped enabled=no
+        - name: Create puppet manifest to set transport_url in nova.conf
+          tags: step5
+          when: is_bootstrap_node
+          copy:
+            dest: /root/nova-api_upgrade_manifest.pp
+            mode: 0600
+            content: >
+              $transport_url = os_transport_url({
+                'transport' => hiera('messaging_service_name', 'rabbit'),
+                'hosts'     => any2array(hiera('rabbitmq_node_names', undef)),
+                'port'      => sprintf('%s',hiera('nova::rabbit_port', '5672') ),
+                'username'  => hiera('nova::rabbit_userid', 'guest'),
+                'password'  => hiera('nova::rabbit_password'),
+                'ssl'       => sprintf('%s', bool2num(str2bool(hiera('nova::rabbit_use_ssl', '0'))))
+              })
+              oslo::messaging::default { 'nova_config':
+                transport_url => $transport_url
+              }
+        - name: Run puppet apply to set tranport_url in nova.conf
+          tags: step5
+          when: is_bootstrap_node
+          command: puppet apply --detailed-exitcodes /root/nova-api_upgrade_manifest.pp
+          register: puppet_apply_nova_api_upgrade
+          failed_when: puppet_apply_nova_api_upgrade.rc not in [0,2]
+          changed_when: puppet_apply_nova_api_upgrade.rc == 2
+        - name: Setup cell_v2 (map cell0)
+          tags: step5
+          when: is_bootstrap_node
+          command: nova-manage cell_v2 map_cell0
+        - name: Setup cell_v2 (create default cell)
+          tags: step5
+          when: is_bootstrap_node
+          # (owalsh) puppet-nova expects the cell name 'default'
+          # (owalsh) pass the db uri explicitly to avoid https://bugs.launchpad.net/tripleo/+bug/1662344
+          shell: nova-manage cell_v2 create_cell --name='default' --database_connection=$(hiera nova::database_connection)
+          register: nova_api_create_cell
+          failed_when: nova_api_create_cell.rc not in [0,2]
+          changed_when: nova_api_create_cell.rc == 0
+        - name: Setup cell_v2 (sync nova/cell DB)
+          tags: step5
+          when: is_bootstrap_node
+          command: nova-manage db sync
+          async: {get_param: NovaDbSyncTimeout}
+          poll: 10
+        - name: Setup cell_v2 (migrate hosts)
+          tags: step5
+          when: is_bootstrap_node
+          command: nova-manage cell_v2 map_cell_and_hosts
+        - name: Setup cell_v2 (get cell uuid)
+          tags: step5
+          when: is_bootstrap_node
+          shell: nova-manage cell_v2 list_cells | sed -e '1,3d' -e '$d' | awk -F ' *| *' '$2 == "default" {print $4}'
+          register: nova_api_cell_uuid
+        - name: Setup cell_v2 (migrate instances)
+          tags: step5
+          when: is_bootstrap_node
+          command: nova-manage cell_v2 map_instances --cell_uuid {{nova_api_cell_uuid.stdout}}
+        - name: Sync nova_api DB
+          tags: step5
+          command: nova-manage api_db sync
+          when: is_bootstrap_node
+        - name: Online data migration for nova
+          tags: step5
+          when: is_bootstrap_node
+          command: nova-manage db online_data_migrations
index 49cba79..e6c455e 100644 (file)
@@ -116,7 +116,6 @@ parameters:
         Cron to move deleted instances to another table - Until complete
     default: false
 
-
 conditions:
 
   compute_upgrade_level_empty: {equals : [{get_param: UpgradeLevelNovaCompute}, '']}
index f7484da..9923e83 100644 (file)
@@ -75,6 +75,10 @@ parameters:
     default:
       tag: openstack.nova.compute
       path: /var/log/nova/nova-compute.log
+  UpgradeLevelNovaCompute:
+    type: string
+    description: Nova Compute upgrade level
+    default: auto
 
 resources:
   NovaBase:
@@ -146,3 +150,19 @@ outputs:
           tripleo.collectd.plugins.nova_compute:
             - virt
           collectd::plugins::virt::connection: "qemu:///system"
+      upgrade_tasks:
+        - name: Stop nova-compute service
+          tags: step2
+          service: name=openstack-nova-compute state=stopped
+        # If not already set by puppet (e.g a pre-ocata version), set the
+        # upgrade_level for compute to "auto"
+        - name: Set compute upgrade level to auto
+          tags: step3
+          ini_file:
+            str_replace:
+              template: "dest=/etc/nova/nova.conf section=upgrade_levels option=compute value=LEVEL"
+              params:
+                LEVEL: {get_param: UpgradeLevelNovaCompute}
+        - name: Start nova-compute service
+          tags: step6
+          service: name=openstack-nova-compute state=started
index b96bf6e..7b08653 100644 (file)
@@ -30,6 +30,10 @@ parameters:
     default:
       tag: openstack.nova.scheduler
       path: /var/log/nova/nova-scheduler.log
+  UpgradeLevelNovaCompute:
+    type: string
+    description: Nova Compute upgrade level
+    default: auto
 
 conditions:
   nova_workers_zero: {equals : [{get_param: NovaWorkers}, 0]}
@@ -61,3 +65,19 @@ outputs:
           - nova::conductor::workers: {get_param: NovaWorkers}
       step_config: |
         include tripleo::profile::base::nova::conductor
+      upgrade_tasks:
+        - name: Stop nova_conductor service
+          tags: step2
+          service: name=openstack-nova-conductor state=stopped
+        - name: update nova conductor
+          tags: step2
+          yum: name=openstack-nova-conductor state=latest
+        # If not already set by puppet (e.g a pre-ocata version), set the
+        # upgrade_level for compute to "auto"
+        - name: Set compute upgrade level to auto
+          tags: step3
+          ini_file:
+            str_replace:
+              template: "dest=/etc/nova/nova.conf section=upgrade_levels option=compute value=LEVEL"
+              params:
+                LEVEL: {get_param: UpgradeLevelNovaCompute}
index 79969de..b5a1312 100644 (file)
@@ -48,3 +48,7 @@ outputs:
         get_attr: [NovaBase, role_data, config_settings]
       step_config: |
         include tripleo::profile::base::nova::consoleauth
+      upgrade_tasks:
+        - name: Stop nova_consoleauth service
+          tags: step2
+          service: name=openstack-nova-consoleauth state=stopped
index 353a75a..0e0b9d1 100644 (file)
@@ -63,3 +63,10 @@ outputs:
             nova::scheduler::filter::scheduler_default_filters: {get_param: NovaSchedulerDefaultFilters}
       step_config: |
         include tripleo::profile::base::nova::scheduler
+      upgrade_tasks:
+        - name: Stop nova_scheduler service
+          tags: step2
+          service: name=openstack-nova-scheduler state=stopped
+        - name: update nova scheduler
+          tags: step2
+          yum: name=openstack-nova-scheduler state=latest
index bf24494..f6cf964 100644 (file)
@@ -64,3 +64,7 @@ outputs:
                   - 13080
       step_config: |
         include tripleo::profile::base::nova::vncproxy
+      upgrade_tasks:
+        - name: Stop nova_vnc_proxy service
+          tags: step2
+          service: name=openstack-nova-consoleauth state=stopped
index c37cc03..2cfd43f 100644 (file)
@@ -41,7 +41,7 @@ resources:
             - {get_param: SkipUpgradeConfigTags}
         tags:
           str_replace:
-            template: "stepSTEP"
+            template: "common,stepSTEP"
             params:
               STEP: {get_param: step}
         modulepath: /usr/share/ansible-modules