2015-12-01 18:09:31 +03:00
/* ------------------------------------------------------------------------ */
2022-04-07 20:49:58 +03:00
/* Copyright 2002-2022, OpenNebula Project, OpenNebula Systems */
2015-12-01 18:09:31 +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 MARKETPLACE_H_
# define MARKETPLACE_H_
# include "PoolSQL.h"
# include "ObjectCollection.h"
# include "MarketPlaceTemplate.h"
2016-02-09 18:33:13 +03:00
# include "MarketPlaceApp.h"
# include "ActionSet.h"
2015-12-01 18:09:31 +03:00
/**
* The MarketPlace class . It represents an abstract container for OpenNebula
* objects ( Image , VM Templates or Flows )
*/
2016-03-02 01:31:31 +03:00
class MarketPlace : public PoolObjectSQL
2015-12-01 18:09:31 +03:00
{
public :
2021-06-03 18:14:30 +03:00
enum MarketPlaceState
{
ENABLED = 0 , /**< Enabled */
DISABLED = 1 /**< Disabled */
} ;
/**
* Functions to convert to / from string the MarketPlace states
*/
static int str_to_state ( std : : string & st , MarketPlaceState & state )
{
one_util : : toupper ( st ) ;
state = ENABLED ;
if ( st = = " ENABLED " ) {
state = ENABLED ;
} else if ( st = = " DISABLED " ) {
state = DISABLED ;
}
else
{
return - 1 ;
}
return 0 ;
}
static std : : string state_to_str ( MarketPlaceState state )
{
std : : string st = " " ;
switch ( state )
{
case ENABLED :
st = " ENABLED " ;
break ;
case DISABLED :
st = " DISABLED " ;
break ;
}
return st ;
}
2020-09-10 10:08:29 +03:00
virtual ~ MarketPlace ( ) = default ;
2015-12-01 18:09:31 +03:00
/**
* Function to print the MarketPlace 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-01 18:09:31 +03:00
/**
* Rebuilds the object from an xml formatted string
* @ param xml_str The xml - formatted string
*
* @ return 0 on success , - 1 otherwise
*/
2020-07-02 23:42:10 +03:00
int from_xml ( const std : : string & xml_str ) override ;
2015-12-01 18:09:31 +03:00
/**
2015-12-06 01:52:28 +03:00
* Adds this marketplace app ' s ID to the set .
2015-12-01 18:09:31 +03:00
* @ param id of the app to be added to the MarketPlace
* @ return 0 on success
*/
2015-12-06 01:52:28 +03:00
int add_marketapp ( int id )
2015-12-01 18:09:31 +03:00
{
2016-03-02 01:31:31 +03:00
return marketapps . add ( id ) ;
2015-12-01 18:09:31 +03:00
} ;
/**
* Deletes this image ' s ID from the set .
* @ param id of the image to be deleted from the MarketPlace
* @ return 0 on success
*/
2015-12-06 01:52:28 +03:00
int del_marketapp ( int id )
2015-12-01 18:09:31 +03:00
{
2016-03-02 01:31:31 +03:00
return marketapps . del ( id ) ;
2015-12-01 18:09:31 +03:00
} ;
2021-06-03 18:14:30 +03:00
/**
* Deletes all apps images from the set .
*/
void clear_marketapps ( )
{
marketapps . clear ( ) ;
}
2015-12-01 18:09:31 +03:00
/**
* Returns a copy of the Image IDs set
*/
2020-07-05 23:01:32 +03:00
const std : : set < int > & get_marketapp_ids ( ) const
2015-12-01 18:09:31 +03:00
{
2020-07-05 23:01:32 +03:00
return marketapps . get_collection ( ) ;
2015-12-01 18:09:31 +03:00
}
/**
* Retrieves marketplace mad name
* @ return string mp mad name
*/
2020-07-02 23:42:10 +03:00
const std : : string & get_market_mad ( ) const
2015-12-01 18:09:31 +03:00
{
2015-12-06 01:52:28 +03:00
return market_mad ;
2015-12-01 18:09:31 +03:00
} ;
2016-03-08 18:38:51 +03:00
/**
* Get zone for this market
* @ return zone id
*/
int get_zone_id ( ) const
{
return zone_id ;
} ;
2015-12-01 18:09:31 +03:00
/**
* Set monitor information for the MarketPlace
2015-12-24 01:50:22 +03:00
* @ param data template with monitor information
2015-12-01 18:09:31 +03:00
*/
2015-12-24 01:50:22 +03:00
void update_monitor ( const Template & data ) ;
2015-12-01 18:09:31 +03:00
2016-02-09 18:33:13 +03:00
/**
* Check if action is supported for the apps
* @ param action
* @ return true if it is supported
*/
bool is_action_supported ( MarketPlaceApp : : Action action ) const
{
return supported_actions . is_set ( action ) ;
}
2016-03-22 17:26:21 +03:00
/**
* @ return true if this is a public ( external ) marketplace
*/
2016-02-29 20:19:52 +03:00
bool is_public ( ) const ;
2016-03-22 17:26:21 +03:00
/**
* Disbale de monitor action for this marketplace
* @ return true if the monitor was enabled
*/
bool disable_monitor ( )
{
bool enabled = supported_actions . is_set ( MarketPlaceApp : : MONITOR ) ;
supported_actions . clear ( MarketPlaceApp : : MONITOR ) ;
return enabled ;
}
/**
* Enable the monitor action
*/
void enable_monitor ( )
{
supported_actions . set ( MarketPlaceApp : : MONITOR ) ;
}
2021-06-03 18:14:30 +03:00
MarketPlaceState get_state ( ) const
{
return state ;
}
/**
* Enable or disable the MarketPlace
*/
void enable ( bool enabled )
{
if ( enabled )
{
state = ENABLED ;
}
else
{
state = DISABLED ;
}
}
2015-12-01 18:09:31 +03:00
private :
friend class MarketPlacePool ;
// *************************************************************************
// MarketPlace Attributes
// *************************************************************************
2021-06-03 18:14:30 +03:00
/**
* State of the marketplace
*/
MarketPlaceState state ;
2015-12-01 18:09:31 +03:00
/**
* Name of the marketplace driver used to import apps
*/
2020-07-02 23:42:10 +03:00
std : : string market_mad ;
2015-12-01 18:09:31 +03:00
/**
* Total capacity in MB
*/
2021-06-03 18:14:30 +03:00
long long total_mb ;
2015-12-01 18:09:31 +03:00
/**
* Available capacity in MB
*/
2021-06-03 18:14:30 +03:00
long long free_mb ;
2015-12-01 18:09:31 +03:00
/**
* Used capacity in MB
*/
2021-06-03 18:14:30 +03:00
long long used_mb ;
2015-12-01 18:09:31 +03:00
2016-03-08 18:38:51 +03:00
/**
* Zone where this market lives
*/
2021-06-03 18:14:30 +03:00
int zone_id ;
2016-03-08 18:38:51 +03:00
2016-02-09 18:33:13 +03:00
/**
* Supported actions on MarketPlaceApps
*/
ActionSet < MarketPlaceApp : : Action > supported_actions ;
2016-03-02 01:31:31 +03:00
/**
* Collection of MarketPlaceApps in this MarketPlace
*/
ObjectCollection marketapps ;
2015-12-01 18:09:31 +03:00
// *************************************************************************
// Constructor
// *************************************************************************
MarketPlace (
2015-12-06 01:52:28 +03:00
int uid ,
int gid ,
2020-07-02 23:42:10 +03:00
const std : : string & uname ,
const std : : string & gname ,
2015-12-06 01:52:28 +03:00
int umask ,
2020-09-15 12:16:00 +03:00
std : : unique_ptr < MarketPlaceTemplate > mp_template ) ;
2015-12-01 18:09:31 +03:00
// *************************************************************************
// DataBase implementation (Private)
// *************************************************************************
2016-03-08 18:38:51 +03:00
/**
* Builds the marketplace from the template . This function MUST be called
* with the template 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-01 18:09:31 +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
*/
2020-07-02 23:42:10 +03:00
int insert_replace ( SqlDB * db , bool replace , std : : string & error_str ) ;
2015-12-01 18:09:31 +03:00
/**
* 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-01 18:09:31 +03:00
/**
* Writes the MarketPlace in the database .
* @ param db pointer to the db
* @ return 0 on success
*/
2020-07-02 23:42:10 +03:00
int insert ( SqlDB * db , std : : string & error_str ) override ;
2015-12-01 18:09:31 +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-01 18:09:31 +03:00
{
2020-07-02 23:42:10 +03:00
std : : string error_str ;
2015-12-01 18:09:31 +03:00
return insert_replace ( db , true , error_str ) ;
}
2015-12-10 18:43:45 +03:00
/**
* Factory method for marketplace templates
*/
2020-09-15 12:16:00 +03:00
std : : unique_ptr < Template > get_new_template ( ) const override
2015-12-10 18:43:45 +03:00
{
2020-09-15 12:16:00 +03:00
return std : : make_unique < MarketPlaceTemplate > ( ) ;
2015-12-10 18:43:45 +03:00
}
2016-02-03 18:03:22 +03:00
/**
* Verify the proper definition of the Market by checking the
* attributes of the MARKET_MAD_CONF parameter
*/
2020-07-02 23:42:10 +03:00
int set_market_mad ( std : : string & tm_mad , std : : string & error_str ) ;
2016-02-03 18:03:22 +03:00
2015-12-01 18:09:31 +03:00
/**
* 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
*/
2020-07-02 23:42:10 +03:00
int post_update_template ( std : : string & error ) override ;
2015-12-01 18:09:31 +03:00
} ;
# endif /*MARKETPLACE_H*/
2015-12-06 01:52:28 +03:00