Whamcloud - gitweb
- the xml format used by lconf has changed considerably
authorrread <rread>
Wed, 7 Aug 2002 09:07:20 +0000 (09:07 +0000)
committerrread <rread>
Wed, 7 Aug 2002 09:07:20 +0000 (09:07 +0000)
  - 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
lustre/utils/lmc

index 5e51f7d..07f9de5 100755 (executable)
@@ -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
 #
index dcc5787..072012b 100755 (executable)
@@ -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 = """<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 = {}
@@ -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: