From 86a9f16819060c9af14ffc1fc52ca567390dbab3 Mon Sep 17 00:00:00 2001 From: rread Date: Wed, 7 Aug 2002 09:07:20 +0000 Subject: [PATCH] - the xml format used by lconf has changed considerably - profile is embeded in node - list of osc's on client come from lov - other changes - lmc generates proper configs, except mdc_ref missing on servers. - at the top of lmc is a comment with a sample use of lmc --- lustre/utils/lconf | 115 ++++++++++++++++++++++++++++++----------------------- lustre/utils/lmc | 77 +++++++++++++++++++++++------------ 2 files changed, 116 insertions(+), 76 deletions(-) diff --git a/lustre/utils/lconf b/lustre/utils/lconf index 5e51f7d..07f9de5 100755 --- a/lustre/utils/lconf +++ b/lustre/utils/lconf @@ -29,6 +29,7 @@ import sys, getopt 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' @@ -406,10 +407,10 @@ class LOV(Module): 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 @@ -418,13 +419,20 @@ class LOV(Module): 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)) @@ -450,26 +458,24 @@ class MDC(Module): 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 @@ -510,23 +516,23 @@ class OSC(Module): 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 @@ -575,16 +581,36 @@ def getText(node, tag, default=""): 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): @@ -652,7 +678,7 @@ def getByName(lustreNode, tag, name): # ============================================================ # 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... @@ -678,10 +704,10 @@ def startService(node, start=1): 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 @@ -691,22 +717,14 @@ def startService(node, start=1): # * 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 @@ -721,12 +739,9 @@ def doHost(lustreNode, hosts, cleanFlag): 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 # diff --git a/lustre/utils/lmc b/lustre/utils/lmc index dcc5787..072012b 100755 --- a/lustre/utils/lmc +++ b/lustre/utils/lmc @@ -28,9 +28,10 @@ lmc - lustre configurtion data manager ./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 @@ -105,9 +106,12 @@ def new_name(base): 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 = """ """ + # adding ldlm here is a bit of a hack, but one is enough. + str = """ """ % (ldlm_name, ldlm_uuid) return dom.parseString(str) names = {} @@ -165,8 +169,14 @@ class GenConfig: 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') @@ -189,8 +199,9 @@ class GenConfig: 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) @@ -215,7 +226,7 @@ class GenConfig: 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) @@ -247,12 +258,11 @@ def lov_add_osc(gen, lov, osc_uuid): 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. @@ -298,6 +308,10 @@ def add_ost(gen, lustre, options, args): 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) @@ -325,15 +339,21 @@ def add_net(gen, lustre, options, args): 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: @@ -345,27 +365,31 @@ def add_node(gen, lustre, options, args): 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): @@ -393,7 +417,6 @@ 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") @@ -406,7 +429,9 @@ def add_mtpt(gen, lustre, options, args): 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) @@ -433,7 +458,7 @@ def add_mds(gen, lustre, options, args): 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: -- 1.8.3.1