mirror of https://github.com/apache/cloudstack.git
237 lines
9.2 KiB
Java
Executable File
237 lines
9.2 KiB
Java
Executable File
// Copyright 2012 Citrix Systems, Inc. Licensed under the
|
|
// Apache License, Version 2.0 (the "License"); you may not use this
|
|
// file except in compliance with the License. Citrix Systems, Inc.
|
|
// reserves all rights not expressly granted by 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.
|
|
//
|
|
// Automatically generated by addcopyright.py at 04/03/2012
|
|
package com.cloud.migration;
|
|
|
|
import java.io.File;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.Queue;
|
|
|
|
import org.apache.log4j.xml.DOMConfigurator;
|
|
|
|
import com.cloud.configuration.Resource;
|
|
import com.cloud.configuration.Resource.ResourceType;
|
|
import com.cloud.configuration.ResourceCountVO;
|
|
import com.cloud.configuration.dao.ConfigurationDao;
|
|
import com.cloud.configuration.dao.ResourceCountDao;
|
|
import com.cloud.dc.ClusterVO;
|
|
import com.cloud.dc.DataCenter.NetworkType;
|
|
import com.cloud.dc.DataCenterVO;
|
|
import com.cloud.dc.dao.ClusterDao;
|
|
import com.cloud.dc.dao.DataCenterDao;
|
|
import com.cloud.domain.DomainVO;
|
|
import com.cloud.domain.dao.DomainDao;
|
|
import com.cloud.host.HostVO;
|
|
import com.cloud.host.dao.HostDao;
|
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
|
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
|
|
import com.cloud.resource.ResourceManager;
|
|
import com.cloud.user.Account;
|
|
import com.cloud.user.dao.AccountDao;
|
|
import com.cloud.utils.PropertiesUtil;
|
|
import com.cloud.utils.component.ComponentLocator;
|
|
import com.cloud.utils.db.SearchBuilder;
|
|
import com.cloud.utils.db.SearchCriteria;
|
|
import com.cloud.utils.db.Transaction;
|
|
import com.cloud.vm.InstanceGroupVMMapVO;
|
|
import com.cloud.vm.InstanceGroupVO;
|
|
import com.cloud.vm.dao.InstanceGroupDao;
|
|
import com.cloud.vm.dao.InstanceGroupVMMapDao;
|
|
import com.xensource.xenapi.Connection;
|
|
import com.xensource.xenapi.Pool;
|
|
import com.xensource.xenapi.Session;
|
|
|
|
public class Db21to22MigrationUtil {
|
|
private ClusterDao _clusterDao;
|
|
private HostDao _hostDao;
|
|
private AccountDao _accountDao;
|
|
private DomainDao _domainDao;
|
|
private ResourceCountDao _resourceCountDao;
|
|
private InstanceGroupDao _vmGroupDao;
|
|
private InstanceGroupVMMapDao _groupVMMapDao;
|
|
private ConfigurationDao _configurationDao;
|
|
private DataCenterDao _zoneDao;
|
|
private ResourceManager _resourceMgr;
|
|
|
|
private void doMigration() {
|
|
setupComponents();
|
|
|
|
migrateResourceCounts();
|
|
|
|
setupInstanceGroups();
|
|
|
|
migrateZones();
|
|
|
|
setupClusterGuid();
|
|
|
|
System.out.println("Migration done");
|
|
}
|
|
|
|
/* add guid in cluster table */
|
|
private void setupClusterGuid() {
|
|
XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance();
|
|
List<ClusterVO> clusters = _clusterDao.listByHyTypeWithoutGuid(HypervisorType.XenServer.toString());
|
|
for (ClusterVO cluster : clusters) {
|
|
List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cluster.getId());
|
|
for (HostVO host : hosts) {
|
|
String ip = host.getPrivateIpAddress();
|
|
String username = host.getDetail("username");
|
|
String password = host.getDetail("password");
|
|
if (ip == null || ip.isEmpty() || username == null || username.isEmpty() || password == null
|
|
|| password.isEmpty()) {
|
|
continue;
|
|
}
|
|
Queue<String> pass=new LinkedList<String>();
|
|
pass.add(password);
|
|
Connection conn = _connPool.slaveConnect(ip, username, pass);
|
|
if (conn == null)
|
|
continue;
|
|
Pool.Record pr = null;
|
|
try {
|
|
pr = XenServerConnectionPool.getPoolRecord(conn);
|
|
} catch (Exception e) {
|
|
continue;
|
|
} finally {
|
|
try {
|
|
Session.localLogout(conn);
|
|
} catch (Exception e) {
|
|
}
|
|
}
|
|
cluster.setGuid(pr.uuid);
|
|
_clusterDao.update(cluster.getId(), cluster);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method migrates the zones based on bug: 7204
|
|
* based on the param direct.attach.untagged.vlan.enabled, we update zone to basic or advanced for 2.2
|
|
*/
|
|
private void migrateZones(){
|
|
try {
|
|
System.out.println("Migrating zones");
|
|
String val = _configurationDao.getValue("direct.attach.untagged.vlan.enabled");
|
|
NetworkType networkType;
|
|
if(val == null || val.equalsIgnoreCase("true")){
|
|
networkType = NetworkType.Basic;
|
|
}else{
|
|
networkType = NetworkType.Advanced;
|
|
}
|
|
List<DataCenterVO> existingZones = _zoneDao.listAll();
|
|
for(DataCenterVO zone : existingZones){
|
|
zone.setNetworkType(networkType);
|
|
_zoneDao.update(zone.getId(), zone);
|
|
}
|
|
} catch (Exception e) {
|
|
System.out.println("Unhandled exception in migrateZones()" + e);
|
|
}
|
|
}
|
|
|
|
private void migrateResourceCounts() {
|
|
System.out.println("migrating resource counts");
|
|
SearchBuilder<ResourceCountVO> sb = _resourceCountDao.createSearchBuilder();
|
|
sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ);
|
|
|
|
for (ResourceType type : Resource.ResourceType.values()) {
|
|
SearchCriteria<ResourceCountVO> sc = sb.create();
|
|
sc.setParameters("type", type);
|
|
|
|
List<ResourceCountVO> resourceCounts = _resourceCountDao.search(sc, null);
|
|
for (ResourceCountVO resourceCount : resourceCounts) {
|
|
if (resourceCount.getAccountId() != null) {
|
|
Account acct = _accountDao.findById(resourceCount.getAccountId());
|
|
Long domainId = acct.getDomainId();
|
|
while (domainId != null) {
|
|
_resourceCountDao.updateDomainCount(domainId, type, true, resourceCount.getCount());
|
|
DomainVO domain = _domainDao.findById(domainId);
|
|
domainId = domain.getParent();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
System.out.println("done migrating resource counts");
|
|
}
|
|
|
|
private void setupComponents() {
|
|
ComponentLocator locator = ComponentLocator.getLocator("migration", "migration-components.xml", "log4j-cloud.xml");
|
|
|
|
_accountDao = locator.getDao(AccountDao.class);
|
|
_domainDao = locator.getDao(DomainDao.class);
|
|
_resourceCountDao = locator.getDao(ResourceCountDao.class);
|
|
_vmGroupDao = locator.getDao(InstanceGroupDao.class);
|
|
_groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class);
|
|
_configurationDao = locator.getDao(ConfigurationDao.class);
|
|
_zoneDao = locator.getDao(DataCenterDao.class);
|
|
_resourceMgr = locator.getManager(ResourceManager.class);
|
|
}
|
|
|
|
private void setupInstanceGroups() {
|
|
System.out.println("setting up vm instance groups");
|
|
|
|
//Search for all the vms that have not null groups
|
|
Long vmId = 0L;
|
|
Long accountId = 0L;
|
|
String groupName;
|
|
Transaction txn = Transaction.open(Transaction.CLOUD_DB);
|
|
txn.start();
|
|
try {
|
|
String request = "SELECT vm.id, uservm.account_id, vm.group from vm_instance vm, user_vm uservm where vm.group is not null and vm.removed is null and vm.id=uservm.id order by id";
|
|
System.out.println(request);
|
|
PreparedStatement statement = txn.prepareStatement(request);
|
|
ResultSet result = statement.executeQuery();
|
|
while (result.next()) {
|
|
vmId = result.getLong(1);
|
|
accountId = result.getLong(2);
|
|
groupName = result.getString(3);
|
|
InstanceGroupVO group = _vmGroupDao.findByAccountAndName(accountId, groupName);
|
|
//Create vm group if the group doesn't exist for this account
|
|
if (group == null) {
|
|
group = new InstanceGroupVO(groupName, accountId);
|
|
group = _vmGroupDao.persist(group);
|
|
System.out.println("Created new isntance group with name " + groupName + " for account id=" + accountId);
|
|
}
|
|
|
|
if (group != null) {
|
|
InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(group.getId(), vmId);
|
|
_groupVMMapDao.persist(groupVmMapVO);
|
|
System.out.println("Assigned vm id=" + vmId + " to group with name " + groupName + " for account id=" + accountId);
|
|
}
|
|
}
|
|
txn.commit();
|
|
statement.close();
|
|
} catch (Exception e) {
|
|
System.out.println("Unhandled exception: " + e);
|
|
} finally {
|
|
txn.close();
|
|
}
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
File file = PropertiesUtil.findConfigFile("log4j-cloud.xml");
|
|
|
|
if (file != null) {
|
|
System.out.println("Log4j configuration from : " + file.getAbsolutePath());
|
|
DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000);
|
|
} else {
|
|
System.out.println("Configure log4j with default properties");
|
|
}
|
|
|
|
new Db21to22MigrationUtil().doMigration();
|
|
System.exit(0);
|
|
}
|
|
}
|