mirror of https://github.com/apache/cloudstack.git
bug 6027: use slaveconn for plugin merger from master 0366dd093c
status 6027: closed fixed
This commit is contained in:
parent
5536faba5d
commit
6ce5bc0c04
|
|
@ -144,6 +144,8 @@
|
|||
|
||||
<adapters key="com.cloud.resource.Discoverer">
|
||||
<adapter name="SecondaryStorage" class="com.cloud.storage.secondary.SecondaryStorageDiscoverer"/>
|
||||
<adapter name="XCP Agent" class="com.cloud.hypervisor.xen.discoverer.XcpServerDiscoverer"/>
|
||||
<adapter name="KVM Agent" class="com.cloud.hypervisor.kvm.discoverer.KvmServerDiscoverer"/>
|
||||
</adapters>
|
||||
|
||||
<manager name="Cluster Manager" class="com.cloud.cluster.DummyClusterManagerImpl">
|
||||
|
|
|
|||
|
|
@ -3097,9 +3097,25 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
|
||||
protected String callHostPlugin(String cmd, String... params) {
|
||||
Map<String, String> args = new HashMap<String, String>();
|
||||
Session slaveSession = null;
|
||||
Connection slaveConn = null;
|
||||
try {
|
||||
Connection conn = getConnection();
|
||||
Host host = Host.getByUuid(conn, _host.uuid);
|
||||
URL slaveUrl = null;
|
||||
try {
|
||||
slaveUrl = new URL("http://" + _host.ip);
|
||||
} catch (MalformedURLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
slaveConn = new Connection(slaveUrl, 10);
|
||||
slaveSession = Session.slaveLocalLoginWithPassword(slaveConn, _username, _password);
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Slave logon successful. session= " + slaveSession);
|
||||
}
|
||||
Host host = Host.getByUuid(slaveConn, _host.uuid);
|
||||
|
||||
|
||||
for (int i = 0; i < params.length; i += 2) {
|
||||
args.put(params[i], params[i + 1]);
|
||||
}
|
||||
|
|
@ -3108,7 +3124,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
|
||||
}
|
||||
|
||||
String result = host.callPlugin(conn, "vmops", cmd, args);
|
||||
String result = host.callPlugin(slaveConn, "vmops", cmd, args);
|
||||
if (s_logger.isTraceEnabled()) {
|
||||
s_logger.trace("callHostPlugin Result: " + result);
|
||||
}
|
||||
|
|
@ -3117,6 +3133,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString());
|
||||
} catch (XmlRpcException e) {
|
||||
s_logger.debug("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage());
|
||||
} finally {
|
||||
if( slaveSession != null) {
|
||||
try {
|
||||
slaveSession.localLogout(slaveConn);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -3489,6 +3512,10 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
s_logger.debug("Can't get xs-tools.iso: " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean can_bridge_firewall() {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean getHostInfo() throws IllegalArgumentException{
|
||||
Connection conn = getConnection();
|
||||
|
|
@ -3508,7 +3535,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
return false;
|
||||
}
|
||||
|
||||
_canBridgeFirewall = Boolean.valueOf(callHostPlugin("can_bridge_firewall", "host_uuid", _host.uuid));
|
||||
_canBridgeFirewall = can_bridge_firewall();
|
||||
|
||||
Nic privateNic = getLocalNetwork(conn, name);
|
||||
if (privateNic == null) {
|
||||
|
|
@ -3518,6 +3545,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
s_logger.warn("Unable to determine the private network for host " + _host.ip);
|
||||
return false;
|
||||
}
|
||||
_privateNetworkName = name;
|
||||
privateNic = getLocalNetwork(conn, name);
|
||||
if (privateNic == null) {
|
||||
s_logger.warn("Unable to get private network " + name);
|
||||
|
|
@ -3535,6 +3563,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
}
|
||||
} else {
|
||||
guestNic = privateNic;
|
||||
_guestNetworkName = _privateNetworkName;
|
||||
}
|
||||
name = guestNic.nr.nameLabel;
|
||||
|
||||
|
|
@ -3547,6 +3576,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
}
|
||||
} else {
|
||||
publicNic = guestNic;
|
||||
_publicNetworkName = _guestNetworkName;
|
||||
}
|
||||
name = publicNic.nr.nameLabel;
|
||||
|
||||
|
|
@ -3570,7 +3600,15 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
|
|||
_host.storageNetwork2 = storageNic2.nr.uuid;
|
||||
_host.storagePif2 = storageNic2.pr.uuid;
|
||||
}
|
||||
|
||||
_host.storageNetwork2 = storageNic2.nr.uuid;
|
||||
_host.storagePif2 = storageNic2.pr.uuid;
|
||||
|
||||
s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip);
|
||||
s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.ip);
|
||||
s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip);
|
||||
s_logger.info("Storage Network 1 is " + _storageNetworkName1 + " for host " + _host.ip);
|
||||
s_logger.info("Storage Network 2 is " + _storageNetworkName2 + " for host " + _host.ip);
|
||||
|
||||
return true;
|
||||
} catch (XenAPIException e) {
|
||||
s_logger.warn("Unable to get host information for " + _host.ip, e);
|
||||
|
|
|
|||
|
|
@ -7,14 +7,8 @@ import time
|
|||
import logging
|
||||
logging.basicConfig(filename='/tmp/xapilog',level=logging.DEBUG)
|
||||
|
||||
def get_xapi_session():
|
||||
xapi = XenAPI.xapi_local();
|
||||
xapi.login_with_password("","")
|
||||
return xapi._session
|
||||
|
||||
def get_stats(collect_host_stats, consolidation_function, interval, start_time):
|
||||
def get_stats(session, collect_host_stats, consolidation_function, interval, start_time):
|
||||
try:
|
||||
session = get_xapi_session()
|
||||
|
||||
if collect_host_stats == "true" :
|
||||
url = "http://localhost/rrd_updates?"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
import os, sys, time
|
||||
import XenAPIPlugin
|
||||
import XenAPI
|
||||
sys.path.append("/opt/xensource/sm/")
|
||||
import SR, VDI, SRCommand, util, lvutil
|
||||
from util import CommandException
|
||||
|
|
@ -38,13 +39,20 @@ def echo(fn):
|
|||
return res
|
||||
return wrapped
|
||||
|
||||
|
||||
def get_xapi_session():
|
||||
xapi = XenAPI.xapi_local();
|
||||
xapi.login_with_password("","")
|
||||
return xapi._session
|
||||
|
||||
@echo
|
||||
def gethostvmstats(session, args):
|
||||
collect_host_stats = args['collectHostStats']
|
||||
consolidation_function = args['consolidationFunction']
|
||||
interval = args['interval']
|
||||
start_time = args['startTime']
|
||||
result = hostvmstats.get_stats(collect_host_stats, consolidation_function, interval, start_time)
|
||||
session = get_xapi_session()
|
||||
result = hostvmstats.get_stats(session, collect_host_stats, consolidation_function, interval, start_time)
|
||||
return result
|
||||
|
||||
@echo
|
||||
|
|
@ -1478,7 +1486,9 @@ def heartbeat(session, args):
|
|||
txt='fail'
|
||||
return txt
|
||||
|
||||
def get_private_nic(session, args):
|
||||
def get_private_nic( args):
|
||||
session = get_xapi_session()
|
||||
vms = session.xenapi.VM.get_all()
|
||||
host_uuid = args.get('host_uuid')
|
||||
host = session.xenapi.host.get_by_uuid(host_uuid)
|
||||
piflist = session.xenapi.host.get_PIFs(host)
|
||||
|
|
@ -1505,7 +1515,7 @@ def can_bridge_firewall(session, args):
|
|||
util.pread2(['iptables', '-D', 'FORWARD', '-j', 'RH-Firewall-1-INPUT'])
|
||||
except:
|
||||
util.SMlog('Chain BRIDGE-FIREWALL already exists')
|
||||
privnic = get_private_nic(session, args)
|
||||
privnic = get_private_nic(args)
|
||||
result = 'true'
|
||||
try:
|
||||
util.pread2(['/bin/bash', '-c', 'iptables -n -L FORWARD | grep BRIDGE-FIREWALL'])
|
||||
|
|
@ -1520,8 +1530,8 @@ def can_bridge_firewall(session, args):
|
|||
if not os.path.exists('/var/run/cloud'):
|
||||
os.makedirs('/var/run/cloud')
|
||||
|
||||
cleanup_rules_for_dead_vms(session)
|
||||
cleanup_rules(session)
|
||||
cleanup_rules_for_dead_vms()
|
||||
cleanup_rules()
|
||||
|
||||
return result
|
||||
|
||||
|
|
@ -1899,6 +1909,8 @@ def get_rule_log_for_vm(session, vmName):
|
|||
def get_rule_logs_for_vms(session, args):
|
||||
host_uuid = args.pop('host_uuid')
|
||||
try:
|
||||
session = get_xapi_session()
|
||||
|
||||
thishost = session.xenapi.host.get_by_uuid(host_uuid)
|
||||
hostrec = session.xenapi.host.get_record(thishost)
|
||||
vms = hostrec.get('resident_VMs')
|
||||
|
|
@ -1921,7 +1933,9 @@ def get_rule_logs_for_vms(session, args):
|
|||
return ";".join(result)
|
||||
|
||||
@echo
|
||||
def cleanup_rules_for_dead_vms(session):
|
||||
def cleanup_rules_for_dead_vms():
|
||||
try:
|
||||
session = get_xapi_session()
|
||||
vms = session.xenapi.VM.get_all()
|
||||
cleaned = 0
|
||||
for vm_name in [session.xenapi.VM.get_name_label(x) for x in vms]:
|
||||
|
|
@ -1937,9 +1951,16 @@ def cleanup_rules_for_dead_vms(session):
|
|||
cleaned = cleaned+1
|
||||
|
||||
util.SMlog("Cleaned up rules for " + str(cleaned) + " vms")
|
||||
except:
|
||||
util.SMlog("Failed to cleanup rules for dead vms!")
|
||||
|
||||
|
||||
|
||||
@echo
|
||||
def cleanup_rules(session):
|
||||
def cleanup_rules():
|
||||
try:
|
||||
session = get_xapi_session()
|
||||
|
||||
chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2"
|
||||
chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n')
|
||||
cleaned = 0
|
||||
|
|
@ -1966,6 +1987,8 @@ def cleanup_rules(session):
|
|||
destroy_network_rules_for_vm(session, {'vmName':vmname})
|
||||
|
||||
util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains")
|
||||
except:
|
||||
util.SMlog("Failed to cleanup rules !")
|
||||
|
||||
@echo
|
||||
def check_rule_log_for_vm(vmName, vmID, vmIP, domID, signature, seqno):
|
||||
|
|
@ -2029,6 +2052,8 @@ def remove_rule_log_for_vm(vmName):
|
|||
|
||||
@echo
|
||||
def network_rules(session, args):
|
||||
try:
|
||||
session = get_xapi_session()
|
||||
vm_name = args.get('vmName')
|
||||
vmName = vm_name
|
||||
vm_ip = args.get('vmIP')
|
||||
|
|
@ -2125,6 +2150,8 @@ def network_rules(session, args):
|
|||
return 'false'
|
||||
|
||||
return 'true'
|
||||
except:
|
||||
util.SMlog("Failed to network rule !")
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -170,15 +170,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
if (_hostDao.findByGuid(record.uuid) != null) {
|
||||
s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database.");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (!checkServer(conn, dcId, podId, host, record)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CitrixResourceBase resource = createServerResource(dcId, podId, record);
|
||||
s_logger.info("Found host " + record.hostname + " ip=" + record.address + " product version=" + prodVersion);
|
||||
CitrixResourceBase resource = createServerResource(record);
|
||||
|
||||
Map<String, String> details = new HashMap<String, String>();
|
||||
Map<String, Object> params = new HashMap<String, Object>();
|
||||
|
|
@ -379,21 +374,18 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean checkServer(Connection conn, long dcId, Long podId, Host host, Host.Record record) {
|
||||
String prodBrand = record.softwareVersion.get("product_brand");
|
||||
|
||||
if(!prodBrand.equals("XenCloudPlatform")) {
|
||||
String msg = "Do not support product brand " + prodBrand;
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
|
||||
s_logger.debug(msg);
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected CitrixResourceBase createServerResource(Host.Record record) {
|
||||
return new XcpServerResource();
|
||||
protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) {
|
||||
String prodBrand = record.softwareVersion.get("product_brand").trim();
|
||||
String prodVersion = record.softwareVersion.get("product_version").trim();
|
||||
|
||||
if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1"))
|
||||
return new XcpServerResource();
|
||||
|
||||
String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion;
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
|
||||
s_logger.debug(msg);
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
|
||||
protected void serverConfig() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue