blob: d30b8cc10f0ac3c56f2de33a44af3d11b6f78eb7 [file] [log] [blame]
// 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.resource;
import com.cloud.configuration.Config;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.network.NetworkModel;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.net.UrlUtil;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.log4j.Logger;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public abstract class DiscovererBase extends AdapterBase implements Discoverer {
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 NetworkModel _networkMgr;
@Inject
protected HostDao _hostDao;
@Inject
protected ResourceManager _resourceMgr;
@Inject
protected DataCenterDao _dcDao;
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_params = _configDao.getConfiguration(params);
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 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("Unable 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()));
params.put(Config.XenServerMaxNics.toString().toLowerCase(), _configDao.getValue(Config.XenServerMaxNics.toString()));
params.put(Config.XenServerHeartBeatInterval.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatInterval.toString()));
params.put(Config.XenServerHeartBeatTimeout.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatTimeout.toString()));
params.put("router.aggregation.command.each.timeout", _configDao.getValue(Config.RouterAggregationCommandEachTimeout.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);
}
}
}