Revision e587b46a

b/lib/utils.py
1498 1498
  return result
1499 1499

  
1500 1500

  
1501
def ReadOneLineFile(file_name, strict=False):
1502
  """Return the first non-empty line from a file.
1503

  
1504
  @type strict: boolean
1505
  @param strict: if True, abort if the file has more than one
1506
      non-empty line
1507

  
1508
  """
1509
  file_lines = ReadFile(file_name).splitlines()
1510
  full_lines = filter(bool, file_lines)
1511
  if not file_lines or not full_lines:
1512
    raise errors.GenericError("No data in one-liner file %s" % file_name)
1513
  elif strict and len(full_lines) > 1:
1514
    raise errors.GenericError("Too many lines in one-liner file %s" %
1515
                              file_name)
1516
  return full_lines[0]
1517

  
1518

  
1501 1519
def FirstFree(seq, base=0):
1502 1520
  """Returns the first non-existing integer from seq.
1503 1521

  
b/test/ganeti.utils_unittest.py
52 52
     ShellQuote, ShellQuoteArgs, TcpPing, ListVisibleFiles, \
53 53
     SetEtcHostsEntry, RemoveEtcHostsEntry, FirstFree, OwnIpAddress, \
54 54
     TailFile, ForceDictType, SafeEncode, IsNormAbsPath, FormatTime, \
55
     UnescapeAndSplit, RunParts, PathJoin, HostInfo
55
     UnescapeAndSplit, RunParts, PathJoin, HostInfo, ReadOneLineFile
56 56

  
57 57
from ganeti.errors import LockError, UnitParseError, GenericError, \
58 58
     ProgrammerError, OpPrereqError
......
541 541
                      "/dev/null/does-not-exist")
542 542

  
543 543

  
544
class TestReadOneLineFile(testutils.GanetiTestCase):
545

  
546
  def setUp(self):
547
    testutils.GanetiTestCase.setUp(self)
548

  
549
  def testDefault(self):
550
    data = ReadOneLineFile(self._TestDataFilename("cert1.pem"))
551
    self.assertEqual(len(data), 27)
552
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
553

  
554
  def testNotStrict(self):
555
    data = ReadOneLineFile(self._TestDataFilename("cert1.pem"), strict=False)
556
    self.assertEqual(len(data), 27)
557
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
558

  
559
  def testStrictFailure(self):
560
    self.assertRaises(errors.GenericError, ReadOneLineFile,
561
                      self._TestDataFilename("cert1.pem"), strict=True)
562

  
563
  def testLongLine(self):
564
    dummydata = (1024 * "Hello World! ")
565
    myfile = self._CreateTempFile()
566
    utils.WriteFile(myfile, data=dummydata)
567
    datastrict = ReadOneLineFile(myfile, strict=True)
568
    datalax = ReadOneLineFile(myfile, strict=False)
569
    self.assertEqual(dummydata, datastrict)
570
    self.assertEqual(dummydata, datalax)
571

  
572
  def testNewline(self):
573
    myfile = self._CreateTempFile()
574
    myline = "myline"
575
    for nl in ["", "\n", "\r\n"]:
576
      dummydata = "%s%s" % (myline, nl)
577
      utils.WriteFile(myfile, data=dummydata)
578
      datalax = ReadOneLineFile(myfile, strict=False)
579
      self.assertEqual(myline, datalax)
580
      datastrict = ReadOneLineFile(myfile, strict=True)
581
      self.assertEqual(myline, datastrict)
582

  
583
  def testWhitespaceAndMultipleLines(self):
584
    myfile = self._CreateTempFile()
585
    for nl in ["", "\n", "\r\n"]:
586
      for ws in [" ", "\t", "\t\t  \t", "\t "]:
587
        dummydata = (1024 * ("Foo bar baz %s%s" % (ws, nl)))
588
        utils.WriteFile(myfile, data=dummydata)
589
        datalax = ReadOneLineFile(myfile, strict=False)
590
        if nl:
591
          self.assert_(set("\r\n") & set(dummydata))
592
          self.assertRaises(errors.GenericError, ReadOneLineFile,
593
                            myfile, strict=True)
594
          explen = len("Foo bar baz ") + len(ws)
595
          self.assertEqual(len(datalax), explen)
596
          self.assertEqual(datalax, dummydata[:explen])
597
          self.assertFalse(set("\r\n") & set(datalax))
598
        else:
599
          datastrict = ReadOneLineFile(myfile, strict=True)
600
          self.assertEqual(dummydata, datastrict)
601
          self.assertEqual(dummydata, datalax)
602

  
603
  def testEmptylines(self):
604
    myfile = self._CreateTempFile()
605
    myline = "myline"
606
    for nl in ["\n", "\r\n"]:
607
      for ol in ["", "otherline"]:
608
        dummydata = "%s%s%s%s%s%s" % (nl, nl, myline, nl, ol, nl)
609
        utils.WriteFile(myfile, data=dummydata)
610
        self.assert_(set("\r\n") & set(dummydata))
611
        datalax = ReadOneLineFile(myfile, strict=False)
612
        self.assertEqual(myline, datalax)
613
        if ol:
614
          self.assertRaises(errors.GenericError, ReadOneLineFile,
615
                            myfile, strict=True)
616
        else:
617
          datastrict = ReadOneLineFile(myfile, strict=True)
618
          self.assertEqual(myline, datastrict)
619

  
620

  
544 621
class TestTimestampForFilename(unittest.TestCase):
545 622
  def test(self):
546 623
    self.assert_("." not in utils.TimestampForFilename())

Also available in: Unified diff