Skip to content

Commit

Permalink
python/ovs/db/idl: getattr(Row) raises TypeError, not AttributeError.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
Isaku Yamahata authored and blp committed Sep 27, 2012
1 parent f89b7ce commit 3b4c362
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
3 changes: 3 additions & 0 deletions python/ovs/db/idl.py
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,9 @@ def __getattr__(self, column_name):

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)
Expand Down
9 changes: 9 additions & 0 deletions tests/ovsdb-idl.at
Original file line number Diff line number Diff line change
Expand Up @@ -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
]])
8 changes: 8 additions & 0 deletions tests/test-ovsdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 3b4c362

Please sign in to comment.