Revision 35554b4f

b/lib/cmdlib.py
11837 11837
      # Append
11838 11838
      absidx = len(container) - 1
11839 11839
    elif idx < 0:
11840
      raise IndexError("Not accepting negative indices")
11840
      raise IndexError("Not accepting negative indices other than -1")
11841
    elif idx > len(container):
11842
      raise IndexError("Got %s index %s, but there are only %s" %
11843
                       (kind, idx, len(container)))
11841 11844
    else:
11842 11845
      absidx = idx
11843 11846

  
11844 11847
    changes = None
11845 11848

  
11846 11849
    if op == constants.DDM_ADD:
11850
      # Calculate where item will be added
11851
      if idx == -1:
11852
        addidx = len(container)
11853
      else:
11854
        addidx = idx
11855

  
11847 11856
      if create_fn is None:
11848 11857
        item = params
11849 11858
      else:
11850
        (item, changes) = create_fn(absidx + 1, params, private)
11859
        (item, changes) = create_fn(addidx, params, private)
11851 11860

  
11852 11861
      if idx == -1:
11853 11862
        container.append(item)
11854 11863
      else:
11855 11864
        assert idx >= 0
11865
        assert idx <= len(container)
11856 11866
        # list.insert does so before the specified index
11857 11867
        container.insert(idx, item)
11858 11868
    else:
b/test/ganeti.cmdlib_unittest.py
802 802
    self.assertEqual(container, ["Start", "Hello", "World", "End"])
803 803
    self.assertEqual(chgdesc, [])
804 804

  
805
    mods = cmdlib.PrepareContainerMods([
806
      (constants.DDM_ADD, 0, "zero"),
807
      (constants.DDM_ADD, 3, "Added"),
808
      (constants.DDM_ADD, 5, "four"),
809
      (constants.DDM_ADD, 7, "xyz"),
810
      ], None)
811
    cmdlib.ApplyContainerMods("test", container, chgdesc, mods,
812
                              None, None, None)
813
    self.assertEqual(container,
814
                     ["zero", "Start", "Hello", "Added", "World", "four",
815
                      "End", "xyz"])
816
    self.assertEqual(chgdesc, [])
817

  
818
    for idx in [-2, len(container) + 1]:
819
      mods = cmdlib.PrepareContainerMods([
820
        (constants.DDM_ADD, idx, "error"),
821
        ], None)
822
      self.assertRaises(IndexError, cmdlib.ApplyContainerMods,
823
                        "test", container, None, mods, None, None, None)
824

  
805 825
  def testRemoveError(self):
806 826
    for idx in [0, 1, 2, 100, -1, -4]:
807 827
      mods = cmdlib.PrepareContainerMods([
......
817 837
                      "test", [""], None, mods, None, None, None)
818 838

  
819 839
  def testAddError(self):
820
    for idx in range(-100, -1):
840
    for idx in range(-100, -1) + [100]:
821 841
      mods = cmdlib.PrepareContainerMods([
822 842
        (constants.DDM_ADD, idx, None),
823 843
        ], None)
......
839 859
      ("test/2", "remove"),
840 860
      ])
841 861

  
862
  def testModify(self):
863
    container = ["item 1", "item 2"]
864
    mods = cmdlib.PrepareContainerMods([
865
      (constants.DDM_MODIFY, -1, "a"),
866
      (constants.DDM_MODIFY, 0, "b"),
867
      (constants.DDM_MODIFY, 1, "c"),
868
      ], None)
869
    chgdesc = []
870
    cmdlib.ApplyContainerMods("test", container, chgdesc, mods,
871
                              None, None, None)
872
    self.assertEqual(container, ["item 1", "item 2"])
873
    self.assertEqual(chgdesc, [])
874

  
875
    for idx in [-2, len(container) + 1]:
876
      mods = cmdlib.PrepareContainerMods([
877
        (constants.DDM_MODIFY, idx, "error"),
878
        ], None)
879
      self.assertRaises(IndexError, cmdlib.ApplyContainerMods,
880
                        "test", container, None, mods, None, None, None)
881

  
842 882
  class _PrivateData:
843 883
    def __init__(self):
844 884
      self.data = None
......
877 917
    cmdlib.ApplyContainerMods("test", container, chgdesc, mods,
878 918
      self._CreateTestFn, self._ModifyTestFn, self._RemoveTestFn)
879 919
    self.assertEqual(container, [
880
      (100, "Start"),
881
      (200, "More"),
882
      (0, "Hello"),
920
      (000, "Start"),
921
      (100, "More"),
922
      (000, "Hello"),
883 923
      ])
884 924
    self.assertEqual(chgdesc, [
885 925
      ("test/0", "0x0"),
886 926
      ("test/1", "0x1"),
887
      ("test/1", "0x1"),
927
      ("test/0", "0x0"),
888 928
      ("test/3", "0x3"),
889 929
      ("test/2", "remove"),
890 930
      ("test/2", "modify foobar"),
891 931
      ("test/2", "remove"),
892
      ("test/2", "0x2")
932
      ("test/1", "0x1")
893 933
      ])
894 934
    self.assertTrue(compat.all(op == private.data[0]
895 935
                               for (op, _, _, private) in mods))
896 936
    self.assertEqual([private.data for (op, _, _, private) in mods], [
897 937
      ("add", 0, "Hello"),
898 938
      ("add", 1, "World"),
899
      ("add", 1, "Start"),
939
      ("add", 0, "Start"),
900 940
      ("add", 3, "End"),
901 941
      ("remove", 2, (100, "World")),
902 942
      ("modify", 2, "foobar"),
903 943
      ("remove", 2, (300, "End")),
904
      ("add", 2, "More"),
944
      ("add", 1, "More"),
905 945
      ])
906 946

  
907 947

  

Also available in: Unified diff