summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/objects/instance_fault.py61
-rw-r--r--nova/tests/objects/test_instance_fault.py86
2 files changed, 147 insertions, 0 deletions
diff --git a/nova/objects/instance_fault.py b/nova/objects/instance_fault.py
new file mode 100644
index 000000000..d6f7a6140
--- /dev/null
+++ b/nova/objects/instance_fault.py
@@ -0,0 +1,61 @@
+# Copyright 2013 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from nova import db
+from nova.objects import base
+from nova.objects import utils as obj_utils
+
+
+class InstanceFault(base.NovaObject):
+ fields = {
+ 'id': int,
+ 'instance_uuid': str,
+ 'code': int,
+ 'message': obj_utils.str_or_none,
+ 'details': obj_utils.str_or_none,
+ 'host': obj_utils.str_or_none,
+ }
+
+ @staticmethod
+ def _from_db_object(fault, db_fault):
+ # NOTE(danms): These are identical right now
+ for key in fault.fields:
+ fault[key] = db_fault[key]
+ fault.obj_reset_changes()
+ return fault
+
+ @base.remotable_classmethod
+ def get_latest_for_instance(cls, context, instance_uuid):
+ db_faults = db.instance_fault_get_by_instance_uuids(context,
+ [instance_uuid])
+ if instance_uuid in db_faults and db_faults[instance_uuid]:
+ return cls._from_db_object(cls(), db_faults[instance_uuid][0])
+
+
+def _make_fault_list(faultlist, db_faultlist):
+ faultlist.objects = []
+ for instance_uuid in db_faultlist:
+ for db_fault in db_faultlist[instance_uuid]:
+ faultlist.objects.append(InstanceFault._from_db_object(
+ InstanceFault(), db_fault))
+ faultlist.obj_reset_changes()
+ return faultlist
+
+
+class InstanceFaultList(base.ObjectListBase, base.NovaObject):
+ @base.remotable_classmethod
+ def get_by_instance_uuids(cls, context, instance_uuids):
+ db_faults = db.instance_fault_get_by_instance_uuids(context,
+ instance_uuids)
+ return _make_fault_list(cls(), db_faults)
diff --git a/nova/tests/objects/test_instance_fault.py b/nova/tests/objects/test_instance_fault.py
new file mode 100644
index 000000000..2f9840df1
--- /dev/null
+++ b/nova/tests/objects/test_instance_fault.py
@@ -0,0 +1,86 @@
+# Copyright 2013 IBM Corp.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from nova import context
+from nova import db
+from nova.objects import instance_fault
+from nova.tests.objects import test_objects
+
+
+fake_faults = {
+ 'fake-uuid': [
+ {'id': 1, 'instance_uuid': 'fake-uuid', 'code': 123, 'message': 'msg1',
+ 'details': 'details', 'host': 'host', 'deleted': False,
+ 'created_at': None, 'updated_at': None, 'deleted_at': None},
+ {'id': 2, 'instance_uuid': 'fake-uuid', 'code': 456, 'message': 'msg2',
+ 'details': 'details', 'host': 'host', 'deleted': False,
+ 'created_at': None, 'updated_at': None, 'deleted_at': None},
+ ]
+ }
+
+
+class _TestInstanceFault(object):
+ def test_get_latest_for_instance(self):
+ ctxt = context.get_admin_context()
+ self.mox.StubOutWithMock(db, 'instance_fault_get_by_instance_uuids')
+ db.instance_fault_get_by_instance_uuids(ctxt, ['fake-uuid']).AndReturn(
+ fake_faults)
+ self.mox.ReplayAll()
+ fault = instance_fault.InstanceFault.get_latest_for_instance(
+ ctxt, 'fake-uuid')
+ for key in fake_faults['fake-uuid'][0]:
+ self.assertEqual(fake_faults['fake-uuid'][0][key], fault[key])
+
+ def test_get_latest_for_instance_with_none(self):
+ ctxt = context.get_admin_context()
+ self.mox.StubOutWithMock(db, 'instance_fault_get_by_instance_uuids')
+ db.instance_fault_get_by_instance_uuids(ctxt, ['fake-uuid']).AndReturn(
+ {})
+ self.mox.ReplayAll()
+ fault = instance_fault.InstanceFault.get_latest_for_instance(
+ ctxt, 'fake-uuid')
+ self.assertEqual(None, fault)
+
+ def test_get_by_instance(self):
+ ctxt = context.get_admin_context()
+ self.mox.StubOutWithMock(db, 'instance_fault_get_by_instance_uuids')
+ db.instance_fault_get_by_instance_uuids(ctxt, ['fake-uuid']).AndReturn(
+ fake_faults)
+ self.mox.ReplayAll()
+ faults = instance_fault.InstanceFaultList.get_by_instance_uuids(
+ ctxt, ['fake-uuid'])
+ for index, db_fault in enumerate(fake_faults['fake-uuid']):
+ for key in db_fault:
+ self.assertEqual(fake_faults['fake-uuid'][index][key],
+ faults[index][key])
+
+ def test_get_by_instance_with_none(self):
+ ctxt = context.get_admin_context()
+ self.mox.StubOutWithMock(db, 'instance_fault_get_by_instance_uuids')
+ db.instance_fault_get_by_instance_uuids(ctxt, ['fake-uuid']).AndReturn(
+ {})
+ self.mox.ReplayAll()
+ faults = instance_fault.InstanceFaultList.get_by_instance_uuids(
+ ctxt, ['fake-uuid'])
+ self.assertEqual(0, len(faults))
+
+
+class TestInstanceFault(test_objects._LocalTest,
+ _TestInstanceFault):
+ pass
+
+
+class TestInstanceFaultRemote(test_objects._RemoteTest,
+ _TestInstanceFault):
+ pass