mirror of
https://github.com/OpenNebula/one.git
synced 2024-12-23 17:33:56 +03:00
Feature #4217: Read the market data when creating an image
This commit is contained in:
parent
2b89eaaa47
commit
0477eb2ad6
@ -186,11 +186,7 @@ module OpenNebula
|
|||||||
|
|
||||||
tmpl << "\n"
|
tmpl << "\n"
|
||||||
tmpl << "NAME=\"" << name << "\"\n"
|
tmpl << "NAME=\"" << name << "\"\n"
|
||||||
tmpl << "PATH=" << self['SOURCE'] << "\n"
|
tmpl << "FROM_APP=\"" << self['ID'] << "\"\n"
|
||||||
tmpl << "FORMAT=" << self['FORMAT'] << "\n"
|
|
||||||
tmpl << "MD5=" << self['MD5'] << "\n"
|
|
||||||
tmpl << "FROM_APP=\"" << self['ID'] << "\"\n"
|
|
||||||
tmpl << "FROM_APP_NAME=\"" << self['NAME'] << "\"\n"
|
|
||||||
|
|
||||||
image = Image.new(Image.build_xml, one)
|
image = Image.new(Image.build_xml, one)
|
||||||
rc = image.allocate(tmpl, options[:dsid])
|
rc = image.allocate(tmpl, options[:dsid])
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#include "Nebula.h"
|
#include "Nebula.h"
|
||||||
#include "PoolObjectSQL.h"
|
#include "PoolObjectSQL.h"
|
||||||
|
#include "MarketPlacePool.h"
|
||||||
|
#include "MarketPlaceAppPool.h"
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
@ -318,16 +320,26 @@ void ImageAllocate::request_execute(xmlrpc_c::paramList const& params,
|
|||||||
ImagePool * ipool = static_cast<ImagePool *>(pool);
|
ImagePool * ipool = static_cast<ImagePool *>(pool);
|
||||||
ImageManager * imagem = nd.get_imagem();
|
ImageManager * imagem = nd.get_imagem();
|
||||||
|
|
||||||
|
MarketPlacePool * marketpool = nd.get_marketpool();
|
||||||
|
MarketPlaceAppPool * apppool = nd.get_apppool();
|
||||||
|
|
||||||
ImageTemplate * tmpl;
|
ImageTemplate * tmpl;
|
||||||
Template img_usage;
|
Template img_usage;
|
||||||
|
|
||||||
Datastore * ds;
|
Datastore * ds;
|
||||||
Image::DiskType ds_disk_type;
|
Image::DiskType ds_disk_type;
|
||||||
|
|
||||||
|
MarketPlaceApp * app;
|
||||||
|
MarketPlace * market;
|
||||||
|
int app_id;
|
||||||
|
int market_id;
|
||||||
|
|
||||||
long long avail;
|
long long avail;
|
||||||
|
|
||||||
bool ds_check;
|
bool ds_check;
|
||||||
|
|
||||||
|
string extra_data = "";
|
||||||
|
|
||||||
// ------------------------- Parse image template --------------------------
|
// ------------------------- Parse image template --------------------------
|
||||||
|
|
||||||
tmpl = new ImageTemplate;
|
tmpl = new ImageTemplate;
|
||||||
@ -382,15 +394,85 @@ void ImageAllocate::request_execute(xmlrpc_c::paramList const& params,
|
|||||||
|
|
||||||
// --------------- Get the SIZE for the Image, (DS driver) -----------------
|
// --------------- Get the SIZE for the Image, (DS driver) -----------------
|
||||||
|
|
||||||
rc = imagem->stat_image(tmpl, ds_data, size_str);
|
if ( tmpl->get("FROM_APP", app_id ) )
|
||||||
|
|
||||||
if ( rc == -1 )
|
|
||||||
{
|
{
|
||||||
failure_response(INTERNAL,
|
// This image comes from a MarketPlaceApp. Get the Market info and
|
||||||
request_error("Cannot determine Image SIZE", size_str),
|
// the size.
|
||||||
att);
|
|
||||||
delete tmpl;
|
string app_path;
|
||||||
return;
|
string app_format;
|
||||||
|
string app_md5;
|
||||||
|
string app_name;
|
||||||
|
|
||||||
|
bool market_check;
|
||||||
|
|
||||||
|
app = apppool->get(app_id, true);
|
||||||
|
|
||||||
|
if ( app_id == 0 )
|
||||||
|
{
|
||||||
|
failure_response(INTERNAL,
|
||||||
|
"Cannot find appliance referenced by FROM_APP",
|
||||||
|
att);
|
||||||
|
delete tmpl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
app->get_template_attribute("SOURCE", app_path);
|
||||||
|
app->get_template_attribute("FORMAT", app_format);
|
||||||
|
app->get_template_attribute("MD5", app_md5);
|
||||||
|
app->get_template_attribute("NAME", app_name);
|
||||||
|
app->get_template_attribute("SIZE", size_str);
|
||||||
|
|
||||||
|
market_check = app->get_template_attribute("MARKETPLACE_ID", market_id);
|
||||||
|
|
||||||
|
app->unlock();
|
||||||
|
|
||||||
|
if ( app_path.empty() )
|
||||||
|
{
|
||||||
|
failure_response(INTERNAL, "The appliance has no SOURCE", att);
|
||||||
|
delete tmpl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !market_check )
|
||||||
|
{
|
||||||
|
failure_response(INTERNAL, "The appliance has no MARKETPLACE_ID",
|
||||||
|
att);
|
||||||
|
delete tmpl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl->replace("PATH", app_path);
|
||||||
|
tmpl->replace("FORMAT", app_format);
|
||||||
|
tmpl->replace("MD5", app_format);
|
||||||
|
tmpl->replace("FROM_APP_NAME", app_name);
|
||||||
|
|
||||||
|
market = marketpool->get(market_id, true);
|
||||||
|
|
||||||
|
if (market == 0)
|
||||||
|
{
|
||||||
|
failure_response(INTERNAL, "Could not get the appliance's market.",
|
||||||
|
att);
|
||||||
|
delete tmpl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
market->to_xml(extra_data);
|
||||||
|
|
||||||
|
market->unlock();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rc = imagem->stat_image(tmpl, ds_data, size_str);
|
||||||
|
|
||||||
|
if ( rc == -1 )
|
||||||
|
{
|
||||||
|
failure_response(INTERNAL,
|
||||||
|
request_error("Cannot determine Image SIZE", size_str),
|
||||||
|
att);
|
||||||
|
delete tmpl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iss.str(size_str);
|
iss.str(size_str);
|
||||||
|
Loading…
Reference in New Issue
Block a user