// 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.resource; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.network.NetworkManager; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.net.UrlUtil; public abstract class DiscovererBase implements Discoverer { protected String _name; protected Map<String, String> _params; private static final Logger s_logger = Logger.getLogger(DiscovererBase.class); @Inject protected ClusterDao _clusterDao; @Inject protected ConfigurationDao _configDao; @Inject protected NetworkManager _networkMgr; @Inject protected HostDao _hostDao; @Override public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { ConfigurationDao dao = ComponentLocator.getCurrentLocator().getDao(ConfigurationDao.class); _params = dao.getConfiguration(params); _name = name; return true; } protected Map<String, String> resolveInputParameters(URL url) { Map<String, String> params = UrlUtil.parseQueryParameters(url); return null; } @Override public void putParam(Map<String, String> params) { if (_params == null) { _params = new HashMap<String, String>(); } _params.putAll(params); } @Override public String getName() { return _name; } @Override public boolean start() { return true; } @Override public boolean stop() { return true; } protected ServerResource getResource(String resourceName){ ServerResource resource = null; try { Class<?> clazz = Class.forName(resourceName); Constructor constructor = clazz.getConstructor(); resource = (ServerResource) constructor.newInstance(); } catch (ClassNotFoundException e) { s_logger.warn("Unable to find class " + resourceName, e); } catch (InstantiationException e) { s_logger.warn("Unablet to instantiate class " + resourceName, e); } catch (IllegalAccessException e) { s_logger.warn("Illegal access " + resourceName, e); } catch (SecurityException e) { s_logger.warn("Security error on " + resourceName, e); } catch (NoSuchMethodException e) { s_logger.warn("NoSuchMethodException error on " + resourceName, e); } catch (IllegalArgumentException e) { s_logger.warn("IllegalArgumentException error on " + resourceName, e); } catch (InvocationTargetException e) { s_logger.warn("InvocationTargetException error on " + resourceName, e); } return resource; } protected HashMap<String, Object> buildConfigParams(HostVO host){ HashMap<String, Object> params = new HashMap<String, Object>(host.getDetails().size() + 5); params.putAll(host.getDetails()); params.put("guid", host.getGuid()); params.put("zone", Long.toString(host.getDataCenterId())); if (host.getPodId() != null) { params.put("pod", Long.toString(host.getPodId())); } if (host.getClusterId() != null) { params.put("cluster", Long.toString(host.getClusterId())); String guid = null; ClusterVO cluster = _clusterDao.findById(host.getClusterId()); if (cluster.getGuid() == null) { guid = host.getDetail("pool"); } else { guid = cluster.getGuid(); } if (guid != null && !guid.isEmpty()) { params.put("pool", guid); } } params.put("ipaddress", host.getPrivateIpAddress()); params.put("secondary.storage.vm", "false"); params.put("max.template.iso.size", _configDao.getValue(Config.MaxTemplateAndIsoSize.toString())); params.put("migratewait", _configDao.getValue(Config.MigrateWait.toString())); return params; } @Override public ServerResource reloadResource(HostVO host) { String resourceName = host.getResource(); ServerResource resource = getResource(resourceName); if(resource != null){ _hostDao.loadDetails(host); updateNetworkLabels(host); HashMap<String, Object> params = buildConfigParams(host); try { resource.configure(host.getName(), params); } catch (ConfigurationException e) { s_logger.warn("Unable to configure resource due to " + e.getMessage()); return null; } if (!resource.start()) { s_logger.warn("Unable to start the resource"); return null; } } return resource; } private void updateNetworkLabels(HostVO host){ //check if networkLabels need to be updated in details //we send only private and storage network label to the resource. String privateNetworkLabel = _networkMgr.getDefaultManagementTrafficLabel(host.getDataCenterId(), host.getHypervisorType()); String storageNetworkLabel = _networkMgr.getDefaultStorageTrafficLabel(host.getDataCenterId(), host.getHypervisorType()); String privateDevice = host.getDetail("private.network.device"); String storageDevice = host.getDetail("storage.network.device1"); boolean update = false; if(privateNetworkLabel != null && !privateNetworkLabel.equalsIgnoreCase(privateDevice)){ host.setDetail("private.network.device", privateNetworkLabel); update = true; } if(storageNetworkLabel != null && !storageNetworkLabel.equalsIgnoreCase(storageDevice)){ host.setDetail("storage.network.device1", storageNetworkLabel); update = true; } if(update){ _hostDao.saveDetails(host); } } }