def __init__(self, fs, server, index, dev, jdev=None, group=None, tag=None, enabled=True, mode='managed', network=None, active='yes'): """ Initialize a Lustre target object. """ Disk.__init__(self, dev) self._states = {} Component.__init__(self, fs, server, enabled, mode, active) self.defaultserver = server # Default server the target runs on self.failservers = ServerGroup() # All failover servers assert index is not None self.index = int(index) self.group = group self.tag = tag self.network = network self.mntdev = self.dev self.recov_info = None if jdev: self.journal = Journal(self, jdev) else: self.journal = None # If target mode is external then set target state accordingly if self.is_external(): self.state = EXTERNAL # If target is inactive, then set target state accordingly if not self.is_active(): self.state = INACTIVE
def test_start_failover(self): """start on a failover node""" srv2 = Server('fakenode', ['127.0.0.2@tcp']) mgt = self.fs.new_target(self.srv1, 'mgt', 0, self.disk1.name) mdt = self.fs.new_target(self.srv1, 'mdt', 0, self.disk2.name) mdt.add_server(srv2) self.assertEqual(self.fs.format(), set([OFFLINE])) # For a simpler test environment, simulate local node is the failover # node. # This could be improved when --servicenode will be supported. Format # will be possible directly in failover configuration (no need to # reconfig anymore). mdt.state = None mdt.defaultserver = srv2 mdt.failservers = ServerGroup() mdt.add_server(self.srv1) # Fail over this local node (-F HOSTNAME -n HOSTNAME) mdt.failover(self.srv1.hostname) srv2.action_enabled = False # Start should succeed and detect migration self.assertEqual(self.fs.start(), set([MIGRATED])) self.assertEqual(mgt.state, MOUNTED) self.assertEqual(mdt.state, MIGRATED)
def testSelect(self): """test ServerGroup.select()""" srv1 = Server('foo1', ['foo1@tcp']) srv2 = Server('foo2', ['foo2@tcp']) srv3 = Server('foo3', ['foo3@tcp']) grp = ServerGroup([srv1, srv2, srv3]) subgrp = grp.select(NodeSet("foo[1,3]")) self.assertEqual(list(iter(subgrp)), [srv1, srv3])
def testSimple(self): """test ServerGroup simple tests""" grp = ServerGroup() self.assertEqual(len(grp), 0) srv = Server('foo', ['foo@tcp']) grp.append(srv) self.assertEqual(len(grp), 1) self.assertEqual(grp[0], srv)
def testDistant(self): """test ServerGroup.nodeset()""" fqdn = socket.getfqdn() shortname = socket.gethostname().split('.', 1)[0] srv1 = Server(shortname, ['%s@tcp' % shortname]) srv2 = Server('foo', ['foo@tcp']) grp = ServerGroup([srv1, srv2]) subgrp = grp.distant() self.assertEqual(list(iter(subgrp)), [srv2])
def allservers(self): """ Return all servers this target can run on. The default server is the first element, then all possible failover servers. """ #XXX: This method could be possibly dropped if the code in Status # command is optimized. grp = ServerGroup([self.defaultserver]) for srv in self.failservers: grp.append(srv) return grp
def testNodeSet(self): """test ServerGroup.nodeset()""" srv1 = Server('foo1', ['foo1@tcp']) srv2 = Server('foo2', ['foo2@tcp']) grp = ServerGroup([srv1, srv2]) self.assertEqual(grp.nodeset(), NodeSet('foo[1-2]'))
def testIter(self): """test ServerGroup.__iter__()""" srv1 = Server('foo1', ['foo1@tcp']) srv2 = Server('foo2', ['foo2@tcp']) grp = ServerGroup([srv1, srv2]) self.assertEqual(list(iter(grp)), [srv1, srv2])
def allservers(self): """ Return all servers this target can run on. On standard component there is only one server. """ return ServerGroup([self.server])