2015-12-10 18:43:45 +03:00
/* ------------------------------------------------------------------------ */
2020-04-30 16:00:02 +03:00
/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */
2015-12-10 18:43:45 +03:00
/* */
/* 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 MARKETPLACEAPP_H_
# define MARKETPLACEAPP_H_
# include "PoolSQL.h"
# include "ObjectCollection.h"
# include "MarketPlaceAppTemplate.h"
/**
* The MarketPlaceApp class . It represents an abstract application for
* OpenNebula objects ( Image , VM Templates or Flows )
*/
class MarketPlaceApp : public PoolObjectSQL
{
public :
2016-02-09 18:33:13 +03:00
/**
* MarketPlaceApp actions
*/
enum Action
{
NONE = 0 ,
CREATE = 1 ,
DELETE = 2 ,
MONITOR = 3
} ;
2020-07-02 23:42:10 +03:00
static int action_from_str ( std : : string & st , Action & action )
2016-02-09 18:33:13 +03:00
{
if ( st = = " create " )
{
action = CREATE ;
}
else if ( st = = " delete " )
{
action = DELETE ;
}
else if ( st = = " monitor " )
{
action = MONITOR ;
}
else
{
action = NONE ;
return - 1 ;
}
return 0 ;
} ;
2015-12-12 23:10:14 +03:00
/**
* MarketPlaceApp states
*/
2016-02-09 18:33:13 +03:00
enum State
2015-12-10 18:43:45 +03:00
{
INIT = 0 , /** < Initialization state */
READY = 1 , /** < Ready to use */
LOCKED = 2 , /** < Operation in process */
ERROR = 3 , /** < Error state the operation failed*/
2015-12-23 02:26:54 +03:00
DISABLED = 4
2015-12-10 18:43:45 +03:00
} ;
/**
* Returns the string representation of an MarketplaceApp State
* @ param state The state
* @ return the string representation
*/
2020-07-02 23:42:10 +03:00
static std : : string state_to_str ( State state )
2015-12-10 18:43:45 +03:00
{
2019-09-03 17:31:51 +03:00
switch ( state )
2015-12-10 18:43:45 +03:00
{
2015-12-23 02:26:54 +03:00
case INIT : return " INIT " ; break ;
case READY : return " READY " ; break ;
case LOCKED : return " LOCKED " ; break ;
case ERROR : return " ERROR " ; break ;
case DISABLED : return " DISABLED " ; break ;
2015-12-10 18:43:45 +03:00
default : return " " ;
}
} ;
2015-12-12 23:10:14 +03:00
/**
* MarketPlaceApp container types
*/
2016-02-09 18:33:13 +03:00
enum Type
2015-12-12 23:10:14 +03:00
{
2019-03-18 02:38:28 +03:00
UNKNOWN = 0 , /** < Unknown types */
2016-02-04 15:15:21 +03:00
IMAGE = 1 , /** < Image MarketPlace App*/
VMTEMPLATE = 2 , /** < VM Template MarketPlace App*/
SERVICE_TEMPLATE = 3 /** < Service Template MarketPlace App*/
2015-12-12 23:10:14 +03:00
} ;
/**
* Return the string representation of a MarketPlaceType
* @ param ob the type
* @ return the string
*/
2020-07-02 23:42:10 +03:00
static std : : string type_to_str ( Type ob )
2015-12-12 23:10:14 +03:00
{
switch ( ob )
{
2016-02-04 15:15:21 +03:00
case IMAGE : return " IMAGE " ; break ;
case VMTEMPLATE : return " VMTEMPLATE " ; break ;
case SERVICE_TEMPLATE : return " SERVICE_TEMPLATE " ; break ;
default : return " " ;
2015-12-12 23:10:14 +03:00
}
} ;
/**
* Return the string representation of a MarketPlaceType , By default it will
* return IMAGE_MP .
* @ param str_type string representing the type
* @ return the MarketPlaceType
*/
2020-07-02 23:42:10 +03:00
static Type str_to_type ( std : : string & str_type ) ;
2015-12-10 18:43:45 +03:00
2020-09-10 10:08:29 +03:00
virtual ~ MarketPlaceApp ( ) = default ;
2015-12-10 18:43:45 +03:00
/**
* Function to print the MarketPlaceApp object into a string in XML format
* @ param xml the resulting XML string
* @ return a reference to the generated string
*/
2020-07-02 23:42:10 +03:00
std : : string & to_xml ( std : : string & xml ) const override ;
2015-12-10 18:43:45 +03:00
/**
* Rebuilds the object from an xml formatted string
* @ param xml_str The xml - formatted string
*
* @ return 0 on success , - 1 otherwise
*/
2019-09-03 17:31:51 +03:00
int from_xml ( const std : : string & xml_str ) override ;
2015-12-10 18:43:45 +03:00
2015-12-28 03:08:33 +03:00
/**
* Rebuilds the object from base64 encoded template representation
* @ param str The template string , base64 encoded
* @ param error_str Returns the error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int from_template64 ( const std : : string & xml_str , std : : string & error_str ) ;
2016-01-26 22:24:33 +03:00
/**
* Copies the special attributes of the App to the template
* @ param tmp The template object
* @ param error_str Returns the error reason , if any
*/
2016-01-29 12:28:07 +03:00
void to_template ( Template * tmpl ) const ;
2016-01-26 22:24:33 +03:00
2015-12-23 02:26:54 +03:00
/**
* Enable or disable the app . A disabled app cannot be exported
* @ param enable true to enable
* @ param error_str Returns the error reason , if any
*
* @ return 0 on success
*/
2015-12-28 03:08:33 +03:00
int enable ( bool enable , std : : string & error_str ) ;
2015-12-23 02:26:54 +03:00
2015-12-11 17:53:19 +03:00
/**
* Returns the marketplace ID
*/
int get_market_id ( ) const
{
return market_id ;
} ;
/**
* Returns the marketplace name
*/
const std : : string & get_market_name ( ) const
{
return market_name ;
} ;
/**
* Updates the marketplace name
*/
void set_market_name ( const std : : string & name )
{
market_name = name ;
} ;
2015-12-12 23:10:14 +03:00
/**
* Returns the marketplace app type
* @ return marketplace app type
*/
2016-02-09 18:33:13 +03:00
Type get_type ( ) const
2015-12-12 23:10:14 +03:00
{
return type ;
} ;
2015-12-20 00:35:09 +03:00
/**
* Returns the ID of the object originating this app
* @ return the image , vmtemplate or flow id
*/
int get_origin_id ( ) const
{
return origin_id ;
} ;
2020-07-02 23:42:10 +03:00
const std : : string & get_source ( ) const
2015-12-21 15:23:22 +03:00
{
return source ;
}
2020-07-02 23:42:10 +03:00
const std : : string & get_md5 ( ) const
2016-01-27 01:19:31 +03:00
{
return md5 ;
}
2016-01-29 12:28:07 +03:00
long long get_size ( ) const
2016-01-27 01:19:31 +03:00
{
return size_mb ;
}
2020-07-02 23:42:10 +03:00
const std : : string & get_format ( ) const
2016-01-27 01:19:31 +03:00
{
return format ;
}
2016-02-09 18:33:13 +03:00
State get_state ( ) const
2015-12-21 15:23:22 +03:00
{
return state ;
}
2016-03-08 18:38:51 +03:00
int get_zone_id ( ) const
{
return zone_id ;
}
2015-12-15 02:49:36 +03:00
//--------------------------------------------------------------------------
// Set Marketplace app attributes
//--------------------------------------------------------------------------
2016-02-09 18:33:13 +03:00
void set_state ( State _state )
2015-12-15 02:49:36 +03:00
{
state = _state ;
} ;
void set_source ( const std : : string & _source )
{
source = _source ;
} ;
2015-12-21 19:08:42 +03:00
void set_md5 ( const std : : string & _md5 )
2015-12-15 02:49:36 +03:00
{
2015-12-21 19:08:42 +03:00
md5 = _md5 ;
2015-12-15 02:49:36 +03:00
} ;
void set_size ( long long _size_mb )
{
size_mb = _size_mb ;
} ;
2015-12-21 15:23:22 +03:00
void set_format ( const std : : string & _format )
{
format = _format ;
} ;
2015-12-10 18:43:45 +03:00
private :
friend class MarketPlaceAppPool ;
// *************************************************************************
// MarketPlaceApp Attributes
// *************************************************************************
/**
2015-12-11 17:53:19 +03:00
* Publishing date
2015-12-10 18:43:45 +03:00
*/
2016-02-09 18:46:20 +03:00
time_t regtime ;
2015-12-10 18:43:45 +03:00
/**
* Source URL for the marketplace app
*/
std : : string source ;
/**
* Source URL for the marketplace app
*/
2015-12-21 19:08:42 +03:00
std : : string md5 ;
2015-12-10 18:43:45 +03:00
/**
* Size of this app
*/
long long size_mb ;
/**
* Description of the App
*/
std : : string description ;
/**
* Version of the app
*/
std : : string version ;
2015-12-21 15:23:22 +03:00
/**
* format of the disk images
*/
std : : string format ;
2015-12-10 18:43:45 +03:00
/**
* App template to import it
*/
std : : string apptemplate64 ;
/**
* Marketplace ID that holds this app
*/
2015-12-11 17:53:19 +03:00
int market_id ;
2015-12-10 18:43:45 +03:00
/**
* Marketplace name
*/
2015-12-11 17:53:19 +03:00
std : : string market_name ;
2015-12-10 18:43:45 +03:00
/**
* Marketplace App state
*/
2016-02-09 18:33:13 +03:00
State state ;
2015-12-10 18:43:45 +03:00
2015-12-12 23:10:14 +03:00
/**
* The marketplace type
*/
2016-02-09 18:33:13 +03:00
Type type ;
2015-12-12 23:10:14 +03:00
2015-12-10 18:43:45 +03:00
/**
* Origin of this App
*/
2015-12-20 00:35:09 +03:00
int origin_id ;
2015-12-10 18:43:45 +03:00
2016-03-08 18:38:51 +03:00
/**
* ID of the zone where this app lives
*/
int zone_id ;
2015-12-10 18:43:45 +03:00
// *************************************************************************
// Constructor
// *************************************************************************
MarketPlaceApp (
int uid ,
int gid ,
const std : : string & uname ,
const std : : string & gname ,
int umask ,
2020-09-15 12:16:00 +03:00
std : : unique_ptr < MarketPlaceAppTemplate > app_template ) ;
2015-12-10 18:43:45 +03:00
// *************************************************************************
// DataBase implementation (Private)
// *************************************************************************
2016-03-08 18:38:51 +03:00
/**
* Builds the market app from the template . This function MUST be called
* with apptemplate initialized
* @ param error_str describing the error
* @ return 0 on success ;
*/
2020-07-02 23:42:10 +03:00
int parse_template ( std : : string & error_str ) ;
2016-03-08 18:38:51 +03:00
2015-12-10 18:43:45 +03:00
/**
* Execute an INSERT or REPLACE Sql query .
* @ param db The SQL DB
* @ param replace Execute an INSERT or a REPLACE
* @ param error_str Returns the error reason , if any
* @ return 0 one success
*/
int insert_replace ( SqlDB * db , bool replace , std : : string & error_str ) ;
/**
* Bootstraps the database table ( s ) associated to the MarketPlace
* @ return 0 on success
*/
2020-06-29 13:14:00 +03:00
static int bootstrap ( SqlDB * db ) ;
2015-12-10 18:43:45 +03:00
/**
* Writes the MarketPlace in the database .
* @ param db pointer to the db
* @ return 0 on success
*/
2019-09-03 17:31:51 +03:00
int insert ( SqlDB * db , std : : string & error_str ) override ;
2015-12-10 18:43:45 +03:00
/**
* Writes / updates the MarketPlace ' s data fields in the database .
* @ param db pointer to the db
* @ return 0 on success
*/
2019-09-03 17:31:51 +03:00
int update ( SqlDB * db ) override
2015-12-10 18:43:45 +03:00
{
std : : string error_str ;
return insert_replace ( db , true , error_str ) ;
}
/**
* Child classes can process the new template set with replace_template or
* append_template with this method
* @ param error string describing the error if any
* @ return 0 on success
*/
2019-09-03 17:31:51 +03:00
int post_update_template ( std : : string & error ) override ;
2015-12-11 17:53:19 +03:00
/**
* Factory method for marketplace app templates
*/
2020-09-15 12:16:00 +03:00
std : : unique_ptr < Template > get_new_template ( ) const override
2015-12-11 17:53:19 +03:00
{
2020-09-15 12:16:00 +03:00
return std : : make_unique < MarketPlaceAppTemplate > ( ) ;
2015-12-11 17:53:19 +03:00
}
2015-12-10 18:43:45 +03:00
} ;
# endif /*MARKETPLACEAPP_H*/