bool StoragesAssigner::assignOneRequest(Request::Storages * storages, Assignment* reqAssignment)
{
    // form the vector from the set to have an ability to sort it
    std::vector<Store * > storagesVec(storages->begin(), storages->end());
    std::sort(storagesVec.begin(), storagesVec.end(), storagesCompare);
    for ( unsigned index = 0; index < storagesVec.size(); ++index )
    {
        bool result = assignOneStorage(storagesVec[index], reqAssignment);
        if ( !result ) 
        {
            result = limitedExhaustiveSearch(storagesVec[index], reqAssignment, NULL);
            if ( !result )
            {
                // remove assignments
                for ( unsigned i = 0; i < index; ++i )
                {
                    reqAssignment->GetAssignment(storagesVec[i])->RemoveAssignment(storagesVec[i]);
                }

                // tell the upper layer to delete assignment
                return false;
            }
        }
    }

    return true;
}
bool VirtualMachinesAssigner::assignOneRequest(Request::VirtualMachines * virtualMachines, Assignment* reqAssignment)
{
    // form the vector from the set to have an ability to sort it
    std::vector<Node * > virtualMachinesVec(virtualMachines->begin(), virtualMachines->end());
    std::sort(virtualMachinesVec.begin(), virtualMachinesVec.end(), virtualMachinesCompare);
    for ( unsigned index = 0; index < virtualMachinesVec.size(); ++index )
    {
        bool result = assignOneVirtualMachine(virtualMachinesVec[index], reqAssignment);
        if ( !result ) 
        {
            // trying limited exhaustive search
            result = limitedExhaustiveSearch(virtualMachinesVec[index], reqAssignment, NULL);
            if ( !result )
            {
                // remove assignments
                for ( unsigned i = 0; i < index; ++i )
                {
                    reqAssignment->GetAssignment(virtualMachinesVec[i])->RemoveAssignment(virtualMachinesVec[i]);
                }

                // tell the upper layer to delete assignment
                return false;
            }
        }
    }

    return true;
}