Optimization reserve and release nodes db api methods

Bulk queries used for replacement one-by-one cycles.
Complex operations executed only in the case of error.
add_filter_by_many_identities() method added.

Change-Id: I3161f5ace1fa5b1bee76cda48700218b64e2b79e
Driver's validation during node update process implemented

Currently, the ConductorManager is not testing a change to the
node.driver, leading to the following unexpected behavior:
1. create a node with a valid 'driver' parameter
2. update the node with an invalid 'driver' parameter
    -- PATCH '{"driver": "foobar"}'
3. try to update the node with a valid 'driver' parameter
    -- PATCH '{"driver": "fake"}'
4. observe failure to load the "foobar" driver here.

To fix this case was added try_load_driver method to NodeManager
(at ironic/conductor/resource_manager.py) that finds driver by driver
name and returns it. If the driver isn't found a DriverNotFound
exception is raised.
Additional check for driver changes and changes for driver_info
was added to ironic/conductor/manager.py:ConductorManager.update_node
to avoid processing driver_info with incorrect driver.
Tests for NodeManager(init and load_driver) functionality was
added.

Fixes: bug#1207124.
Change-Id: Ibfb4df973464f132c0c135edea71f586d1c871e9
Merge "Optimization reserve and release nodes db api methods"
Merge "Driver's validation during node update process implemented"