On 6/5/13 10:50 AM, "Kishan Kavala" <kishan.kav...@citrix.com> wrote:

>In the mentioned example, when new template for 4.3 is introduced, we
>should remove template upgrade code in Upgrade41to42. This will make
>upgrade succeed even when systemvm-kvm-4.2 is not in database.
>On the other hand, if we allow 'systemvm-kvm-%', upgrade to 4.3 will
>succeed even though the required systemvm-kvm-4.3 is not in database.
>
>So, every time a new system vm template is added, template upgrade from
>previous version should be removed.


Kishan is right, all the obsolete templates should be removed. But we
should also take into consideration the fact that the template you are
trying to remove, might not exist. Here is the scenario:

Customer 1 wants to upgrade from 3.x to 4.2


The 3.0.x-4.0 upgrade code expects to see 4.0 system template, but as the
final upgrade version of the code is 4.2, its not good to ask people to
predownload 2 templates - 4.0 and 4.2 (and for all hypervisors!) - as 4.0
template is useless when upgrade to 4.2. And with every new release this
number will grow.

What  upgrade code should do instead:
 
1) INSERT IGNORE fake DB records for the templates to vm_template table,
expected by the previous upgrade paths.
2) Expect only the template of the final version to be pre-downloaded
3) In the final upgrade step, upgrade all system vms to the template of
the final version
4) Mark all other system templates as removed in the DB

The only one tricky part - when to execute #1. We might introduce some
pre-req sql script that is called before all other upgrade paths are
executed?

Let me know what you think,

-Alena.

>
>________________________________________
>From: Wei ZHOU [ustcweiz...@gmail.com]
>Sent: Wednesday, June 05, 2013 3:56 PM
>To: dev@cloudstack.apache.org
>Subject: Re: git commit: updated refs/heads/master to 9fe7846
>
>Kishan,
>
>I know.
>
>If we upgrade from 4.1 to 4.3 ( assume the systemvm template is
>systemvm-kvm-4.3). We need to add systemvm-kvm-4.3 instead of
>systemvm-kvm-4.2. Maybe systemvm-kvm-4.2 is not in database.
>The upgrade includes Upgrade41to42 and Upgrade42to43. It will fail in the
>Upgrade41to42.
>
>-Wei
>
>
>2013/6/5 Kishan Kavala <kishan.kav...@citrix.com>
>
>> Wei,
>>  If we use other templates, system Vms may not work. Only 4.2 templates
>> should be used when upgrading to 4.2.
>>
>> > -----Original Message-----
>> > From: Wei ZHOU [mailto:ustcweiz...@gmail.com]
>> > Sent: Wednesday, 5 June 2013 3:26 PM
>> > To: dev@cloudstack.apache.org
>> > Subject: Re: git commit: updated refs/heads/master to 9fe7846
>> >
>> > Kishan,
>> >
>> > What do you think about change some codes to "name like 'systemvm-
>> > xenserver-%' " ?
>> > If we use other templates, the upgrade maybe fail.
>> >
>> > -Wei
>> >
>> >
>> > 2013/6/5 <kis...@apache.org>
>> >
>> > > Updated Branches:
>> > >   refs/heads/master 91b15711b -> 9fe7846d7
>> > >
>> > >
>> > > CLOUDSTACK-2728: 41-42 DB upgrade: add step to upgrade system
>> > > templates
>> > >
>> > >
>> > > Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
>> > > Commit:
>> > > http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9fe7846d
>> > > Tree: 
>>http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9fe7846d
>> > > Diff: 
>>http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9fe7846d
>> > >
>> > > Branch: refs/heads/master
>> > > Commit: 9fe7846d72e401720e1dcbce52d021e2646429f1
>> > > Parents: 91b1571
>> > > Author: Harikrishna Patnala <harikrishna.patn...@citrix.com>
>> > > Authored: Mon Jun 3 12:33:58 2013 +0530
>> > > Committer: Kishan Kavala <kis...@cloud.com>
>> > > Committed: Wed Jun 5 15:14:04 2013 +0530
>> > >
>> > > 
>>----------------------------------------------------------------------
>> > >  .../src/com/cloud/upgrade/dao/Upgrade410to420.java |  209
>> > > ++++++++++++++-
>> > >  1 files changed, 204 insertions(+), 5 deletions(-)
>> > > 
>>----------------------------------------------------------------------
>> > >
>> > >
>> > >
>> > > 
>>http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9fe7846d/engine
>> > > /schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
>> > > 
>>----------------------------------------------------------------------
>> > > diff --git
>> > > a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
>> > > b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
>> > > index 1584973..955ea56 100644
>> > > --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
>> > > +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
>> > > @@ -112,16 +112,215 @@ public class Upgrade410to420 implements
>> > DbUpgrade {
>> > >      }
>> > >
>> > >      private void updateSystemVmTemplates(Connection conn) {
>> > > -           PreparedStatement sql = null;
>> > > +
>> > > +        PreparedStatement pstmt = null;
>> > > +        ResultSet rs = null;
>> > > +        boolean xenserver = false;
>> > > +        boolean kvm = false;
>> > > +        boolean VMware = false;
>> > > +        boolean Hyperv = false;
>> > > +        boolean LXC = false;
>> > > +        s_logger.debug("Updating System Vm template IDs");
>> > > +        try{
>> > > +            //Get all hypervisors in use
>> > > +            try {
>> > > +                pstmt = conn.prepareStatement("select
>> > > distinct(hypervisor_type) from `cloud`.`cluster` where removed is
>> > > null");
>> > > +                rs = pstmt.executeQuery();
>> > > +                while(rs.next()){
>> > > +                    if("XenServer".equals(rs.getString(1))){
>> > > +                        xenserver = true;
>> > > +                    } else if("KVM".equals(rs.getString(1))){
>> > > +                        kvm = true;
>> > > +                    } else if("VMware".equals(rs.getString(1))){
>> > > +                        VMware = true;
>> > > +                    } else if("Hyperv".equals(rs.getString(1))) {
>> > > +                        Hyperv = true;
>> > > +                    } else if("LXC".equals(rs.getString(1))) {
>> > > +                        LXC = true;
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>listing
>> > > hypervisors in use", e);
>> > > +            }
>> > > +
>> > > +            s_logger.debug("Updating XenSever System Vms");
>> > > +            //XenServer
>> > > +            try {
>> > > +                //Get 4.2.0 xenserer system Vm template Id
>> > > +                pstmt = conn.prepareStatement("select id from
>> > > `cloud`.`vm_template` where name like 'systemvm-xenserver-4.2' and
>> > > removed is null order by id desc limit 1");
>> > > +                rs = pstmt.executeQuery();
>> > > +                if(rs.next()){
>> > > +                    long templateId = rs.getLong(1);
>> > > +                    rs.close();
>> > > +                    pstmt.close();
>> > > +                    // change template type to SYSTEM
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_template` set type='SYSTEM' where id = ?");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                    // update templete ID of system Vms
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User'
>>and
>> > > hypervisor_type = 'XenServer'");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                } else {
>> > > +                    if (xenserver){
>> > > +                        throw new CloudRuntimeException("4.2.0
>> > > + XenServer
>> > > SystemVm template not found. Cannot upgrade system Vms");
>> > > +                    } else {
>> > > +                        s_logger.warn("4.2.0 XenServer SystemVm
>> > > + template
>> > > not found. XenServer hypervisor is not used, so not failing
>>upgrade");
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>updating
>> > > XenServer systemVm template", e);
>> > > +            }
>> > > +
>> > > +            //KVM
>> > > +            s_logger.debug("Updating KVM System Vms");
>> > > +            try {
>> > > +                //Get 4.2.0 KVM system Vm template Id
>> > > +                pstmt = conn.prepareStatement("select id from
>> > > `cloud`.`vm_template` where name = 'systemvm-kvm-4.2' and removed is
>> > > null order by id desc limit 1");
>> > > +                rs = pstmt.executeQuery();
>> > > +                if(rs.next()){
>> > > +                    long templateId = rs.getLong(1);
>> > > +                    rs.close();
>> > > +                    pstmt.close();
>> > > +                    // change template type to SYSTEM
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_template` set type='SYSTEM' where id = ?");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                    // update templete ID of system Vms
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User'
>>and
>> > > hypervisor_type = 'KVM'");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                } else {
>> > > +                    if (kvm){
>> > > +                        throw new CloudRuntimeException("4.2.0 KVM
>> > > SystemVm template not found. Cannot upgrade system Vms");
>> > > +                    } else {
>> > > +                        s_logger.warn("4.2.0 KVM SystemVm template
>> > > + not
>> > > found. KVM hypervisor is not used, so not failing upgrade");
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>updating
>> > > + KVM
>> > > systemVm template", e);
>> > > +            }
>> > > +
>> > > +            //VMware
>> > > +            s_logger.debug("Updating VMware System Vms");
>> > > +            try {
>> > > +                //Get 4.2.0 VMware system Vm template Id
>> > > +                pstmt = conn.prepareStatement("select id from
>> > > `cloud`.`vm_template` where name = 'systemvm-vmware-4.2' and
>> > removed
>> > > is null order by id desc limit 1");
>> > > +                rs = pstmt.executeQuery();
>> > > +                if(rs.next()){
>> > > +                    long templateId = rs.getLong(1);
>> > > +                    rs.close();
>> > > +                    pstmt.close();
>> > > +                    // change template type to SYSTEM
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_template` set type='SYSTEM' where id = ?");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                    // update templete ID of system Vms
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User'
>>and
>> > > hypervisor_type = 'VMware'");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                } else {
>> > > +                    if (VMware){
>> > > +                        throw new CloudRuntimeException("4.2.0
>>VMware
>> > > SystemVm template not found. Cannot upgrade system Vms");
>> > > +                    } else {
>> > > +                        s_logger.warn("4.2.0 VMware SystemVm
>>template
>> > > + not
>> > > found. VMware hypervisor is not used, so not failing upgrade");
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>updating
>> > > VMware systemVm template", e);
>> > > +            }
>> > > +
>> > > +            //Hyperv
>> > > +            s_logger.debug("Updating Hyperv System Vms");
>> > > +            try {
>> > > +                //Get 4.2.0 Hyperv system Vm template Id
>> > > +                pstmt = conn.prepareStatement("select id from
>> > > `cloud`.`vm_template` where name = 'systemvm-hyperv-4.2' and removed
>> > > is null order by id desc limit 1");
>> > > +                rs = pstmt.executeQuery();
>> > > +                if(rs.next()){
>> > > +                    long templateId = rs.getLong(1);
>> > > +                    rs.close();
>> > > +                    pstmt.close();
>> > > +                    // change template type to SYSTEM
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_template` set type='SYSTEM' where id = ?");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                    // update templete ID of system Vms
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User'
>>and
>> > > hypervisor_type = 'Hyperv'");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                } else {
>> > > +                    if (Hyperv){
>> > > +                        throw new CloudRuntimeException("4.2.0
>>HyperV
>> > > SystemVm template not found. Cannot upgrade system Vms");
>> > > +                    } else {
>> > > +                        s_logger.warn("4.2.0 Hyperv SystemVm
>>template
>> > > + not
>> > > found. Hyperv hypervisor is not used, so not failing upgrade");
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>updating
>> > > Hyperv systemVm template", e);
>> > > +            }
>> > > +
>> > > +            //LXC
>> > > +            s_logger.debug("Updating LXC System Vms");
>> > > +            try {
>> > > +                //Get 4.2.0 LXC system Vm template Id
>> > > +                pstmt = conn.prepareStatement("select id from
>> > > `cloud`.`vm_template` where name = 'systemvm-lxc-4.2' and removed is
>> > > null order by id desc limit 1");
>> > > +                rs = pstmt.executeQuery();
>> > > +                if(rs.next()){
>> > > +                    long templateId = rs.getLong(1);
>> > > +                    rs.close();
>> > > +                    pstmt.close();
>> > > +                    // change template type to SYSTEM
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_template` set type='SYSTEM' where id = ?");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                    // update templete ID of system Vms
>> > > +                    pstmt = conn.prepareStatement("update
>> > > `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User'
>>and
>> > > hypervisor_type = 'LXC'");
>> > > +                    pstmt.setLong(1, templateId);
>> > > +                    pstmt.executeUpdate();
>> > > +                    pstmt.close();
>> > > +                } else {
>> > > +                    if (LXC){
>> > > +                        throw new CloudRuntimeException("4.2.0 LXC
>> > > SystemVm template not found. Cannot upgrade system Vms");
>> > > +                    } else {
>> > > +                        s_logger.warn("4.2.0 LXC SystemVm template
>> > > + not
>> > > found. LXC hypervisor is not used, so not failing upgrade");
>> > > +                    }
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +                throw new CloudRuntimeException("Error while
>>updating
>> > > + LXC
>> > > systemVm template", e);
>> > > +            }
>> > > +            s_logger.debug("Updating System Vm Template IDs
>> Complete");
>> > > +        }
>> > > +        finally {
>> > > +            try {
>> > > +                if (rs != null) {
>> > > +                    rs.close();
>> > > +                }
>> > > +
>> > > +                if (pstmt != null) {
>> > > +                    pstmt.close();
>> > > +                }
>> > > +            } catch (SQLException e) {
>> > > +            }
>> > > +        }
>> > > +        pstmt = null;
>> > >          try {
>> > > -            sql = conn.prepareStatement("update vm_template set
>> > > image_data_store_id = 1 where type = 'SYSTEM' or type = 'BUILTIN'");
>> > > -            sql.executeUpdate();
>> > > +            pstmt = conn.prepareStatement("update vm_template set
>> > > image_data_store_id = 1 where type = 'SYSTEM' or type = 'BUILTIN'");
>> > > +            pstmt.executeUpdate();
>> > >          } catch (SQLException e) {
>> > >              throw new CloudRuntimeException("Failed to upgrade vm
>> > > template data store uuid: " + e.toString());
>> > >          } finally {
>> > > -            if (sql != null) {
>> > > +            if (pstmt != null) {
>> > >                  try {
>> > > -                    sql.close();
>> > > +                    pstmt.close();
>> > >                  } catch (SQLException e) {
>> > >                  }
>> > >              }
>> > >
>> > >
>>
>


Reply via email to