python/ovs/db/idl: getattr(Row) raises TypeError, not AttributeError.
authorIsaku Yamahata <yamahata@valinux.co.jp>
Thu, 27 Sep 2012 09:29:45 +0000 (18:29 +0900)
committerBen Pfaff <blp@nicira.com>
Thu, 27 Sep 2012 16:11:49 +0000 (09:11 -0700)
In some cases getattr(Row instance, attrname) doesn't raise AttributeError,
but TypeError

> File "python/ovs/db/idl.py", line 554, in __getattr__
>     datum = self._data[column_name]
> TypeError: 'NoneType' object has no attribute '__getitem__'

So getattr(Row instance, attrname, default value) doesn't work.
This occurs when row._changes doesn't include attrname and row._data is None.
So teach Row.__getattr__ _data=None case.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Ben Pfaff <blp@nicira.com>
python/ovs/db/idl.py
tests/ovsdb-idl.at
tests/test-ovsdb.py

index 3a8dec2828cac76e559901dfd47c5d5cbdb648b9..9e9bf0f5d3e55fa579422fe400eeb62902fcac96 100644 (file)
@@ -548,6 +548,9 @@ class Row(object):
 
         datum = self._changes.get(column_name)
         if datum is None:
+            if self._data is None:
+                raise AttributeError("%s instance has no attribute '%s'" %
+                                     (self.__class__.__name__, column_name))
             datum = self._data[column_name]
 
         return datum.to_python(_uuid_to_row)
index 68fe8689f98a1cf2e7a74faa302c3a075239ca69..f4ed27e02847ffa0ec8cf2b199c86be33aa13476 100644 (file)
@@ -439,3 +439,12 @@ OVSDB_CHECK_IDL_PY([external-linking idl, insert ops],
 002: i=2 k=1 ka=[1 2] l2= uuid=<1>
 003: done
 ]])
+
+OVSDB_CHECK_IDL_PY([getattr idl, insert ops],
+  [],
+  [['getattrtest']],
+  [[000: empty
+001: commit, status=success
+002: i=2 k=2 ka=[] l2= uuid=<0>
+003: done
+]])
index 170476deadb05f77478d89e74b592f37260654f7..392ed4b70e5c0c148bd4b357d0c33f45c3194802 100644 (file)
@@ -321,6 +321,14 @@ def idl_set(idl, commands, step):
             l1_1.i = 2
             l1_1.k = [l1_0]
             l1_1.ka = [l1_0, l1_1]
+        elif name == 'getattrtest':
+            l1 = txn.insert(idl.tables["link1"])
+            i = getattr(l1, 'i', 1)
+            assert i == 1
+            l1.i = 2
+            i = getattr(l1, 'i', 1)
+            assert i == 2
+            l1.k = [l1]
         else:
             sys.stderr.write("unknown command %s\n" % name)
             sys.exit(1)