mirror of
https://github.com/OpenNebula/one.git
synced 2024-12-25 23:21:29 +03:00
feature 1112: Work integrating datastores and images
This commit is contained in:
parent
45382e76b1
commit
d754c987e6
@ -146,17 +146,18 @@ public:
|
||||
|
||||
/**
|
||||
* Adds a new image to the repository copying or creating it as needed
|
||||
* @param iid id of image
|
||||
* @param img pointer to the image
|
||||
* @param ds_data data of the associated datastore in XML format
|
||||
* @return 0 on success
|
||||
*/
|
||||
int register_image(int iid);
|
||||
int register_image(int iid, const string& ds_data);
|
||||
|
||||
/**
|
||||
* Deletes an image from the repository and the DB
|
||||
* @param iid id of image
|
||||
* @return 0 on success
|
||||
*/
|
||||
int delete_image(int iid);
|
||||
int delete_image(int iid, const string& ds_data);
|
||||
|
||||
private:
|
||||
/**
|
||||
|
@ -93,14 +93,11 @@ int Image::insert(SqlDB *db, string& error_str)
|
||||
string path_attr;
|
||||
string type_att;
|
||||
string persistent_attr;
|
||||
string datastore_attr;
|
||||
string dev_prefix;
|
||||
string source_attr;
|
||||
string aname;
|
||||
|
||||
ostringstream oss;
|
||||
istringstream iss;
|
||||
string ds_id_str;
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Check template for restricted attributes
|
||||
@ -138,15 +135,6 @@ int Image::insert(SqlDB *db, string& error_str)
|
||||
goto error_type;
|
||||
}
|
||||
|
||||
// ------------ DATASTORE --------------------
|
||||
|
||||
erase_template_attribute("DATASTORE_ID", ds_id_str);
|
||||
|
||||
iss.str(ds_id_str);
|
||||
iss >> ds_id;
|
||||
|
||||
erase_template_attribute("DATASTORE", ds_name);
|
||||
|
||||
// ------------ PERSISTENT --------------------
|
||||
|
||||
erase_template_attribute("PERSISTENT", persistent_attr);
|
||||
@ -163,7 +151,6 @@ int Image::insert(SqlDB *db, string& error_str)
|
||||
{
|
||||
SingleAttribute * dev_att = new SingleAttribute("DEV_PREFIX",
|
||||
ImagePool::default_dev_prefix());
|
||||
|
||||
obj_template->set(dev_att);
|
||||
}
|
||||
|
||||
|
@ -17,8 +17,6 @@
|
||||
#include "ImageManager.h"
|
||||
#include "NebulaLog.h"
|
||||
#include "ImagePool.h"
|
||||
#include "DatastorePool.h"
|
||||
#include "Nebula.h"
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@ -311,7 +309,7 @@ int ImageManager::enable_image(int iid, bool to_enable)
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int ImageManager::delete_image(int iid)
|
||||
int ImageManager::delete_image(int iid, const string& ds_data)
|
||||
{
|
||||
Image * img;
|
||||
string source;
|
||||
@ -372,75 +370,29 @@ int ImageManager::delete_image(int iid)
|
||||
imd->rm(img->get_oid(),img->get_source());
|
||||
}
|
||||
|
||||
int ds_id = img->get_ds_id();
|
||||
img->unlock();
|
||||
|
||||
|
||||
Datastore * ds;
|
||||
DatastorePool * dspool;
|
||||
Nebula& nd = Nebula::instance();
|
||||
|
||||
dspool = nd.get_dspool();
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
// TODO check ds != 0
|
||||
|
||||
ds->del_image(iid);
|
||||
|
||||
dspool->update(ds);
|
||||
|
||||
ds->unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int ImageManager::register_image(int iid)
|
||||
int ImageManager::register_image(int iid, const string& ds_data)
|
||||
{
|
||||
const ImageManagerDriver* imd = get();
|
||||
|
||||
ostringstream oss;
|
||||
Image * img;
|
||||
|
||||
string path;
|
||||
Image* img;
|
||||
|
||||
if ( imd == 0 )
|
||||
{
|
||||
NebulaLog::log("ImM",Log::ERROR,
|
||||
"Could not get driver to update repository");
|
||||
NebulaLog::log("ImM",Log::ERROR, "Could not get datastore driver");
|
||||
return -1;
|
||||
}
|
||||
|
||||
img = ipool->get(iid,true);
|
||||
|
||||
if (img == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Add the image to its datastore
|
||||
int ds_id = img->get_ds_id();
|
||||
|
||||
img->unlock();
|
||||
|
||||
Datastore * ds;
|
||||
DatastorePool * dspool;
|
||||
Nebula& nd = Nebula::instance();
|
||||
|
||||
dspool = nd.get_dspool();
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
// TODO check ds != 0
|
||||
|
||||
ds->add_image(iid);
|
||||
|
||||
dspool->update(ds);
|
||||
|
||||
ds->unlock();
|
||||
|
||||
|
||||
|
||||
img = ipool->get(iid,true);
|
||||
|
||||
if (img == 0)
|
||||
|
@ -68,19 +68,27 @@ int ImagePool::allocate (
|
||||
int * oid,
|
||||
string& error_str)
|
||||
{
|
||||
Image * img;
|
||||
Image * img_aux = 0;
|
||||
string name;
|
||||
int ds_id;
|
||||
ostringstream oss;
|
||||
Datastore * ds;
|
||||
DatastorePool * dspool;
|
||||
Image * img;
|
||||
Image * img_aux = 0;
|
||||
|
||||
Nebula& nd = Nebula::instance();
|
||||
ostringstream oss;
|
||||
istringstream iss;
|
||||
|
||||
string name, ds_id_str, ds_data;
|
||||
int ds_id;
|
||||
|
||||
Datastore * ds = 0;
|
||||
|
||||
Nebula& nd = Nebula::instance();
|
||||
|
||||
DatastorePool * dspool = nd.get_dspool();
|
||||
ImageManager * imagem = nd.get_imagem();
|
||||
|
||||
img = new Image(uid, gid, uname, gname, img_template);
|
||||
|
||||
// Check name
|
||||
// -------------------------------------------------------------------------
|
||||
// Check name & duplicates
|
||||
// -------------------------------------------------------------------------
|
||||
img->get_template_attribute("NAME", name);
|
||||
|
||||
if ( name.empty() )
|
||||
@ -93,7 +101,6 @@ int ImagePool::allocate (
|
||||
goto error_name_length;
|
||||
}
|
||||
|
||||
// Check for duplicates
|
||||
img_aux = get(name,uid,false);
|
||||
|
||||
if( img_aux != 0 )
|
||||
@ -101,29 +108,39 @@ int ImagePool::allocate (
|
||||
goto error_duplicated;
|
||||
}
|
||||
|
||||
// Check datastore exists
|
||||
// -------------------------------------------------------------------------
|
||||
// Check that the datastore exists
|
||||
// -------------------------------------------------------------------------
|
||||
img->erase_template_attribute("DATASTORE", name);
|
||||
img->erase_template_attribute("DATASTORE_ID", ds_id_str);
|
||||
|
||||
// TODO: get datastore by name, and replace datastore name from it
|
||||
|
||||
img->get_template_attribute("DATASTORE_ID", ds_id);
|
||||
|
||||
// TODO how to check if "DATASTORE_ID" exists?
|
||||
// get_template_attribute returns 0 if the attribute does not exist...
|
||||
// but it can exist and have value 0
|
||||
if ( false )
|
||||
if ( name.empty() )
|
||||
{
|
||||
goto error_common; // TODO error
|
||||
iss.str(ds_id_str);
|
||||
iss >> ds_id;
|
||||
|
||||
if (ds_id == 0)
|
||||
{
|
||||
goto error_ds_system;
|
||||
}
|
||||
|
||||
ds = dspool->get(ds_id, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ds = dspool->get(name, true);
|
||||
}
|
||||
|
||||
dspool = nd.get_dspool();
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
if( ds == 0 )
|
||||
if ( ds == 0 )
|
||||
{
|
||||
goto error_common; // TODO error
|
||||
goto error_no_ds;
|
||||
}
|
||||
|
||||
img->replace_template_attribute("DATASTORE", ds->get_name());
|
||||
img->ds_name = ds->get_name();
|
||||
img->ds_id = ds->get_oid();
|
||||
ds_id = ds->get_oid();
|
||||
|
||||
ds->to_xml(ds_data);
|
||||
|
||||
ds->unlock();
|
||||
|
||||
@ -134,10 +151,20 @@ int ImagePool::allocate (
|
||||
|
||||
if ( *oid != -1 )
|
||||
{
|
||||
Nebula& nd = Nebula::instance();
|
||||
ImageManager * imagem = nd.get_imagem();
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
if ( imagem->register_image(*oid) == -1 )
|
||||
if ( ds == 0 )
|
||||
{
|
||||
goto error_ds_deleted;
|
||||
}
|
||||
|
||||
ds->add_image(*oid);
|
||||
|
||||
dspool->update(ds);
|
||||
|
||||
ds->unlock();
|
||||
|
||||
if ( imagem->register_image(*oid, ds_data) == -1 )
|
||||
{
|
||||
error_str = "Failed to copy image to repository. "
|
||||
"Image left in ERROR state.";
|
||||
@ -149,7 +176,6 @@ int ImagePool::allocate (
|
||||
|
||||
error_name:
|
||||
oss << "NAME cannot be empty.";
|
||||
|
||||
goto error_common;
|
||||
|
||||
error_name_length:
|
||||
@ -159,6 +185,19 @@ error_name_length:
|
||||
error_duplicated:
|
||||
oss << "NAME is already taken by IMAGE "
|
||||
<< img_aux->get_oid() << ".";
|
||||
goto error_common;
|
||||
|
||||
error_ds_system:
|
||||
oss << "System or non datastore in image template.";
|
||||
goto error_common;
|
||||
|
||||
error_ds_deleted:
|
||||
oss << "Datastore was deleted while registering image."
|
||||
<< "Image left in LOCKED state.";
|
||||
return -1;
|
||||
|
||||
error_no_ds:
|
||||
oss << "No datastore specify to register image.";
|
||||
|
||||
error_common:
|
||||
delete img;
|
||||
|
@ -106,10 +106,47 @@ void RequestManagerDelete::request_execute(xmlrpc_c::paramList const& paramList,
|
||||
int ImageDelete::drop(int oid, PoolObjectSQL * object, string& error_msg)
|
||||
{
|
||||
Nebula& nd = Nebula::instance();
|
||||
ImageManager * imagem = nd.get_imagem();
|
||||
|
||||
object->unlock();
|
||||
int rc = imagem->delete_image(oid);
|
||||
ImageManager * imagem = nd.get_imagem();
|
||||
DatastorePool * dspool = nd.get_dspool();
|
||||
|
||||
Datastore * ds;
|
||||
Image * img;
|
||||
|
||||
int ds_id, rc;
|
||||
string ds_data;
|
||||
|
||||
img = static_cast<Image *>(object);
|
||||
ds_id = img->get_ds_id();
|
||||
|
||||
img->unlock();
|
||||
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
if ( ds == 0 )
|
||||
{
|
||||
error_msg = "Datastore no longer exists can not remove image";
|
||||
return -1;
|
||||
}
|
||||
|
||||
ds->to_xml(ds_data);
|
||||
|
||||
ds->unlock();
|
||||
|
||||
rc = imagem->delete_image(oid, ds_data);
|
||||
|
||||
if ( rc == 0 )
|
||||
{
|
||||
ds = dspool->get(ds_id, true);
|
||||
|
||||
if ( ds != 0 )
|
||||
{
|
||||
ds->del_image(oid);
|
||||
dspool->update(ds);
|
||||
|
||||
ds->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user