/include/Image.h
https://github.com/swapniltamse/one · C Header · 395 lines · 168 code · 60 blank · 167 comment · 17 complexity · e35980904d44fa55f44b087eee61484f MD5 · raw file
- /* ------------------------------------------------------------------------ */
- /* Copyright 2002-2011, OpenNebula Project Leads (OpenNebula.org) */
- /* */
- /* Licensed under the Apache License, Version 2.0 (the "License"); you may */
- /* not use this file except in compliance with the License. You may obtain */
- /* a copy of the License at */
- /* */
- /* http://www.apache.org/licenses/LICENSE-2.0 */
- /* */
- /* Unless required by applicable law or agreed to in writing, software */
- /* distributed under the License is distributed on an "AS IS" BASIS, */
- /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
- /* See the License for the specific language governing permissions and */
- /* limitations under the License. */
- /* -------------------------------------------------------------------------*/
- #ifndef IMAGE_H_
- #define IMAGE_H_
- #include "PoolSQL.h"
- #include "ImageTemplate.h"
- #include "NebulaLog.h"
- using namespace std;
- /**
- * The Image class.
- */
- class Image : public PoolObjectSQL
- {
- public:
- /**
- * Type of Images
- */
- enum ImageType
- {
- OS = 0, /** < Base OS image */
- CDROM = 1, /** < An ISO9660 image */
- DATABLOCK = 2 /** < User persistent data device */
- };
- /**
- * Image State
- */
- enum ImageState
- {
- INIT = 0, /** < Initialization state */
- READY = 1, /** < Image ready to use */
- USED = 2, /** < Image in use */
- DISABLED = 3, /** < Image can not be instantiated by a VM */
- LOCKED = 4, /** < FS operation for the Image in process */
- ERROR = 5 /** < Error state the operation FAILED*/
- };
- // *************************************************************************
- // Image Public Methods
- // *************************************************************************
- /**
- * Function to print the Image object into a string in XML format
- * @param xml the resulting XML string
- * @return a reference to the generated string
- */
- string& to_xml(string& xml) const;
- /**
- * Rebuilds the object from an xml formatted string
- * @param xml_str The xml-formatted string
- *
- * @return 0 on success, -1 otherwise
- */
- int from_xml(const string &xml_str);
- /**
- * Returns true if the image is persistent
- * @return true if the image is persistent
- */
- bool isPersistent()
- {
- return (persistent_img == 1);
- };
- /**
- * Returns the source path of the image
- * @return source of image
- */
- const string& get_source()
- {
- return source;
- }
- /**
- * Sets the source path of the image
- */
- void set_source(const string& _source)
- {
- source = _source;
- }
- /**
- * Sets the size for the image
- */
- void set_size(unsigned int _size_mb)
- {
- size_mb = _size_mb;
- }
- /**
- * Returns the type of the image
- * @return type
- */
- ImageType get_type()
- {
- return type;
- }
- /**
- * Returns the image state
- * @return state of image
- */
- ImageState get_state()
- {
- return state;
- }
- /**
- * Sets the image state
- * @param state of image
- */
- void set_state(ImageState _state)
- {
- state = _state;
- }
- /**
- *
- */
- int dec_running ()
- {
- return --running_vms;
- }
- /**
- *
- */
- int inc_running()
- {
- return ++running_vms;
- }
- /**
- *
- */
- int get_running()
- {
- return running_vms;
- }
- /**
- * Set enum type
- * @return 0 on success, -1 otherwise
- */
- int set_type(const string& _type)
- {
- int rc = 0;
- if ( _type == "OS" )
- {
- type = OS;
- }
- else if ( _type == "CDROM" )
- {
- type = CDROM;
- }
- else if ( _type == "DATABLOCK" )
- {
- type = DATABLOCK;
- }
- else
- {
- rc = -1;
- }
- return rc;
- }
- /**
- * Publish or unpublish an image
- * @param pub true to publish the image
- * @return 0 on success
- */
- int publish(bool pub)
- {
- int rc = -1;
- if (pub == true)
- {
- if (!isPersistent())
- {
- public_obj = 1;
- rc = 0;
- }
- }
- else
- {
- public_obj = 0;
- rc = 0;
- }
- return rc;
- }
- /**
- * Set/Unset an image as persistent
- * @param persistent true to make an image persistent
- * @param error_str Returns the error reason, if any
- *
- * @return 0 on success
- */
- int persistent(bool persis, string& error_str)
- {
- if ( running_vms != 0 )
- {
- goto error_vms;
- }
- if (persis == true)
- {
- if ( isPublic() )
- {
- goto error_public;
- }
- persistent_img = 1;
- }
- else
- {
- persistent_img = 0;
- }
- return 0;
- error_vms:
- error_str = "Image cannot be in 'used' state.";
- goto error_common;
- error_public:
- error_str = "Image cannot be public and persistent.";
- goto error_common;
- error_common:
- return -1;
- }
- /**
- * Modifies the given disk attribute adding the following attributes:
- * * SOURCE: the file-path.
- * * BUS: will only be set if the Image's definition includes it.
- * * TARGET: the value set depends on:
- * - OS images will be mounted at prefix + a: hda, sda.
- * - Prefix + b is reserved for the contex cdrom.
- * - CDROM images will be at prefix + c: hdc, sdc.
- * - Several DATABLOCK images can be mounted, they will be set to
- * prefix + (d + index) : hdd, hde, hdf...
- * @param disk attribute for the VM template
- * @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
- */
- int disk_attribute(VectorAttribute * disk, int* index, ImageType* img_type);
- /**
- * Factory method for image templates
- */
- Template * get_new_template()
- {
- return new ImageTemplate;
- }
- private:
- // -------------------------------------------------------------------------
- // Friends
- // -------------------------------------------------------------------------
- friend class ImagePool;
- // -------------------------------------------------------------------------
- // Image Description
- // -------------------------------------------------------------------------
- /**
- * Type of the Image
- */
- ImageType type;
- /**
- * Persistency of the Image
- */
- int persistent_img;
- /**
- * Registration time
- */
- time_t regtime;
- /**
- * Path to the image
- */
- string source;
- /**
- * Size of the image in MB
- */
- unsigned int size_mb;
- /**
- * Image state
- */
- ImageState state;
- /**
- * Number of VMs using the image
- */
- int running_vms;
- // *************************************************************************
- // DataBase implementation (Private)
- // *************************************************************************
- /**
- * Execute an INSERT or REPLACE Sql query.
- * @param db The SQL DB
- * @param replace Execute an INSERT or a REPLACE
- * @return 0 on success
- */
- int insert_replace(SqlDB *db, bool replace);
- /**
- * Bootstraps the database table(s) associated to the Image
- */
- static void bootstrap(SqlDB * db)
- {
- ostringstream oss_image(Image::db_bootstrap);
- db->exec(oss_image);
- };
- /**
- * "Encrypts" the password with SHA1 digest
- * @param password
- * @return sha1 encrypted password
- */
- static string sha1_digest(const string& pass);
- protected:
- // *************************************************************************
- // Constructor
- // *************************************************************************
- Image(int uid,
- int gid,
- const string& uname,
- const string& gname,
- ImageTemplate* img_template);
- virtual ~Image();
- // *************************************************************************
- // DataBase implementation
- // *************************************************************************
- static const char * db_names;
- static const char * db_bootstrap;
- static const char * table;
- /**
- * Writes the Image in the database.
- * @param db pointer to the db
- * @return 0 on success
- */
- virtual int insert(SqlDB *db, string& error_str);
- /**
- * Writes/updates the Images data fields in the database.
- * @param db pointer to the db
- * @return 0 on success
- */
- virtual int update(SqlDB *db);
- };
- #endif /*IMAGE_H_*/