1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-26 06:50:09 +03:00

Feature : Check multiple cluster ids in disk/nic attach

This commit is contained in:
Carlos Martín 2016-03-15 18:17:53 +01:00
parent 73f5ceb644
commit 6bbac5077c

@ -21,6 +21,7 @@
#include "TransferManager.h"
#include "ImageManager.h"
#include "Quotas.h"
#include "Request.h"
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
@ -972,7 +973,7 @@ int DispatchManager::attach(int vid,
int uid;
int oid;
int image_id;
int image_cluster_id;
string disk_cluster_ids;
set<string> used_targets;
VectorAttribute * disk;
@ -1070,37 +1071,44 @@ int DispatchManager::attach(int vid,
return -1;
}
// TODO: change to CLUSTER_IDS
// Check that we don't have a cluster incompatibility.
if (disk->vector_value("CLUSTER_ID", image_cluster_id) == 0)
if (disk->vector_value("CLUSTER_IDS", disk_cluster_ids) == 0)
{
if (vm->get_cid() != image_cluster_id)
{
imagem->release_image(oid, image_id, false);
set<int> cluster_ids;
one_util::split_unique(disk_cluster_ids, ',', cluster_ids);
delete snap;
delete disk;
if (cluster_ids.count(vm->get_cid()) == 0)
{
imagem->release_image(oid, image_id, false);
if ( vm->get_lcm_state() == VirtualMachine::HOTPLUG )
{
vm->set_state(VirtualMachine::RUNNING);
}
else
{
vm->set_state(VirtualMachine::LCM_INIT);
vm->set_state(VirtualMachine::POWEROFF);
}
delete snap;
delete disk;
vmpool->update(vm);
if ( vm->get_lcm_state() == VirtualMachine::HOTPLUG )
{
vm->set_state(VirtualMachine::RUNNING);
}
else
{
vm->set_state(VirtualMachine::LCM_INIT);
vm->set_state(VirtualMachine::POWEROFF);
}
vm->unlock();
vmpool->update(vm);
error_str = "Could not attach disk because of cluster incompatibility.";
vm->unlock();
NebulaLog::log("DiM", Log::ERROR, error_str);
return -1;
}
oss << "Could not attach disk because "
<< Request::object_name(PoolObjectSQL::IMAGE)
<< " [" << image_id << "] is not part of "
<< Request::object_name(PoolObjectSQL::CLUSTER)
<< " [" << vm->get_cid() << "].";
error_str = oss.str();
NebulaLog::log("DiM", Log::ERROR, error_str);
return -1;
}
}
// Set the VM info in the history before the disk is attached to the
@ -1446,6 +1454,7 @@ int DispatchManager::attach_nic(
int oid;
int rc;
string tmp_error;
string nic_cluster_ids;
set<int> vm_sgs;
@ -1563,6 +1572,47 @@ int DispatchManager::attach_nic(
return -1;
}
// Check that we don't have a cluster incompatibility.
if (nic->vector_value("CLUSTER_IDS", nic_cluster_ids) == 0)
{
set<int> cluster_ids;
one_util::split_unique(nic_cluster_ids, ',', cluster_ids);
if (cluster_ids.count(vm->get_cid()) == 0)
{
VirtualMachine::release_network_leases(nic, vid);
vector<VectorAttribute*>::iterator it;
for(it = sg_rules.begin(); it != sg_rules.end(); it++)
{
delete *it;
}
delete nic;
oss << "Could not attach nic because "
<< Request::object_name(PoolObjectSQL::NET)
<< " is not part of "
<< Request::object_name(PoolObjectSQL::CLUSTER)
<< " [" << vm->get_cid() << "].";
error_str = oss.str();
if (vm->get_lcm_state() == VirtualMachine::HOTPLUG_NIC)
{
vm->set_state(VirtualMachine::RUNNING);
}
vmpool->update(vm);
vm->unlock();
NebulaLog::log("DiM", Log::ERROR, error_str);
return -1;
}
}
// Set the VM info in the history before the nic is attached to the
// VM template
vm->set_vm_info();