Skip to content

Commit 0366dd0

Browse files
author
Anthony Xu
committed
use slaveconnection instead of masterconnection for all host plugin calls.
tested by creating domr and user vm and migrating them 1. if you add host for kvm , you need specify kvm://ip_address, otherwiset there is no to differ kvm and xenserver hosts, edison cloud you please test this, may need some minor fixes. 2. if you want to session inside your plugin call, you can not use the one which is passed in, due to it is a slavesession, you need to call get_xapi_session() to get a new local session and use it. I have modified some of these, I may ignore some. Please let me know if you see XENAPI_PLUGIN_EXCEPTION.
1 parent 89cd313 commit 0366dd0

6 files changed

Lines changed: 89 additions & 41 deletions

File tree

client/tomcatconf/components.xml.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149

150150
<adapters key="com.cloud.resource.Discoverer">
151151
<adapter name="SecondaryStorage" class="com.cloud.storage.secondary.SecondaryStorageDiscoverer"/>
152+
<adapter name="XCP Agent" class="com.cloud.hypervisor.xen.discoverer.XcpServerDiscoverer"/>
152153
<adapter name="KVM Agent" class="com.cloud.hypervisor.kvm.discoverer.KvmServerDiscoverer"/>
153154
</adapters>
154155

core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,9 +3491,25 @@ protected boolean patchspecialvm(String vmname, String device, String vmtype) {
34913491

34923492
protected String callHostPlugin(String plugin, String cmd, String... params) {
34933493
Map<String, String> args = new HashMap<String, String>();
3494+
Session slaveSession = null;
3495+
Connection slaveConn = null;
34943496
try {
3495-
Connection conn = getConnection();
3496-
Host host = Host.getByUuid(conn, _host.uuid);
3497+
URL slaveUrl = null;
3498+
try {
3499+
slaveUrl = new URL("http://" + _host.ip);
3500+
} catch (MalformedURLException e) {
3501+
// TODO Auto-generated catch block
3502+
e.printStackTrace();
3503+
}
3504+
slaveConn = new Connection(slaveUrl, 10);
3505+
slaveSession = Session.slaveLocalLoginWithPassword(slaveConn, _username, _password);
3506+
3507+
if (s_logger.isDebugEnabled()) {
3508+
s_logger.debug("Slave logon successful. session= " + slaveSession);
3509+
}
3510+
Host host = Host.getByUuid(slaveConn, _host.uuid);
3511+
3512+
34973513
for (int i = 0; i < params.length; i += 2) {
34983514
args.put(params[i], params[i + 1]);
34993515
}
@@ -3502,7 +3518,7 @@ protected String callHostPlugin(String plugin, String cmd, String... params) {
35023518
s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args));
35033519
}
35043520

3505-
String result = host.callPlugin(conn, plugin, cmd, args);
3521+
String result = host.callPlugin(slaveConn, plugin, cmd, args);
35063522
if (s_logger.isTraceEnabled()) {
35073523
s_logger.trace("callHostPlugin Result: " + result);
35083524
}
@@ -3511,6 +3527,13 @@ protected String callHostPlugin(String plugin, String cmd, String... params) {
35113527
s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString());
35123528
} catch (XmlRpcException e) {
35133529
s_logger.debug("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage());
3530+
} finally {
3531+
if( slaveSession != null) {
3532+
try {
3533+
slaveSession.localLogout(slaveConn);
3534+
} catch (Exception e) {
3535+
}
3536+
}
35143537
}
35153538
return null;
35163539
}
@@ -3979,6 +4002,10 @@ protected void getPVISO(StartupStorageCommand sscmd) {
39794002
s_logger.debug("Can't get xs-tools.iso: " + e.toString());
39804003
}
39814004
}
4005+
4006+
protected boolean can_bridge_firewall() {
4007+
return false;
4008+
}
39824009

39834010
protected boolean getHostInfo() throws IllegalArgumentException{
39844011
Connection conn = getConnection();
@@ -3998,7 +4025,7 @@ protected boolean getHostInfo() throws IllegalArgumentException{
39984025
return false;
39994026
}
40004027

4001-
_canBridgeFirewall = Boolean.valueOf(callHostPlugin("vmops", "can_bridge_firewall", "host_uuid", _host.uuid));
4028+
_canBridgeFirewall = can_bridge_firewall();
40024029

40034030
Nic privateNic = getLocalNetwork(conn, name);
40044031
if (privateNic == null) {
@@ -4008,6 +4035,7 @@ protected boolean getHostInfo() throws IllegalArgumentException{
40084035
s_logger.warn("Unable to determine the private network for host " + _host.ip);
40094036
return false;
40104037
}
4038+
_privateNetworkName = name;
40114039
privateNic = getLocalNetwork(conn, name);
40124040
if (privateNic == null) {
40134041
s_logger.warn("Unable to get private network " + name);
@@ -4026,6 +4054,7 @@ protected boolean getHostInfo() throws IllegalArgumentException{
40264054
}
40274055
} else {
40284056
guestNic = privateNic;
4057+
_guestNetworkName = _privateNetworkName;
40294058
}
40304059
_host.guestNetwork = guestNic.nr.uuid;
40314060
_host.guestPif = guestNic.pr.uuid;
@@ -4039,6 +4068,7 @@ protected boolean getHostInfo() throws IllegalArgumentException{
40394068
}
40404069
} else {
40414070
publicNic = guestNic;
4071+
_publicNetworkName = _guestNetworkName;
40424072
}
40434073
_host.publicPif = publicNic.pr.uuid;
40444074
_host.publicNetwork = publicNic.nr.uuid;
@@ -4061,6 +4091,7 @@ protected boolean getHostInfo() throws IllegalArgumentException{
40614091
_host.storagePif2 = storageNic2.pr.uuid;
40624092

40634093
s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip);
4094+
s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.ip);
40644095
s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip);
40654096
s_logger.info("Storage Network 1 is " + _storageNetworkName1 + " for host " + _host.ip);
40664097
s_logger.info("Storage Network 2 is " + _storageNetworkName2 + " for host " + _host.ip);

scripts/vm/hypervisor/xenserver/hostvmstats.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,8 @@
77
import logging
88
logging.basicConfig(filename='/tmp/xapilog',level=logging.DEBUG)
99

10-
def get_xapi_session():
11-
xapi = XenAPI.xapi_local();
12-
xapi.login_with_password("","")
13-
return xapi._session
14-
15-
def get_stats(collect_host_stats, consolidation_function, interval, start_time):
10+
def get_stats(session, collect_host_stats, consolidation_function, interval, start_time):
1611
try:
17-
session = get_xapi_session()
1812

1913
if collect_host_stats == "true" :
2014
url = "http://localhost/rrd_updates?"

scripts/vm/hypervisor/xenserver/vmops

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import os, sys, time
66
import XenAPIPlugin
7+
import XenAPI
78
sys.path.append("/opt/xensource/sm/")
89
import SR, VDI, SRCommand, util, lvutil
910
from util import CommandException
@@ -35,13 +36,20 @@ def echo(fn):
3536
return res
3637
return wrapped
3738

39+
40+
def get_xapi_session():
41+
xapi = XenAPI.xapi_local();
42+
xapi.login_with_password("","")
43+
return xapi._session
44+
3845
@echo
3946
def gethostvmstats(session, args):
4047
collect_host_stats = args['collectHostStats']
4148
consolidation_function = args['consolidationFunction']
4249
interval = args['interval']
4350
start_time = args['startTime']
44-
result = hostvmstats.get_stats(collect_host_stats, consolidation_function, interval, start_time)
51+
session = get_xapi_session()
52+
result = hostvmstats.get_stats(session, collect_host_stats, consolidation_function, interval, start_time)
4553
return result
4654

4755
@echo
@@ -454,7 +462,9 @@ def heartbeat(session, args):
454462
txt='fail'
455463
return txt
456464

457-
def get_private_nic(session, args):
465+
def get_private_nic( args):
466+
session = get_xapi_session()
467+
vms = session.xenapi.VM.get_all()
458468
host_uuid = args.get('host_uuid')
459469
host = session.xenapi.host.get_by_uuid(host_uuid)
460470
piflist = session.xenapi.host.get_PIFs(host)
@@ -481,7 +491,7 @@ def can_bridge_firewall(session, args):
481491
util.pread2(['iptables', '-D', 'FORWARD', '-j', 'RH-Firewall-1-INPUT'])
482492
except:
483493
util.SMlog('Chain BRIDGE-FIREWALL already exists')
484-
privnic = get_private_nic(session, args)
494+
privnic = get_private_nic(args)
485495
result = 'true'
486496
try:
487497
util.pread2(['/bin/bash', '-c', 'iptables -n -L FORWARD | grep BRIDGE-FIREWALL'])
@@ -496,8 +506,8 @@ def can_bridge_firewall(session, args):
496506
if not os.path.exists('/var/run/cloud'):
497507
os.makedirs('/var/run/cloud')
498508

499-
cleanup_rules_for_dead_vms(session)
500-
cleanup_rules(session)
509+
cleanup_rules_for_dead_vms()
510+
cleanup_rules()
501511

502512
return result
503513

@@ -875,6 +885,8 @@ def get_rule_log_for_vm(session, vmName):
875885
def get_rule_logs_for_vms(session, args):
876886
host_uuid = args.pop('host_uuid')
877887
try:
888+
session = get_xapi_session()
889+
878890
thishost = session.xenapi.host.get_by_uuid(host_uuid)
879891
hostrec = session.xenapi.host.get_record(thishost)
880892
vms = hostrec.get('resident_VMs')
@@ -897,7 +909,9 @@ def get_rule_logs_for_vms(session, args):
897909
return ";".join(result)
898910

899911
@echo
900-
def cleanup_rules_for_dead_vms(session):
912+
def cleanup_rules_for_dead_vms():
913+
try:
914+
session = get_xapi_session()
901915
vms = session.xenapi.VM.get_all()
902916
cleaned = 0
903917
for vm_name in [session.xenapi.VM.get_name_label(x) for x in vms]:
@@ -913,9 +927,16 @@ def cleanup_rules_for_dead_vms(session):
913927
cleaned = cleaned+1
914928

915929
util.SMlog("Cleaned up rules for " + str(cleaned) + " vms")
930+
except:
931+
util.SMlog("Failed to cleanup rules for dead vms!")
932+
933+
916934

917935
@echo
918-
def cleanup_rules(session):
936+
def cleanup_rules():
937+
try:
938+
session = get_xapi_session()
939+
919940
chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2"
920941
chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n')
921942
cleaned = 0
@@ -942,6 +963,8 @@ def cleanup_rules(session):
942963
destroy_network_rules_for_vm(session, {'vmName':vmname})
943964

944965
util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains")
966+
except:
967+
util.SMlog("Failed to cleanup rules !")
945968

946969
@echo
947970
def check_rule_log_for_vm(vmName, vmID, vmIP, domID, signature, seqno):
@@ -1005,6 +1028,8 @@ def remove_rule_log_for_vm(vmName):
10051028

10061029
@echo
10071030
def network_rules(session, args):
1031+
try:
1032+
session = get_xapi_session()
10081033
vm_name = args.get('vmName')
10091034
vmName = vm_name
10101035
vm_ip = args.get('vmIP')
@@ -1101,6 +1126,8 @@ def network_rules(session, args):
11011126
return 'false'
11021127

11031128
return 'true'
1129+
except:
1130+
util.SMlog("Failed to network rule !")
11041131

11051132

11061133

server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ public Map<? extends ServerResource, Map<String, String>> find(long dcId,
9999
String password) throws DiscoveryException {
100100
Map<KvmDummyResourceBase, Map<String, String>> resources = new HashMap<KvmDummyResourceBase, Map<String, String>>();
101101
Map<String, String> details = new HashMap<String, String>();
102-
if (!uri.getScheme().equals("http")) {
103-
String msg = "urlString is not http so we're not taking care of the discovery for this: " + uri;
102+
if (!uri.getScheme().equals("kvm")) {
103+
String msg = "urlString is not kvm so we're not taking care of the discovery for this: " + uri;
104104
s_logger.debug(msg);
105105
return null;
106106
}

server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.cloud.hypervisor.xen.resource.CitrixResourceBase;
5454
import com.cloud.hypervisor.xen.resource.XcpServerResource;
5555
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
56+
import com.cloud.hypervisor.xen.resource.XenServerResource;
5657
import com.cloud.resource.Discoverer;
5758
import com.cloud.resource.DiscovererBase;
5859
import com.cloud.resource.ServerResource;
@@ -170,15 +171,10 @@ public Map<? extends ServerResource, Map<String, String>> find(long dcId, Long p
170171
if (_hostDao.findByGuid(record.uuid) != null) {
171172
s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database.");
172173
continue;
173-
}
174-
175-
176-
if (!checkServer(conn, dcId, podId, host, record)) {
177-
continue;
178-
}
179-
174+
}
175+
176+
CitrixResourceBase resource = createServerResource(dcId, podId, record);
180177
s_logger.info("Found host " + record.hostname + " ip=" + record.address + " product version=" + prodVersion);
181-
CitrixResourceBase resource = createServerResource(record);
182178

183179
Map<String, String> details = new HashMap<String, String>();
184180
Map<String, Object> params = new HashMap<String, Object>();
@@ -379,22 +375,21 @@ protected boolean addHostsToPool(URI url, Connection conn, long dcId, Long podId
379375

380376
return true;
381377
}
382-
383-
protected boolean checkServer(Connection conn, long dcId, Long podId, Host host, Host.Record record) {
378+
379+
protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) {
384380
String prodBrand = record.softwareVersion.get("product_brand").trim();
385381
String prodVersion = record.softwareVersion.get("product_version").trim();
386382

387-
if(!prodBrand.equals("XenCloudPlatform") || !prodVersion.equals("0.1.1")) {
388-
String msg = "Only support XCP 0.1.1, but this one is " + prodBrand + " " + prodVersion;
389-
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
390-
s_logger.debug(msg);
391-
throw new RuntimeException(msg);
392-
}
393-
return true;
394-
}
395-
396-
protected CitrixResourceBase createServerResource(Host.Record record) {
397-
return new XcpServerResource();
383+
if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1"))
384+
return new XcpServerResource();
385+
386+
if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
387+
return new XenServerResource();
388+
389+
String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion;
390+
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
391+
s_logger.debug(msg);
392+
throw new RuntimeException(msg);
398393
}
399394

400395
protected void serverConfig() {

0 commit comments

Comments
 (0)