// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef DEPLOYMENT_CONFIGURATION_H
#define DEPLOYMENT_CONFIGURATION_H
//-----------------------------------------------------------------------------
// include
//-----------------------------------------------------------------------------
// nel
#include "nel/misc/types_nl.h"
#include "nel/misc/common.h"
#include "nel/misc/sstring.h"
//-----------------------------------------------------------------------------
// namespace DEPCFG
//-----------------------------------------------------------------------------
namespace DEPCFG
{
//-----------------------------------------------------------------------------
// some handy constants
//-----------------------------------------------------------------------------
#define defaultDeploymentConfigurationFileName "server_park_database.txt"
//-----------------------------------------------------------------------------
// some handy typedefs for identifiers, map keys, etc
//-----------------------------------------------------------------------------
typedef NLMISC::CSString TDomainName;
typedef NLMISC::CSString TShardName;
typedef NLMISC::CSString THostName;
typedef NLMISC::CSString TAppName;
typedef NLMISC::CVectorSString TDomainNames;
typedef NLMISC::CVectorSString TShardNames;
typedef NLMISC::CVectorSString THostNames;
typedef NLMISC::CVectorSString TAppNames;
typedef NLMISC::CSString TCmdLine;
typedef NLMISC::CSString TCfgFile;
typedef NLMISC::CVectorSString TDataPacks;
//-----------------------------------------------------------------------------
// struct SDomainDescription
//-----------------------------------------------------------------------------
struct SDomainDescription
{
//-------------------------------------------------------------------------
// identifying the domain
TDomainName DomainName;
//-------------------------------------------------------------------------
// the set of shards and apps belonging to this domain and their hosts
TShardNames Shards;
THostNames Hosts;
TAppNames Apps;
//-------------------------------------------------------------------------
// a handy 'clear()' method
void clear()
{
DomainName.clear();
Shards.clear();
Hosts.clear();
Apps.clear();
}
};
//-----------------------------------------------------------------------------
// struct SShardDescription
//-----------------------------------------------------------------------------
struct SShardDescription
{
//-------------------------------------------------------------------------
// identifying the shard by name and domain
TDomainName DomainName;
TShardName ShardName;
//-------------------------------------------------------------------------
// the set of hosts and apps used by this shard
THostNames Hosts;
TAppNames Apps;
//-------------------------------------------------------------------------
// a handy 'clear()' method
void clear()
{
DomainName.clear();
ShardName.clear();
Hosts.clear();
Apps.clear();
}
};
//-----------------------------------------------------------------------------
// struct SHostDescription
//-----------------------------------------------------------------------------
struct SHostDescription
{
//-------------------------------------------------------------------------
// identifying the host (machine's network name)
THostName HostName;
//-------------------------------------------------------------------------
// the set of domains that refference this host
TDomainNames Domains;
//-------------------------------------------------------------------------
// a handy 'clear()' method
void clear()
{
HostName.clear();
Domains.clear();
}
};
//-----------------------------------------------------------------------------
// struct SAppDescription
//-----------------------------------------------------------------------------
struct SAppDescription
{
//-------------------------------------------------------------------------
// identifying the app, the shard it belongs to, machine it runs on, etc
TDomainName DomainName;
TShardName ShardName;
THostName HostName;
TAppName AppName;
NLMISC::CSString StartOrder;
//-------------------------------------------------------------------------
// some real data
TCmdLine CmdLine; // the command line to execute the app
TCfgFile CfgFile; // the cfg file contents for the app
TDataPacks DataPacks; // the set of data packs for the app
//-------------------------------------------------------------------------
// a handy 'clear()' method
void clear()
{
DomainName.clear();
ShardName.clear();
HostName.clear();
AppName.clear();
StartOrder.clear();
CmdLine.clear();
CfgFile.clear();
DataPacks.clear();
}
};
//-----------------------------------------------------------------------------
// class CDeploymentConfiguration
//-----------------------------------------------------------------------------
class CDeploymentConfiguration
{
public :
//-------------------------------------------------------------------------
// this is a singleton so we have a getInstance() method
// remaining methods are pure virtuals...
// get hold of the instance of the singleton that derives from CDeploymentConfiguration
static CDeploymentConfiguration& getInstance();
//-------------------------------------------------------------------------
// methods for reading / serialising deployment configuration
// read the deployment configuration from a specified file
//
// file format is line base with the following format:
// '//'... comment to end of line
// 'define' // define a new block
// 'domain' // flag this block as a domain and give it a name
// 'shard' // flag this block as a shard and give it a name
// 'use' // add a child block to this block
// 'name' // set the unique name to use for the executables derived from this block
// 'cmdLine' // setup the command line to use for exes derived from this block
// 'host' // assign the exes derived from this block to a given host
// 'cfg' // add a line to be included in the cfg file of executables derived from this block
// 'cfgAfter' // as above but cfg lines appended at end of cfg file (not at start)
// 'data' // add dependency on a given data block to exes derived from this block
//
virtual bool read(const NLMISC::CSString& fileName) =0;
// write the info blocks out to a file (in no particular order)
// the output file can be re-read via the 'read()' method
virtual void write(const NLMISC::CSString& fileName) =0;
// serialise the deployment configuration, for dispatch to / reception from other apps
virtual void serial(NLMISC::IStream& stream) =0;
//-------------------------------------------------------------------------
// read accessors - getting sets of names
// get the complete set of hosts (machines on which we have apps running)
virtual void getHostNames(THostNames& result) const =0;
// get the complete set of domains
virtual void getDomainNames(TDomainNames& result) const =0;
// get the shards for a given domain
virtual void getShardNames(const TDomainName& domainName,TShardNames& result) const =0;
// get the apps for a given host and domain
virtual void getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const =0;
// get the apps for a given host, domain and shard
virtual void getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const =0;
//-------------------------------------------------------------------------
// read accessors - getting info structure for a named object
// get a named host
virtual void getHost(const THostName& hostName,SHostDescription& result) const =0;
// get a named domains
virtual void getDomain(const TDomainName& domainName, SDomainDescription& result) const =0;
// get a named shard for a given domain
virtual void getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const =0;
// get a named app for a given domain
virtual void getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const =0;
//-------------------------------------------------------------------------
// methods for dumping info to a given log
// dump raw information (organised by info block, not by domain or host)
virtual void dumpInfoBlocks(NLMISC::CLog& log) const =0;
// dump info organised by domain
virtual void dumpDomains(NLMISC::CLog& log) const =0;
};
} // end of namespace
//-----------------------------------------------------------------------------
#endif