diff --git a/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/030_require_cell_setup.py b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/030_require_cell_setup.py
new file mode 100644
index 000000000..ffd975c38
--- /dev/null
+++ b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/030_require_cell_setup.py
@@ -0,0 +1,57 @@
+#    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 sqlalchemy import MetaData, Table, func, select
+
+from nova import exception
+from nova.i18n import _
+from nova import objects
+
+
+def upgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
+
+    flavors = Table('flavors', meta, autoload=True)
+    count = select([func.count()]).select_from(flavors).scalar()
+    if count == 0:
+        # NOTE(danms): We need to be careful here if this is a new
+        # installation, which can't possibly have any mappings. Check
+        # to see if any flavors are defined to determine if we are
+        # upgrading an existing system. If not, then don't obsess over
+        # the lack of mappings
+        return
+
+    cell_mappings = Table('cell_mappings', meta, autoload=True)
+    count = select([func.count()]).select_from(cell_mappings).scalar()
+    # Two mappings are required at a minimum, cell0 and your first cell
+    if count < 2:
+        msg = _('Cell mappings are not created, but required for Ocata. '
+                'Please run nova-manage db simple_cell_setup before '
+                'continuing.')
+        raise exception.ValidationError(detail=msg)
+
+    count = select([func.count()]).select_from(cell_mappings).where(
+        cell_mappings.c.uuid == objects.CellMapping.CELL0_UUID).scalar()
+    if count != 1:
+        msg = _('A mapping for Cell0 was not found, but is required for '
+                'Ocata. Please run nova-manage db simple_cell_setup before '
+                'continuing.')
+        raise exception.ValidationError(detail=msg)
+
+    host_mappings = Table('host_mappings', meta, autoload=True)
+    count = select([func.count()]).select_from(host_mappings).scalar()
+    if count == 0:
+        msg = _('No host mappings were found, but are required for Ocata. '
+                'Please run nova-manage db simple_cell_setup before '
+                'continuing.')
+        raise exception.ValidationError(detail=msg)