'Create the block device record in the database.
In case the id field is set on the object, and if the instance is set
raise an ObjectActionError. Resets all the changes on the object.
Returns None
:param context: security context used for database calls
:param update_or_create: consider existing block devices for the
instance based on the device name and swap, and only update
the ones that match. Normally only used when creating the
instance for the first time.'

def _create(self, context, update_or_create=False):

    cell_type = cells_opts.get_cell_type()
    if (cell_type == 'api'):
        raise exception.ObjectActionError(action='create', reason='BlockDeviceMapping    cannot    be    created    in    the    API    cell.')
    if self.obj_attr_is_set('id'):
        raise exception.ObjectActionError(action='create', reason='already    created')
    updates = self.obj_get_changes()
    if ('instance' in updates):
        raise exception.ObjectActionError(action='create', reason='instance    assigned')
    cells_create = (update_or_create or None)
    if update_or_create:
        db_bdm = db.block_device_mapping_update_or_create(context, updates, legacy=False)
    else:
        db_bdm = db.block_device_mapping_create(context, updates, legacy=False)
    self._from_db_object(context, self, db_bdm)
    if ((cell_type == 'compute') and (db_bdm.get('device_name') is not None)):
        cells_api = cells_rpcapi.CellsAPI()
        cells_api.bdm_update_or_create_at_top(context, self, create=cells_create)
