import string, os, stat, popen2, socket
import re, exceptions
import xml.dom.minidom
+from xml.xpath import Evaluate
# Global parameters
TCP_ACCEPTOR = '../..//portals/linux/utils/acceptor'
self.pattern = int(devs.getAttribute('pattern'))
mdcref = node.getElementsByTagName('mdc_ref')[0]
self.mdcuuid = mdcref.getAttribute('uuidref')
- mdc= lookup(node.parentNode, mdcuuid)
+ mdc= lookup(node.parentNode, self.mdcuuid)
mdsref = mdc.getElementsByTagName('mds_ref')[0]
self.mdsuuid = mdsref.getAttribute('uuidref')
- mds= lookup(node.parentNode, mdsuuid)
+ mds= lookup(node.parentNode, self.mdsuuid)
self.mdsname = getName(mds)
devlist = ""
stripe_cnt = 0
devlist = devlist + child.getAttribute('uuidref') + " "
strip_cnt = stripe_cnt + 1
self.devlist = devlist
+ self.stripe_cnt = strip_cnt
def prepare(self):
- self.info(self.mdcuuid)
- self.stripe_cnt, self.strip_sz, self.stripe_off, self.pattern,
- self.devlist, self.mdsname
+ for osc_uuid in string.split(self.devlist):
+ osc = lookup(self.dom_node.parentNode, osc_uuid)
+ if osc:
+ n = OSC(osc)
+ n.prepare()
+ else:
+ panic('osc not found:', osc_uuid)
+ self.info(self.mdcuuid, self.stripe_cnt, self.stripe_sz, self.stripe_off, self.pattern,
+ self.devlist, self.mdsname)
lctl.lovconfig(self.uuid, self.mdsname, self.stripe_cnt,
- self.strip_sz, self.stripe_off, self.pattern,
+ self.stripe_sz, self.stripe_off, self.pattern,
self.devlist)
lctl.newdev(attach="lov %s %s" % (self.name, self.uuid),
setup ="%s" % (self.mdcuuid))
Module.__init__(self, 'MDC', node)
ref = node.getElementsByTagName('mds_ref')[0]
self.mds_uuid = ref.getAttribute('uuidref')
- ref = node.getElementsByTagName('network_ref')[0]
- self.net_uuid = ref.getAttribute('uuidref')
def prepare(self):
- self.info(self.mds_uuid, self.net_uuid)
+ self.info(self.mds_uuid)
mds = lookup(self.dom_node.parentNode, self.mds_uuid)
if mds == None:
panic(self.mdsuuid, "not found.")
- net = lookup(self.dom_node.parentNode, self.net_uuid)
+ net = get_ost_net(self.dom_node.parentNode, self.mds_uuid)
srv = Network(net)
- lctl.connect(srv.net_type, srv.nid, srv.port, self.net_uuid, srv.send_buf, srv.read_buf)
+ lctl.connect(srv.net_type, srv.nid, srv.port, srv.uuid, srv.send_buf, srv.read_buf)
lctl.newdev(attach="mdc %s %s" % (self.name, self.uuid),
- setup ="%s %s" %(self.mds_uuid, self.net_uuid))
+ setup ="%s %s" %(self.mds_uuid, srv.uuid))
def cleanup(self):
- self.info(self.mds_uuid, self.net_uuid)
- net = lookup(self.dom_node.parentNode, self.net_uuid)
+ self.info(self.mds_uuid)
+ net = get_ost_net(self.dom_node.parentNode, self.mds_uuid)
srv = Network(net)
try:
- lctl.disconnect(srv.net_type, srv.nid, srv.port, self.net_uuid)
+ lctl.disconnect(srv.net_type, srv.nid, srv.port, srv.uuid)
lctl.cleanup(self.name, self.uuid)
except CommandError:
print "cleanup failed: ", self.name
Module.__init__(self, 'OSC', node)
ref = node.getElementsByTagName('obd_ref')[0]
self.obd_uuid = ref.getAttribute('uuidref')
- ref = node.getElementsByTagName('network_ref')[0]
+ ref = node.getElementsByTagName('ost_ref')[0]
self.ost_uuid = ref.getAttribute('uuidref')
def prepare(self):
self.info(self.obd_uuid, self.ost_uuid)
- net = lookup(self.dom_node.parentNode, self.ost_uuid)
+ net = get_ost_net(self.dom_node.parentNode, self.ost_uuid)
srv = Network(net)
- lctl.connect(srv.net_type, srv.nid, srv.port, self.ost_uuid, srv.send_buf, srv.read_buf)
+ lctl.connect(srv.net_type, srv.nid, srv.port, srv.uuid, srv.send_buf, srv.read_buf)
lctl.newdev(attach="osc %s %s" % (self.name, self.uuid),
setup ="%s %s" %(self.obd_uuid, self.ost_uuid))
def cleanup(self):
self.info(self.obd_uuid, self.ost_uuid)
- net = lookup(self.dom_node.parentNode, self.ost_uuid)
+ net_uuid = get_ost_net(self.dom_node.parentNode, self.ost_uuid)
srv = Network(net)
try:
- lctl.disconnect(srv.net_type, srv.nid, srv.port, self.ost_uuid)
+ lctl.disconnect(srv.net_type, srv.nid, srv.port, srv.uuid)
lctl.cleanup(self.name, self.uuid)
except CommandError:
print "cleanup failed: ", self.name
else:
return default
+def get_ost_net(node, uuid):
+ path = '//*[@uuid="%s"]/network_ref' % (uuid)
+ ret = Evaluate(path, node)
+ if ret:
+ uuid = ret[0].getAttribute('uuidref')
+ else:
+ return None
+ net = lookup(node, uuid)
+ return net
+
+
# Recusively search from node for a uuid
def lookup(node, uuid):
- for n in node.childNodes:
- if n.nodeType == n.ELEMENT_NODE:
- if getUUID(n) == uuid:
- return n
- else:
- n = lookup(n, uuid)
- if n: return n
- return None
+ path = '//*[@uuid="%s"]' % (uuid)
+ ret = Evaluate(path, node)
+ if ret:
+ return ret[0]
+ else:
+ return None
+
+# would like to do performance test on these two lookups
+#def lookup(node, uuid):
+# for n in node.childNodes:
+# if n.nodeType == n.ELEMENT_NODE:
+# if getUUID(n) == uuid:
+# return n
+# else:
+# n = lookup(n, uuid)
+# if n: return n
+# return None
# Get name attribute of node
def getName(node):
# ============================================================
# lconf level logic
# Start a service.
-def startService(node, start=1):
+def startService(node, cleanFlag):
type = getServiceType(node)
debug('Starting service:', type, getName(node), getUUID(node))
# there must be a more dynamic way of doing this...
else:
panic ("unknown service type:", type)
- if start:
- n.prepare()
- else:
+ if cleanFlag:
n.cleanup()
+ else:
+ n.prepare()
#
# Prepare the system to run lustre using a particular profile
# * make sure partitions are in place and prepared
# * initialize devices with lctl
# Levels is important, and needs to be enforced.
-def startProfile(lustreNode, profileNode):
+def startProfile(lustreNode, profileNode, cleanFlag):
if not profileNode:
panic("profile:", profile, "not found.")
services = getServices(lustreNode, profileNode)
+ if cleanFlag:
+ services.reverse()
for s in services:
- startService(s[1])
-
-
-# Shutdown services in reverse order than they were started
-def cleanupProfile(lustreNode, profileNode):
- if not profileNode:
- panic("profile:", profile, "not found.")
- services = getServices(lustreNode, profileNode)
- services.reverse()
- for s in services:
- startService(s[1], 0)
+ startService(s[1], cleanFlag)
#
# Load profile for
print 'No host entry found.'
return
- reflist = node.getElementsByTagName('profile_ref')
- for r in reflist:
- if cleanFlag:
- cleanupProfile(lustreNode, lookup(lustreNode, getRef(r)))
- else:
- startProfile(lustreNode, lookup(lustreNode, getRef(r)))
+ reflist = node.getElementsByTagName('profile')
+ for profile in reflist:
+ startProfile(lustreNode, profile, cleanFlag)
# Command line processing
#
./lmc --merge config.xml --node client --net client1 tcp
# configure server
-./lmc --merge config.xml --node server --mds /tmp/mds1
-./lmc --merge config.xml --lov lov1 111 222 333
-./lmc --merge config.xml --node server --lov lov1 --ost /dev/name [size=9999]
+./lmc --merge config.xml --node server --mds /tmp/mds1 50000
+./lmc --merge config.xml --lov lov1 MDC_server 111 222 333
+./lmc --merge config.xml --node server --lov lov1 --ost /tmp/ost1 100000
+./lmc --merge config.xml --node server --lov lov1 --ost /tmp/ost2 100000
# create client config
./lmc --merge config.xml --node client --mtpt /mnt/lustre MDC_server lov1
def get_uuid(name):
return "%s_UUID" % (name)
+ldlm_name = 'ldlm'
+ldlm_uuid = 'ldlm_UUID'
def new_lustre(dom):
"""Create a new empty lustre document"""
- str = """<lustre> </lustre>"""
+ # adding ldlm here is a bit of a hack, but one is enough.
+ str = """<lustre> <ldlm name="%s" uuid="%s"/> </lustre>""" % (ldlm_name, ldlm_uuid)
return dom.parseString(str)
names = {}
def node(self, name, uuid):
""" create a host """
node = self.newService("node", name, uuid)
+ self.addElement(node, 'profile')
return node
+ def ldlm(self, name, uuid):
+ """ create a ldlm """
+ ldlm = self.newService("ldlm", name, uuid)
+ return ldlm
+
def obd(self, name, uuid, fs, devname, format, dev_size=0):
obd = self.newService("obd", name, uuid)
obd.setAttribute('type', 'obdfilter')
ost.appendChild(self.ref("obd", obd_uuid))
return ost
- def lov(self, name, uuid, stripe_sz, stripe_off, pattern):
+ def lov(self, name, uuid, mdc_uuid, stripe_sz, stripe_off, pattern):
lov = self.newService("lov", name, uuid)
+ lov.appendChild(self.ref("mdc", mdc_uuid))
devs = self.addElement(lov, "devices" )
devs.setAttribute("stripesize", stripe_sz)
devs.setAttribute("stripeoffset", stripe_off)
return mdc
def mountpoint(self, name, uuid, mdc_uuid, osc_uuid, path):
- mtpt = self.newService("mtpt", name, uuid)
+ mtpt = self.newService("mountpoint", name, uuid)
mtpt.appendChild(self.ref("mdc", mdc_uuid))
mtpt.appendChild(self.ref("osc", osc_uuid))
self.addElement(mtpt, "path", path)
else:
error("No devices element found for LOV:", lov)
-def node_add_mnt(gen, node, mnt_uuid):
- node.appendChild(gen.ref("mountpoint", mnt_uuid))
-
-def node_add_mds(gen, node, mds_uuid):
- node.appendChild(gen.ref("mds", mds_uuid))
-
+def node_add_profile(gen, node, ref, uuid):
+ ret = Evaluate("./profile", node)
+ if not ret:
+ error('node has no profile:', node)
+ ret[0].appendChild(gen.ref(ref, uuid))
#
# Create a new obd, osc, and ost. Add them to the DOM.
error("LOV:", lovname, "not found.")
lov_add_osc(gen, lov, osc_uuid)
+ node = findByName(lustre, node_name, "node")
+ node_add_profile(gen, node, 'obd', obd_uuid)
+ node_add_profile(gen, node, 'ost', ost_uuid)
+
lustre.appendChild(obd)
lustre.appendChild(osc)
lustre.appendChild(ost)
ret = findByName(lustre, node_name, "node")
if not ret:
- uuid = get_uuid(node_name)
- node = gen.node(node_name, uuid)
+ node = do_add_node(gen, lustre, node_name)
else:
node = ret
net_name = new_name('NET_'+ node_name +'_'+ net_type)
net_uuid = get_uuid(net_name)
node.appendChild(gen.network(net_name, net_uuid, nid, net_type, port))
- lustre.appendChild(node)
+ node_add_profile(gen, node, "network", net_uuid)
+def do_add_node(gen, lustre, node_name):
+ uuid = get_uuid(node_name)
+ node = gen.node(node_name, uuid)
+ node_add_profile(gen, node, 'ldlm', ldlm_uuid)
+ lustre.appendChild(node)
+ return node
+
def add_node(gen, lustre, options, args):
""" create a node with a network config """
if len(args) > 1:
if ret:
print "Node:", node_name, "exists."
return
- uuid = get_uuid(node_name)
- node = gen.node(node_name, uuid)
- lustre.appendChild(node)
+ do_add_node(gen, lustre, node_name)
def add_lov(gen, lustre, options, args):
""" create a lov """
- if len(args) < 3:
+ if len(args) < 4:
usage()
name = options['lov']
- stripe_sz = args[0]
- stripe_off = args[1]
- pattern = args[2]
+ mdc_name = args[0]
+ stripe_sz = args[1]
+ stripe_off = args[2]
+ pattern = args[3]
ret = findByName(lustre, name, "lov")
if ret:
error("LOV: ", name, " already exists.")
+ ret = findByName(lustre, mdc_name, "mdc")
+ if not ret:
+ error(mdc_name, "not found.")
+ mdc_uuid = ret.getAttribute("uuid")
+
uuid = get_uuid(name)
- lov = gen.lov(name,uuid,stripe_sz, stripe_off, pattern)
+ lov = gen.lov(name, uuid, mdc_uuid, stripe_sz, stripe_off, pattern)
lustre.appendChild(lov)
def add_mtpt(gen, lustre, options, args):
ret = findByName(lustre, lov_name, "osc")
if not ret:
error(lov_name, "not found.")
-
lov_uuid = ret.getAttribute("uuid")
ret = findByName(lustre, mdc_name, "mdc")
node = findByName(lustre, node_name, "node")
if not node:
error('node:', node_name, "not found.")
- node_add_mnt(gen, node, uuid)
+ node_add_profile(gen, node, "mountpoint", uuid)
+ node_add_profile(gen, node, "mdc", mdc_uuid)
+ node_add_profile(gen, node, "lov", lov_uuid)
lustre.appendChild(mtpt)
node = findByName(lustre, node_name, "node")
if not node:
error('node:', node_name, 'not found')
- node_add_mds(gen, node, mds_uuid)
+ node_add_profile(gen, node, "mds", mds_uuid)
net_uuid = get_net_uuid(lustre, node_name)
if not net_uuid: