1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-08-11 21:49:27 +03:00

B #1412: Prevented attach action with images in LOCKED state

This commit is contained in:
juanmont
2018-01-23 12:57:24 +01:00
parent 88013d00bb
commit a4460bea2b
5 changed files with 40 additions and 14 deletions

View File

@ -94,18 +94,20 @@ public:
* Try to acquire an image from the repository for a VM.
* @param image_id id of image
* @param error string describing the error
* @param attach indicates that are trying to make an attachment of the image
* @return pointer to the image or 0 if could not be acquired
*/
Image * acquire_image(int vm_id, int image_id, string& error);
Image * acquire_image(int vm_id, int image_id, string& error, bool attach);
/**
* Try to acquire an image from the repository for a VM.
* @param name of the image
* @param id of owner
* @param error string describing the error
* @param attach indicates that are trying to make an attachment of the image
* @return pointer to the image or 0 if could not be acquired
*/
Image * acquire_image(int vm_id, const string& name, int uid, string& error);
Image * acquire_image(int vm_id, const string& name, int uid, string& error, bool attach);
/**
* Releases an image and triggers any needed operations in the repo
@ -358,9 +360,10 @@ private:
/**
* Acquires an image updating its state.
* @param image pointer to image, it should be locked
* @param attach indicates that are trying to make an attachment of the image
* @return 0 on success
*/
int acquire_image(int vm_id, Image *img, string& error);
int acquire_image(int vm_id, Image *img, string& error, bool attach);
/**
* Moves a file to an image in the repository

View File

@ -166,7 +166,8 @@ public:
int uid,
int& image_id,
Snapshots ** snaps,
string& error_str);
string& error_str,
bool attach);
/**
* Generates a DISK attribute for VM templates using the Image metadata
*

View File

@ -25,7 +25,7 @@
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
Image * ImageManager::acquire_image(int vm_id, int image_id, string& error, bool attach)
{
Image * img;
int rc;
@ -41,7 +41,7 @@ Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
return 0;
}
rc = acquire_image(vm_id, img, error);
rc = acquire_image(vm_id, img, error, attach);
if ( rc != 0 )
{
@ -54,7 +54,7 @@ Image * ImageManager::acquire_image(int vm_id, int image_id, string& error)
/* -------------------------------------------------------------------------- */
Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, string& error)
Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, string& error, bool attach)
{
Image * img;
int rc;
@ -71,7 +71,7 @@ Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, stri
return 0;
}
rc = acquire_image(vm_id, img, error);
rc = acquire_image(vm_id, img, error, attach);
if ( rc != 0 )
{
@ -84,7 +84,7 @@ Image * ImageManager::acquire_image(int vm_id, const string& name, int uid, stri
/* -------------------------------------------------------------------------- */
int ImageManager::acquire_image(int vm_id, Image *img, string& error)
int ImageManager::acquire_image(int vm_id, Image *img, string& error, bool attach)
{
int rc = 0;
@ -126,6 +126,15 @@ int ImageManager::acquire_image(int vm_id, Image *img, string& error)
break;
case Image::LOCKED:
if (attach)
{
oss << "Cannot acquire image " << img->get_oid()
<< ", it is locked";
error = oss.str();
rc = -1;
}
img->inc_running(vm_id);
if ( img->is_persistent() )
@ -150,7 +159,19 @@ int ImageManager::acquire_image(int vm_id, Image *img, string& error)
break;
case Image::USED:
img->inc_running(vm_id);
ipool->update(img);
break;
case Image::LOCKED_USED:
if (attach)
{
oss << "Cannot acquire image " << img->get_oid()
<< ", it is locked";
error = oss.str();
rc = -1;
}
img->inc_running(vm_id);
ipool->update(img);
break;

View File

@ -297,7 +297,8 @@ int ImagePool::acquire_disk(int vm_id,
int uid,
int& image_id,
Snapshots ** snap,
string& error_str)
string& error_str,
bool attach)
{
string source;
Image * img = 0;
@ -314,7 +315,7 @@ int ImagePool::acquire_disk(int vm_id,
if ( disk->vector_value("IMAGE_ID", iid) == 0 )
{
img = imagem->acquire_image(vm_id, iid, error_str);
img = imagem->acquire_image(vm_id, iid, error_str, attach);
if ( img == 0 )
{
@ -336,7 +337,7 @@ int ImagePool::acquire_disk(int vm_id,
return -1;
}
img = imagem->acquire_image(vm_id, source, uiid, error_str);
img = imagem->acquire_image(vm_id, source, uiid, error_str, attach);
if ( img == 0 )
{

View File

@ -751,7 +751,7 @@ int VirtualMachineDisks::get_images(int vm_id, int uid, const std::string& tsys,
}
if ( ipool->acquire_disk(vm_id, disk, disk_id, image_type, dev_prefix,
uid, image_id, &snapshots, error_str) != 0 )
uid, image_id, &snapshots, error_str, false) != 0 )
{
oss << "DISK " << disk_id << ": " << error_str;
error_str = oss.str();
@ -1076,7 +1076,7 @@ VirtualMachineDisk * VirtualMachineDisks::set_up_attach(int vmid, int uid,
VirtualMachineDisk * disk = new VirtualMachineDisk(vdisk, max_disk_id + 1);
int rc = ipool->acquire_disk(vmid, disk, max_disk_id + 1, img_type,
dev_prefix, uid, image_id, &snap, error);
dev_prefix, uid, image_id, &snap, error, true);
if ( rc != 0 )
{
return 0;