I'm not sure if this fits in the discussion, I was asking Wei how cloudstack chooses the system vm template during normal operation. I get how the upgrades work, but I don't get how cloudstack chooses the system template to use when actually deploying:
I'm looking at it from a different perspective, not a CS upgrade, but say we have to roll a new systemvm template for an existing CS version. Say we rolled 4.2, with a new template, and then two months later we realize that the template is missing dnsmasq or something, and we have to have everyone install a new template. Do we actually have to overwrite the existing template in-place on secondary storage, then on each primary storage while the system vms are down? Or can we register a new template, and the new template gets installed on primary storage as system vms are rebooted. I saw that the upgrade scripts had that 'select max' statement, but that just fetches the id for installing the template to secondary storage. When I deploy a router, how does cloudstack select the template for that? On Fri, Jun 7, 2013 at 12:15 AM, Wei ZHOU <ustcweiz...@gmail.com> wrote: > In my point view, we ask users register new template in the upgrade > instruction in release notes. If they do not register, it is their > fault. If they do but upgrade fails, it is our fault. > > I admit that it is a good way to change each upgrade process and > remove old templates when we use new template. It is not large work. > > -Wei > > 2013/6/6, Kishan Kavala <kishan.kav...@citrix.com>: >> 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. >> >> ________________________________________ >> 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) { >>> > > } >>> > > } >>> > > >>> > > >>> >>