mirror of
https://github.com/OpenNebula/one.git
synced 2024-12-23 17:33:56 +03:00
feature #3782: Quotas for single snapshot deletion
This commit is contained in:
parent
b2101281ec
commit
9964cb27e2
@ -174,6 +174,13 @@ public:
|
||||
*/
|
||||
unsigned int get_total_size() const;
|
||||
|
||||
/**
|
||||
* Get the size (virtual) in mb of the given snapshot
|
||||
* @param id of the snapshot
|
||||
* @return size or 0 if not found
|
||||
*/
|
||||
unsigned int get_snapshot_size(unsigned int id) const;
|
||||
|
||||
/**
|
||||
* Get Attribute from the given snapshot
|
||||
* @param id of the snapshot
|
||||
@ -181,7 +188,7 @@ public:
|
||||
*
|
||||
* @return value or empty if not found
|
||||
*/
|
||||
string get_snapshot_attribute(unsigned int id, const char* name);
|
||||
string get_snapshot_attribute(unsigned int id, const char* name) const;
|
||||
|
||||
private:
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "Log.h"
|
||||
#include "NebulaLog.h"
|
||||
#include "NebulaUtil.h"
|
||||
#include "Quotas.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <set>
|
||||
@ -1534,8 +1535,11 @@ public:
|
||||
* called before actually deleting the snapshot.
|
||||
* @param disk_id of the disk
|
||||
* @param snap_id of the snapshot
|
||||
* @param type of quota used by this snapshot
|
||||
* @param quotas template with snapshot usage
|
||||
*/
|
||||
void delete_disk_snapshot(int disk_id, int snap_id);
|
||||
void delete_disk_snapshot(int disk_id, int snap_id, Quotas::QuotaType& type,
|
||||
Template **quotas);
|
||||
|
||||
/**
|
||||
* Get information about the disk to take the snapshot from
|
||||
|
@ -1722,6 +1722,9 @@ void LifeCycleManager::disk_snapshot_success(int vid)
|
||||
{
|
||||
string disk_id, tm_mad, ds_id, snap_id;
|
||||
|
||||
Quotas::QuotaType qt;
|
||||
Template *quotas = 0;
|
||||
|
||||
VirtualMachine * vm = vmpool->get(vid,true);
|
||||
|
||||
if ( vm == 0 )
|
||||
@ -1743,6 +1746,9 @@ void LifeCycleManager::disk_snapshot_success(int vid)
|
||||
int isnap_id = strtol(snap_id.c_str(),NULL,0);
|
||||
int idisk_id = strtol(disk_id.c_str(),NULL,0);
|
||||
|
||||
int uid = vm->get_uid();
|
||||
int gid = vm->get_gid();
|
||||
|
||||
switch (vm->get_lcm_state())
|
||||
{
|
||||
case VirtualMachine::DISK_SNAPSHOT_POWEROFF:
|
||||
@ -1753,7 +1759,7 @@ void LifeCycleManager::disk_snapshot_success(int vid)
|
||||
|
||||
case VirtualMachine::DISK_SNAPSHOT_DELETE_POWEROFF:
|
||||
vm->log("LCM", Log::INFO, "VM disk snapshot deleted.");
|
||||
vm->delete_disk_snapshot(idisk_id, isnap_id);
|
||||
vm->delete_disk_snapshot(idisk_id, isnap_id, qt, "as);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1770,6 +1776,13 @@ void LifeCycleManager::disk_snapshot_success(int vid)
|
||||
|
||||
vm->unlock();
|
||||
|
||||
if ( quotas != 0 )
|
||||
{
|
||||
Quotas::quota_del(qt, uid, gid, quotas);
|
||||
|
||||
delete quotas;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1780,6 +1793,9 @@ void LifeCycleManager::disk_snapshot_failure(int vid)
|
||||
{
|
||||
string disk_id, tm_mad, ds_id, snap_id;
|
||||
|
||||
Quotas::QuotaType qt;
|
||||
Template *quotas = 0;
|
||||
|
||||
VirtualMachine * vm = vmpool->get(vid,true);
|
||||
|
||||
if ( vm == 0 )
|
||||
@ -1801,11 +1817,14 @@ void LifeCycleManager::disk_snapshot_failure(int vid)
|
||||
int isnap_id = strtol(snap_id.c_str(),NULL,0);
|
||||
int idisk_id = strtol(disk_id.c_str(),NULL,0);
|
||||
|
||||
int uid = vm->get_uid();
|
||||
int gid = vm->get_gid();
|
||||
|
||||
switch (vm->get_lcm_state())
|
||||
{
|
||||
case VirtualMachine::DISK_SNAPSHOT_POWEROFF:
|
||||
vm->log("LCM", Log::ERROR, "Could not take disk snapshot.");
|
||||
vm->delete_disk_snapshot(idisk_id, isnap_id);
|
||||
vm->delete_disk_snapshot(idisk_id, isnap_id, qt, "as);
|
||||
break;
|
||||
|
||||
case VirtualMachine::DISK_SNAPSHOT_DELETE_POWEROFF:
|
||||
@ -1827,6 +1846,13 @@ void LifeCycleManager::disk_snapshot_failure(int vid)
|
||||
|
||||
vm->unlock();
|
||||
|
||||
if ( quotas != 0 )
|
||||
{
|
||||
Quotas::quota_del(qt, uid, gid, quotas);
|
||||
|
||||
delete quotas;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -271,9 +271,9 @@ const VectorAttribute * Snapshots::get_snapshot(unsigned int id) const
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
string Snapshots::get_snapshot_attribute(unsigned int id, const char * name)
|
||||
string Snapshots::get_snapshot_attribute(unsigned int id, const char * name) const
|
||||
{
|
||||
VectorAttribute * snapshot = get_snapshot(id);
|
||||
const VectorAttribute * snapshot = get_snapshot(id);
|
||||
|
||||
if (snapshot == 0)
|
||||
{
|
||||
@ -283,6 +283,22 @@ string Snapshots::get_snapshot_attribute(unsigned int id, const char * name)
|
||||
return snapshot->vector_value(name);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
unsigned int Snapshots::get_snapshot_size(unsigned int id) const
|
||||
{
|
||||
unsigned int snap_size = 0;
|
||||
|
||||
const VectorAttribute * snapshot = get_snapshot(id);
|
||||
|
||||
if (snapshot != 0)
|
||||
{
|
||||
snapshot->vector_value("SIZE", snap_size);
|
||||
}
|
||||
|
||||
return snap_size;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
|
@ -4289,12 +4289,17 @@ int VirtualMachine::revert_disk_snapshot(int did, int snap_id)
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void VirtualMachine::delete_disk_snapshot(int did, int snap_id)
|
||||
void VirtualMachine::delete_disk_snapshot(int did, int snap_id,
|
||||
Quotas::QuotaType& type, Template **quotas)
|
||||
{
|
||||
map<int, Snapshots *>::iterator it;
|
||||
VectorAttribute * disk = get_disk(did);
|
||||
unsigned int snap_size;
|
||||
|
||||
VectorAttribute * delta_disk;
|
||||
VectorAttribute * disk = get_disk(did);
|
||||
|
||||
*quotas = 0;
|
||||
|
||||
if ( disk == 0 )
|
||||
{
|
||||
return;
|
||||
@ -4307,6 +4312,8 @@ void VirtualMachine::delete_disk_snapshot(int did, int snap_id)
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int ssize = it->second->get_snapshot_size(snap_id);
|
||||
|
||||
it->second->delete_snapshot(snap_id);
|
||||
|
||||
snap_size = it->second->get_total_size();
|
||||
@ -4321,5 +4328,28 @@ void VirtualMachine::delete_disk_snapshot(int did, int snap_id)
|
||||
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if ( is_persistent(disk) )
|
||||
{
|
||||
*quotas = new Template();
|
||||
|
||||
(*quotas)->add("DATASTORE", disk->vector_value("DATASTORE_ID"));
|
||||
(*quotas)->add("SIZE", (long long) ssize);
|
||||
|
||||
type = Quotas::DATASTORE;
|
||||
}
|
||||
else
|
||||
{
|
||||
*quotas = new Template();
|
||||
|
||||
delta_disk = new VectorAttribute("DISK");
|
||||
delta_disk->replace("TYPE", "FS");
|
||||
delta_disk->replace("SIZE", ssize);
|
||||
|
||||
(*quotas)->add("VMS", 0);
|
||||
(*quotas)->set(delta_disk);
|
||||
|
||||
type = Quotas::VM;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user