| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| package com.cloud.upgrade.dao; |
| |
| import java.io.InputStream; |
| import java.sql.Connection; |
| import java.sql.PreparedStatement; |
| import java.sql.ResultSet; |
| import java.sql.SQLException; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| |
| |
| import com.cloud.hypervisor.Hypervisor; |
| import com.cloud.utils.exception.CloudRuntimeException; |
| |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.Hyperv; |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.KVM; |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.LXC; |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.Ovm3; |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.VMware; |
| import static com.cloud.hypervisor.Hypervisor.HypervisorType.XenServer; |
| |
| public class Upgrade41500to41510 extends DbUpgradeAbstractImpl implements DbUpgradeSystemVmTemplate { |
| |
| @Override |
| public String[] getUpgradableVersionRange() { |
| return new String[] {"4.15.0.0", "4.15.1.0"}; |
| } |
| |
| @Override |
| public String getUpgradedVersion() { |
| return "4.15.1.0"; |
| } |
| |
| @Override |
| public boolean supportsRollingUpgrade() { |
| return false; |
| } |
| |
| @Override |
| public InputStream[] getPrepareScripts() { |
| final String scriptFile = "META-INF/db/schema-41500to41510.sql"; |
| final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); |
| if (script == null) { |
| throw new CloudRuntimeException("Unable to find " + scriptFile); |
| } |
| |
| return new InputStream[] {script}; |
| } |
| |
| @Override |
| public void performDataMigration(Connection conn) { |
| // nothing to do for this upgrade |
| } |
| |
| @Override |
| @SuppressWarnings("serial") |
| public void updateSystemVmTemplates(final Connection conn) { |
| logger.debug("Updating System Vm template IDs"); |
| final Set<Hypervisor.HypervisorType> hypervisorsListInUse = new HashSet<Hypervisor.HypervisorType>(); |
| try (PreparedStatement pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); ResultSet rs = pstmt.executeQuery()) { |
| while (rs.next()) { |
| Hypervisor.HypervisorType type = Hypervisor.HypervisorType.getType(rs.getString(1)); |
| if (type.equals(XenServer)) { |
| hypervisorsListInUse.add(XenServer); |
| } else if (type.equals(KVM)) { |
| hypervisorsListInUse.add(KVM); |
| } else if (type.equals(VMware)) { |
| hypervisorsListInUse.add(VMware); |
| } else if (type.equals(Hyperv)) { |
| hypervisorsListInUse.add(Hyperv); |
| } else if (type.equals(LXC)) { |
| hypervisorsListInUse.add(LXC); |
| } else if (type.equals(Ovm3)) { |
| hypervisorsListInUse.add(Ovm3); |
| } |
| } |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates: Exception caught while getting hypervisor types from clusters: " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting hypervisor types from clusters", e); |
| } |
| |
| final Map<Hypervisor.HypervisorType, String> NewTemplateNameList = new HashMap<Hypervisor.HypervisorType, String>() { |
| { |
| put(KVM, "systemvm-kvm-4.15.1"); |
| put(VMware, "systemvm-vmware-4.15.1"); |
| put(XenServer, "systemvm-xenserver-4.15.1"); |
| put(Hyperv, "systemvm-hyperv-4.15.1"); |
| put(LXC, "systemvm-lxc-4.15.1"); |
| put(Ovm3, "systemvm-ovm3-4.15.1"); |
| } |
| }; |
| |
| final Map<Hypervisor.HypervisorType, String> routerTemplateConfigurationNames = new HashMap<Hypervisor.HypervisorType, String>() { |
| { |
| put(KVM, "router.template.kvm"); |
| put(VMware, "router.template.vmware"); |
| put(XenServer, "router.template.xenserver"); |
| put(Hyperv, "router.template.hyperv"); |
| put(LXC, "router.template.lxc"); |
| put(Ovm3, "router.template.ovm3"); |
| } |
| }; |
| |
| final Map<Hypervisor.HypervisorType, String> newTemplateUrl = new HashMap<Hypervisor.HypervisorType, String>() { |
| { |
| put(KVM, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-kvm.qcow2.bz2"); |
| put(VMware, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-vmware.ova"); |
| put(XenServer, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-xen.vhd.bz2"); |
| put(Hyperv, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-hyperv.vhd.zip"); |
| put(LXC, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-kvm.qcow2.bz2"); |
| put(Ovm3, "https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-ovm.raw.bz2"); |
| } |
| }; |
| |
| final Map<Hypervisor.HypervisorType, String> newTemplateChecksum = new HashMap<Hypervisor.HypervisorType, String>() { |
| { |
| put(KVM, "0e9f9a7d0957c3e0a2088e41b2da2cec"); |
| put(XenServer, "86373992740b1eca8aff8b08ebf3aea5"); |
| put(VMware, "4006982765846d373eb3719b2fe4d720"); |
| put(Hyperv, "0b9514e4b6cba1f636fea2125f0f7a5f"); |
| put(LXC, "0e9f9a7d0957c3e0a2088e41b2da2cec"); |
| put(Ovm3, "ae3977e696b3e6c81bdcbb792d514d29"); |
| } |
| }; |
| |
| for (final Map.Entry<Hypervisor.HypervisorType, String> hypervisorAndTemplateName : NewTemplateNameList.entrySet()) { |
| logger.debug("Updating " + hypervisorAndTemplateName.getKey() + " System Vms"); |
| try (PreparedStatement pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = ? and removed is null and account_id in (select id from account where type = 1 and removed is NULL) order by id desc limit 1")) { |
| // Get systemvm template id for corresponding hypervisor |
| long templateId = -1; |
| pstmt.setString(1, hypervisorAndTemplateName.getValue()); |
| try (ResultSet rs = pstmt.executeQuery()) { |
| if (rs.next()) { |
| templateId = rs.getLong(1); |
| } |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates: Exception caught while getting ids of templates: " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates: Exception caught while getting ids of templates", e); |
| } |
| |
| // change template type to SYSTEM |
| if (templateId != -1) { |
| try (PreparedStatement templ_type_pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");) { |
| templ_type_pstmt.setLong(1, templateId); |
| templ_type_pstmt.executeUpdate(); |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system': " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system'", e); |
| } |
| // update template ID of system Vms |
| try (PreparedStatement update_templ_id_pstmt = conn |
| .prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = ? and removed is NULL");) { |
| update_templ_id_pstmt.setLong(1, templateId); |
| update_templ_id_pstmt.setString(2, hypervisorAndTemplateName.getKey().toString()); |
| update_templ_id_pstmt.executeUpdate(); |
| } catch (final Exception e) { |
| logger.error("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + templateId |
| + ": " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " |
| + templateId, e); |
| } |
| |
| // Change value of global configuration parameter |
| // router.template.* for the corresponding hypervisor |
| try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { |
| update_pstmt.setString(1, hypervisorAndTemplateName.getValue()); |
| update_pstmt.setString(2, routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey())); |
| update_pstmt.executeUpdate(); |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates:Exception while setting " + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " |
| + hypervisorAndTemplateName.getValue() + ": " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting " |
| + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + hypervisorAndTemplateName.getValue(), e); |
| } |
| |
| // Change value of global configuration parameter |
| // minreq.sysvmtemplate.version for the ACS version |
| try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { |
| update_pstmt.setString(1, "4.15.1"); |
| update_pstmt.setString(2, "minreq.sysvmtemplate.version"); |
| update_pstmt.executeUpdate(); |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.15.1: " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.15.1", e); |
| } |
| } else { |
| if (hypervisorsListInUse.contains(hypervisorAndTemplateName.getKey())) { |
| throw new CloudRuntimeException(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. Cannot upgrade system Vms"); |
| } else { |
| logger.warn(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. " + hypervisorAndTemplateName.getKey() |
| + " hypervisor is not used, so not failing upgrade"); |
| // Update the latest template URLs for corresponding |
| // hypervisor |
| try (PreparedStatement update_templ_url_pstmt = conn |
| .prepareStatement("UPDATE `cloud`.`vm_template` SET url = ? , checksum = ? WHERE hypervisor_type = ? AND type = 'SYSTEM' AND removed is null order by id desc limit 1");) { |
| update_templ_url_pstmt.setString(1, newTemplateUrl.get(hypervisorAndTemplateName.getKey())); |
| update_templ_url_pstmt.setString(2, newTemplateChecksum.get(hypervisorAndTemplateName.getKey())); |
| update_templ_url_pstmt.setString(3, hypervisorAndTemplateName.getKey().toString()); |
| update_templ_url_pstmt.executeUpdate(); |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " |
| + hypervisorAndTemplateName.getKey().toString() + ": " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " |
| + hypervisorAndTemplateName.getKey().toString(), e); |
| } |
| } |
| } |
| } catch (final SQLException e) { |
| logger.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage()); |
| throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e); |
| } |
| } |
| logger.debug("Updating System Vm Template IDs Complete"); |
| } |
| |
| @Override |
| public InputStream[] getCleanupScripts() { |
| final String scriptFile = "META-INF/db/schema-41500to41510-cleanup.sql"; |
| final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); |
| if (script == null) { |
| throw new CloudRuntimeException("Unable to find " + scriptFile); |
| } |
| |
| return new InputStream[] {script}; |
| } |
| } |