diff --git a/include/Image.h b/include/Image.h index 906e1f9489..6c87507d9c 100644 --- a/include/Image.h +++ b/include/Image.h @@ -45,10 +45,9 @@ public: enum ImageState { INIT = 0, /** < Initialization state */ - LOCKED = 1, /** < FS operation on the image in progress, don't use */ - READY = 2, /** < Image ready to use */ - USED = 3, /** < Image in use */ - DISABLED = 4 /** < Image can not be instantiated by a VM */ + READY = 1, /** < Image ready to use */ + USED = 2, /** < Image in use */ + DISABLED = 3 /** < Image can not be instantiated by a VM */ }; /** @@ -140,10 +139,9 @@ public: /** * Get an image to be used in a VM, and updates its state. - * @param overwrite true if the image is going to be overwritten * @return 0 if success */ - int acquire_image(bool overwrite); + int acquire_image(); /** @@ -209,7 +207,7 @@ public: * automatically increased. * @param img_type will be set to the used image's type */ - int disk_attribute(VectorAttribute * disk, int* index, ImageType& img_type); + int disk_attribute(VectorAttribute * disk, int* index, ImageType* img_type); // ------------------------------------------------------------------------ // Template diff --git a/include/ImagePool.h b/include/ImagePool.h index 73289a1f36..d7fd446ec0 100644 --- a/include/ImagePool.h +++ b/include/ImagePool.h @@ -168,14 +168,16 @@ public: /** * Generates a DISK attribute for VM templates using the Image metadata * @param disk the disk to be generated + * @param disk_id the id for this disk * @param index number of datablock images used by the same VM. Will be * automatically increased. * @param img_type will be set to the used image's type * @return 0 on success, -1 error, -2 not using the pool */ - int disk_attribute(VectorAttribute * disk, int* index, - Image::ImageType& img_type); - + int disk_attribute(VectorAttribute * disk, + int disk_id, + int * index, + Image::ImageType * img_type); /** * Generates an Authorization token for the DISK attribute * @param disk the disk to be authorized diff --git a/src/image/Image.cc b/src/image/Image.cc index 23c24c2424..a1e9d0943a 100644 --- a/src/image/Image.cc +++ b/src/image/Image.cc @@ -478,7 +478,7 @@ string& Image::to_str(string& str) const /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ -int Image::acquire_image(bool overwrite) +int Image::acquire_image() { int rc = 0; @@ -487,30 +487,14 @@ int Image::acquire_image(bool overwrite) { case READY: running_vms++; - - if ( overwrite == true) - { - state = LOCKED; - } - else - { - state = USED; - } + state = USED; break; case USED: - if ( overwrite == true) - { - rc = -1; - } - else - { - running_vms++; - } + running_vms++; break; case DISABLED: - case LOCKED: default: rc = -1; break; @@ -529,7 +513,6 @@ bool Image::release_image() switch (state) { case USED: - case LOCKED: running_vms--; if ( running_vms == 0) @@ -553,15 +536,15 @@ bool Image::release_image() /* ------------------------------------------------------------------------ */ int Image::disk_attribute( VectorAttribute * disk, - int * index, - ImageType& img_type) + int * index, + ImageType* img_type) { string bus; ostringstream iid; - img_type = type; - bus = disk->vector_value("BUS"); + *img_type = type; + bus = disk->vector_value("BUS"); iid << oid; string template_bus; @@ -574,7 +557,7 @@ int Image::disk_attribute( VectorAttribute * disk, // Acquire the image //-------------------------------------------------------------------------- - if ( acquire_image(true) != 0 ) + if ( acquire_image() != 0 ) { return -1; } diff --git a/src/image/ImagePool.cc b/src/image/ImagePool.cc index 1ba8b023ef..840096c879 100644 --- a/src/image/ImagePool.cc +++ b/src/image/ImagePool.cc @@ -165,12 +165,16 @@ int ImagePool::dump(ostringstream& oss, const string& where) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int ImagePool::disk_attribute( VectorAttribute * disk, - int * index, - Image::ImageType& img_type) +int ImagePool::disk_attribute(VectorAttribute * disk, + int disk_id, + int * index, + Image::ImageType * img_type) { string source; Image * img = 0; + int rc; + + ostringstream oss; source = disk->vector_value("IMAGE"); @@ -181,37 +185,68 @@ int ImagePool::disk_attribute( VectorAttribute * disk, source = disk->vector_value("IMAGE_ID"); - if (source.empty()) + if (!source.empty()) { - return -2; - } + is.str(source); + is >> image_id; - is.str(source); - is >> image_id; + if( !is.fail() ) + { + img = get(image_id,true); - if( !is.fail() ) - { - img = get(image_id,true); + if (img == 0) + { + return -1; + } + } } } else { img = get(source,true); + + if (img == 0) + { + return -1; + } } if (img == 0) { - return -1; + string type = disk->vector_value("TYPE"); + + transform(type.begin(), type.end(), type.begin(), (int(*)(int))toupper); + + if( type == "SWAP" ) + { + string target = disk->vector_value("TARGET"); + + if ( target.empty() ) + { + string dev_prefix = _default_dev_prefix; + + dev_prefix += "d"; + + disk->replace("TARGET", dev_prefix); + } + } + + rc = -2; } - - int rc = img->disk_attribute(disk,index, img_type); - - if ( rc == 0 ) + else { - update(img); + rc = img->disk_attribute(disk, index, img_type); + + if ( rc == 0 ) + { + update(img); + } + + img->unlock(); } - img->unlock(); + oss << disk_id; + disk->replace("DISK_ID",oss.str()); return rc; } diff --git a/src/vm/VirtualMachine.cc b/src/vm/VirtualMachine.cc index 99806434b9..78b99c49bd 100644 --- a/src/vm/VirtualMachine.cc +++ b/src/vm/VirtualMachine.cc @@ -829,6 +829,9 @@ int VirtualMachine::get_disk_images() int n_cd = 0; string type; + ostringstream oss; + Image::ImageType img_type; + Nebula& nd = Nebula::instance(); ipool = nd.get_ipool(); @@ -836,7 +839,6 @@ int VirtualMachine::get_disk_images() for(int i=0, index=0; i(disks[i]); if ( disk == 0 ) @@ -844,70 +846,40 @@ int VirtualMachine::get_disk_images() continue; } - Image::ImageType img_type; - rc = ipool->disk_attribute(disk, &index, img_type); + rc = ipool->disk_attribute(disk, i, &index, &img_type); - switch(rc) + if (rc == 0 ) { - case 0: // OK - switch(img_type) - { - case Image::OS: - n_os++; - break; - case Image::CDROM: - n_cd++; - break; - default: - break; - } + switch(img_type) + { + case Image::OS: + n_os++; + break; + case Image::CDROM: + n_cd++; + break; + default: + break; + } - if( n_os > 1 ) // Max. number of OS images is 1 - { - goto error_max_os; - } + if( n_os > 1 ) // Max. number of OS images is 1 + { + goto error_max_os; + } - if( n_cd > 1 ) // Max. number of CDROM images is 1 - { - goto error_max_cd; - } - - break; - - case -2: // not using the Image pool - type = disk->vector_value("TYPE"); - - transform (type.begin(), type.end(), type.begin(), - (int(*)(int))toupper); - - if( type == "SWAP" ) - { - string target = disk->vector_value("TARGET"); - - if ( target.empty() ) - { - Nebula& nd = Nebula::instance(); - string dev_prefix; - - nd.get_configuration_attribute("DEFAULT_DEVICE_PREFIX", - dev_prefix); - dev_prefix += "d"; - - disk->replace("TARGET", dev_prefix); - } - } - - break; - - case -1: // ERROR - goto error_image; - break; + if( n_cd > 1 ) // Max. number of CDROM images is 1 + { + goto error_max_cd; + } + } + else if ( rc == -1 ) + { + goto error_image; } } return 0; - error_max_os: NebulaLog::log("ONE",Log::ERROR, "VM can not use more than one OS image.");