add servermodel.updated

This commit is contained in:
Emmanuel Garette 2020-02-24 20:16:49 +01:00
parent 4c775c21e4
commit 3ace1dfae5
10 changed files with 106 additions and 213 deletions

View File

@ -80,7 +80,7 @@ S=xxxxxxxxxxxxxxxxxxxxxx
./script/cucchiaiata session.servermodel.stop -s $S -a ./script/cucchiaiata session.servermodel.stop -s $S -a
## unbound ## unbound
./script/cucchiaiata servermodel.create -n unbound -d "generic unbound configuration" -p eolebase -s eole -r last ./script/cucchiaiata servermodel.create -n unbound -d "generic unbound configuration" -s eole -r last
./script/cucchiaiata session.servermodel.start -s unbound ./script/cucchiaiata session.servermodel.start -s unbound
S=xxxxxxxxxxxxxxxxxxxxxx S=xxxxxxxxxxxxxxxxxxxxxx
./script/cucchiaiata session.servermodel.configure -s $S --creole.serveur_dns.unbound_local_zones cadoles.com ./script/cucchiaiata session.servermodel.configure -s $S --creole.serveur_dns.unbound_local_zones cadoles.com
@ -109,17 +109,8 @@ S=xxxxxxxxxxxxxxxxxxxxxx
./script/cucchiaiata session.server.stop -s $S -a ./script/cucchiaiata session.server.stop -s $S -a
# Generate configuration # Generate configuration
./script/cucchiaiata config.configuration.server.deploy -s test
./script/cucchiaiata template.generate -s test ./script/cucchiaiata template.generate -s test
# OpenSSH # OpenSSH
#add servermodel openssh link to eolebase ./script/cucchiaiata applicationservice.dependency.add -n local_aca -a openssh -s eole -r last
#add servermodel openssh2 lint to openssh
#link openssh applicationservice to this servermodel
./script/cucchiaiata servermodel.create -n openssh_1 -d description -p eolebase -s eole -r last
./script/cucchiaiata servermodel.create -n openssh_2 -d openssh_2 -p openssh_1 -s internal -r last
./script/cucchiaiata applicationservice.dependency.add -n local_openssh_1 -a openssh -s eole -r last
#./script/cucchiaiata server.create -s test -d description -m eolebase -r last

View File

@ -1,17 +0,0 @@
---
uri: config.configuration.server.deploy
description: Déployer la configuration d'un serveur.
pattern: rpc
parameters:
server_name:
type: String
ref: Server.ServerName
shortarg: s
description: Nom du serveur.
response:
type: Deploy
description: La configuration du serveur est déployée.

View File

@ -10,11 +10,8 @@ parameters:
server_name: server_name:
type: String type: String
ref: Server.ServerName ref: Server.ServerName
shortarg: s
description: Nom du serveur. description: Nom du serveur.
deployed:
type: Boolean
description: Configuration de type déployée.
default: true
response: response:
type: ConfigConfiguration type: ConfigConfiguration

View File

@ -1,21 +0,0 @@
---
uri: config.configuration.server.updated
description: |
Une configuration de serveur a été mise à jour.
pattern: event
parameters:
server_id:
type: Number
description: |
Identifiant du serveur.
server_name:
type: String
ref: Server.ServerName
shortarg: s
description: Nom du serveur.
deployed:
type: Boolean
description: Configuration de type déployée.

View File

@ -21,6 +21,7 @@ parameters:
ref: Servermodel.ServermodelName ref: Servermodel.ServermodelName
shortarg: p shortarg: p
description: Nom des modèles de serveur parents auquels rattacher le nouveau modèle. description: Nom des modèles de serveur parents auquels rattacher le nouveau modèle.
default: null
servermodel_parents_source_name: servermodel_parents_source_name:
type: String type: String
shortarg: s shortarg: s

View File

@ -89,10 +89,9 @@ class Risotto(Controller):
as_descr['applicationservice_id'], as_descr['applicationservice_id'],
dependency_descr['applicationservice_id']): dependency_descr['applicationservice_id']):
raise Exception(_(f'{applicationservice_name} has already a dependency to {applicationservice_dependency}')) raise Exception(_(f'{applicationservice_name} has already a dependency to {applicationservice_dependency}'))
else: await self.insert_dependency(risotto_context,
await self.insert_dependency(risotto_context, as_descr['applicationservice_id'],
as_descr['applicationservice_id'], [dependency_descr['applicationservice_id']])
[dependency_descr['applicationservice_id']])
await self.publish('v1.applicationservice.updated', await self.publish('v1.applicationservice.updated',
risotto_context, risotto_context,
**as_descr) **as_descr)

View File

@ -5,7 +5,7 @@ from os.path import isdir, isfile, join
from traceback import print_exc from traceback import print_exc
from typing import Dict, List from typing import Dict, List
from tiramisu import Storage, delete_session, MetaConfig, MixConfig from tiramisu import Storage, MixConfig
from rougail import load as rougail_load from rougail import load as rougail_load
from rougail.config import dtdfilename from rougail.config import dtdfilename
@ -89,10 +89,10 @@ class Risotto(Controller):
with open(cache_file) as fileio: with open(cache_file) as fileio:
xmlroot = parse(fileio).getroot() xmlroot = parse(fileio).getroot()
try: try:
self.servermodel[servermodel_id] = await self.build_metaconfig(servermodel_id, self.servermodel[servermodel_id] = await self.build_mixconfig(servermodel_id,
servermodel_name, servermodel_name,
xmlroot, xmlroot,
funcs_file) funcs_file)
except Exception as err: except Exception as err:
if get_config().get('global').get('debug'): if get_config().get('global').get('debug'):
print_exc() print_exc()
@ -101,12 +101,12 @@ class Risotto(Controller):
None, None,
msg) msg)
async def build_metaconfig(self, async def build_mixconfig(self,
servermodel_id: int, servermodel_id: int,
servermodel_name: str, servermodel_name: str,
xmlroot: str, xmlroot: str,
funcs_file: str) -> MetaConfig: funcs_file: str) -> MixConfig:
""" Build metaconfig for a servermodel """ Build mixconfig for a servermodel
""" """
# build tiramisu's session ID # build tiramisu's session ID
session_id = f'v_{servermodel_id}' session_id = f'v_{servermodel_id}'
@ -114,37 +114,31 @@ class Risotto(Controller):
dtdfilename, dtdfilename,
funcs_file) funcs_file)
# build servermodel metaconfig (v_xxx.m_v_xxx) # build servermodel mixconfig (v_xxx)
metaconfig = await MetaConfig([],
optiondescription=optiondescription,
session_id=session_id,
storage=self.save_storage)
mixconfig = await MixConfig(children=[], mixconfig = await MixConfig(children=[],
optiondescription=optiondescription, optiondescription=optiondescription,
session_id='m_' + session_id, session_id=session_id,
storage=self.save_storage) storage=self.save_storage)
await metaconfig.config.add(mixconfig)
# change default rights # change default rights
ro_origin = await metaconfig.property.getdefault('read_only', 'append') ro_origin = await mixconfig.property.getdefault('read_only', 'append')
ro_append = frozenset(ro_origin - {'force_store_value'}) ro_append = frozenset(ro_origin - {'force_store_value'})
rw_origin = await metaconfig.property.getdefault('read_write', 'append') rw_origin = await mixconfig.property.getdefault('read_write', 'append')
rw_append = frozenset(rw_origin - {'force_store_value'}) rw_append = frozenset(rw_origin - {'force_store_value'})
await metaconfig.property.setdefault(ro_append, 'read_only', 'append') await mixconfig.property.setdefault(ro_append, 'read_only', 'append')
await metaconfig.property.setdefault(rw_append, 'read_write', 'append') await mixconfig.property.setdefault(rw_append, 'read_write', 'append')
await metaconfig.property.read_only() await mixconfig.property.read_only()
await metaconfig.permissive.add('basic') await mixconfig.permissive.add('basic')
await metaconfig.permissive.add('normal') await mixconfig.permissive.add('normal')
await metaconfig.permissive.add('expert') await mixconfig.permissive.add('expert')
# set informtion and owner # set informtion and owner
await metaconfig.owner.set('v_{}'.format(servermodel_name)) await mixconfig.owner.set('v_{}'.format(servermodel_name))
await metaconfig.information.set('servermodel_id', servermodel_id) await mixconfig.information.set('servermodel_id', servermodel_id)
await metaconfig.information.set('servermodel_name', servermodel_name) await mixconfig.information.set('servermodel_name', servermodel_name)
# return configuration # return configuration
return metaconfig return mixconfig
async def servermodel_legacy(self, async def servermodel_legacy(self,
risotto_context: Context, risotto_context: Context,
@ -169,9 +163,9 @@ class Risotto(Controller):
msg) msg)
# do link # do link
mix = await servermodel_parent.config.get('m_v_' + str(servermodel_parent_id)) # mix = await servermodel_parent.config.get('m_v_' + str(servermodel_parent_id))
try: try:
await mix.config.add(self.servermodel[servermodel_id]) await servermodel_parent.config.add(self.servermodel[servermodel_id])
except Exception as err: except Exception as err:
await log.error_msg(risotto_context, await log.error_msg(risotto_context,
None, None,
@ -190,6 +184,8 @@ class Risotto(Controller):
# loads servers # loads servers
for server in servers: for server in servers:
try: try:
if server['server_id'] in self.server:
return
await self.load_server(risotto_context, await self.load_server(risotto_context,
server['server_id'], server['server_id'],
server['server_name'], server['server_name'],
@ -211,8 +207,6 @@ class Risotto(Controller):
server_servermodel_id: int) -> None: server_servermodel_id: int) -> None:
""" Loads a server """ Loads a server
""" """
if server_id in self.server:
return
await log.info_msg(risotto_context, await log.info_msg(risotto_context,
None, None,
f'Load server {server_name} ({server_id})') f'Load server {server_name} ({server_id})')
@ -226,29 +220,25 @@ class Risotto(Controller):
# check if server was already created # check if server was already created
session_id = f's_{server_id}' session_id = f's_{server_id}'
# get the servermodel's metaconfig # get the servermodel's mixconfig
metaconfig = self.servermodel[server_servermodel_id] mixconfig = self.servermodel[server_servermodel_id]
# create server configuration and server 'to deploy' configuration and store it # create server configuration and store it
self.server[server_id] = {'server': await self.build_config(session_id, self.server[server_id] = {'server': await self.build_config(session_id,
server_id, server_id,
server_name, server_name,
metaconfig), mixconfig),
'server_to_deploy': await self.build_config(f'std_{server_id}',
server_id,
server_name,
metaconfig),
'funcs_file': self.get_funcs_filename(server_servermodel_id)} 'funcs_file': self.get_funcs_filename(server_servermodel_id)}
async def build_config(self, async def build_config(self,
session_id: str, session_id: str,
server_id: int, server_id: int,
server_name: str, server_name: str,
metaconfig: MetaConfig) -> None: mixconfig: MixConfig) -> None:
""" build server's config """ build server's config
""" """
config = await metaconfig.config.new(session_id, config = await mixconfig.config.new(session_id,
storage=self.save_storage) storage=self.save_storage)
await config.information.set('server_id', server_id) await config.information.set('server_id', server_id)
await config.information.set('server_name', server_name) await config.information.set('server_name', server_name)
await config.owner.set(server_name) await config.owner.set(server_name)
@ -263,6 +253,8 @@ class Risotto(Controller):
server_servermodel_id: int) -> None: server_servermodel_id: int) -> None:
""" Loads server's configuration when a new server is created """ Loads server's configuration when a new server is created
""" """
if server_id in self.server:
return
await self.load_server(risotto_context, await self.load_server(risotto_context,
server_id, server_id,
server_name, server_name,
@ -272,13 +264,11 @@ class Risotto(Controller):
async def server_deleted(self, async def server_deleted(self,
server_id: int) -> None: server_id: int) -> None:
# delete config to it's parents # delete config to it's parents
for server_type in ['server', 'server_to_deploy']: config = self.server[server_id]['server']
config = self.server[server_id]['server'] for parent in await config.config.parents():
for parent in await config.config.parents(): await parent.config.pop(await config.session.id())
await parent.config.pop(await config.config.name()) await config.session.reset()
delete_session(storage=self.save_storage, # delete mixconfig
session_id=await config.config.name())
# delete metaconfig
del self.server[server_id] del self.server[server_id]
@register('v1.servermodel.created') @register('v1.servermodel.created')
@ -311,68 +301,53 @@ class Risotto(Controller):
servermodelparentid) servermodelparentid)
async def servermodel_delete(self, async def servermodel_delete(self,
servermodel_id: int) -> List[MetaConfig]: servermodel_id: int) -> List[MixConfig]:
metaconfig = self.servermodel.pop(servermodel_id) mixconfig = self.servermodel.pop(servermodel_id)
mixconfig = await metaconfig.config.list()[0]
children = [] children = []
for child in await mixconfig.config.list(): for child in await mixconfig.config.list():
children.append(child) children.append(child)
await mixconfig.config.pop(await child.config.name()) await mixconfig.config.pop(await child.session.id())
await metaconfig.config.pop(await mixconfig.config.name()) for parent in await mixconfig.config.parents():
delete_session(storage=self.save_storage, await parent.config.pop(await mixconfig.session.id())
session_id=await mixconfig.config.name()) await mixconfig.session.reset()
del mixconfig
for parent in await metaconfig.config.parents():
await parent.config.pop(await metaconfig.config.name())
delete_session(storage=self.save_storage,
session_id=await metaconfig.config.name())
return children return children
#
# @register('v1.servermodel.updated') @register('v1.servermodel.updated')
# async def servermodel_updated(self, async def servermodel_updated(self,
# risotto_context: Context, risotto_context: Context,
# servermodel_id: int, servermodel_id: int,
# servermodel_name: str, servermodel_name: str,
# servermodel_parents_id: List[int]) -> None: servermodel_parents_id: List[int]) -> None:
# log.info_msg(risotto_context, await log.info_msg(risotto_context,
# None, None,
# f'Reload servermodel {servermodel_name} ({servermodel_id})') f'Reload servermodel {servermodel_name} ({servermodel_id})')
# # unlink cache to force download new aggregated file # store all informations
# cache_file = join(self.cache_root_path, str(servermodel_id)+".xml") if servermodel_id in self.servermodel:
# if isfile(cache_file): children = await self.servermodel_delete(servermodel_id)
# unlink(cache_file) else:
# children = []
# # store all informations
# if servermodel_id in self.servermodel: # create new one
# old_values = await self.servermodel[servermodel_id].value.exportation() await self.load_and_link_servermodel(risotto_context,
# old_permissives = await self.servermodel[servermodel_id].permissive.exportation() servermodel_id,
# old_properties = await self.servermodel[servermodel_id].property.exportation() servermodel_name,
# children = await self.servermodel_delete(servermodel_id) servermodel_parents_id)
# else: # recreate link to children
# old_values = None for child in children:
# if await child.config.type() == 'config':
# # create new one server_id = await child.information.get('server_id')
# await self.load_and_link_servermodel(risotto_context, server_name = await child.information.get('server_name')
# servermodel_id, await self.load_server(risotto_context,
# servermodel_name, server_id,
# servermodel_parents_id) server_name,
# servermodel_id)
# # migrates informations else:
# if old_values is not None: await self.servermodel[servermodel_id].config.add(child)
# await self.servermodel[servermodel_id].value.importation(old_values)
# await self.servermodel[servermodel_id].permissive.importation(old_permissives)
# await self.servermodel[servermodel_id].property.importation(old_properties)
# for child in children:
# await self.servermodel_legacy(risotto_context,
# await child.information.get('servermodel_name'),
# await child.information.get('servermodel_id'),
# servermodel_id)
@register('v1.config.configuration.server.get') @register('v1.config.configuration.server.get')
async def get_configuration(self, async def get_configuration(self,
risotto_context: Context, risotto_context: Context,
server_name: str, server_name: str) -> dict:
deployed: bool) -> bytes:
server = await self.call('v1.server.describe', server = await self.call('v1.server.describe',
risotto_context, risotto_context,
server_name=server_name) server_name=server_name)
@ -384,57 +359,17 @@ class Risotto(Controller):
msg) msg)
raise CallError(msg) raise CallError(msg)
if deployed: server = self.server[server_id]['server']
server = self.server[server_id]['server']
else:
server = self.server[server_id]['server_to_deploy']
await server.property.read_only() await server.property.read_only()
try: try:
configuration = await server.value.dict(fullpath=True, configuration = await server.value.dict(fullpath=True,
leader_to_list=True) leader_to_list=True)
except: except:
if deployed: msg = _(f'No configuration available for server {server_id}')
msg = _(f'No configuration available for server {server_id}')
else:
msg = _(f'No undeployed configuration available for server {server_id}')
await log.error_msg(risotto_context, await log.error_msg(risotto_context,
None, None,
msg) msg)
raise CallError(msg) raise CallError(msg)
return {'server_name': server_name, return {'server_name': server_name,
'deployed': deployed,
'configuration': configuration} 'configuration': configuration}
@register('v1.config.configuration.server.deploy', 'v1.config.configuration.server.updated')
async def deploy_configuration(self,
risotto_context: Context,
server_name: str) -> Dict:
"""Copy values, permissions, permissives from config 'to deploy' to active config
"""
server = await self.call('v1.server.describe',
risotto_context,
server_name=server_name)
server_id = server['server_id']
# FIXME is server_to_deploy working?
config = self.server[server_id]['server']
config_std = self.server[server_id]['server_to_deploy']
# when deploy, calculate force_store_value
ro = await config_std.property.getdefault('read_only', 'append')
if 'force_store_value' not in ro:
ro = frozenset(list(ro) + ['force_store_value'])
await config_std.property.setdefault(ro, 'read_only', 'append')
rw = await config_std.property.getdefault('read_write', 'append')
rw = frozenset(list(rw) + ['force_store_value'])
await config_std.property.setdefault(rw, 'read_write', 'append')
await config_std.property.add('force_store_value')
# copy informations from server 'to deploy' configuration to server configuration
await config.value.importation(await config_std.value.exportation())
await config.permissive.importation(await config_std.permissive.exportation())
await config.property.importation(await config_std.property.exportation())
return {'server_id': server_id,
'server_name': server_name,
'deployed': True}

View File

@ -183,7 +183,9 @@ class Risotto(Generator):
if not servermodel_parent and parent is not None: if not servermodel_parent and parent is not None:
servermodel_parent = [await self._servermodel_describe(risotto_context, servermodel_parent = [await self._servermodel_describe(risotto_context,
parent, parent,
release_id)] release_id,
source_name,
release_distribution)]
# link application service with this servermodel # link application service with this servermodel
dependencies = [] dependencies = []
for depend in servermodels[new_servermodel]['applicationservices']: for depend in servermodels[new_servermodel]['applicationservices']:
@ -237,12 +239,16 @@ class Risotto(Generator):
release_distribution=release_distribution) release_distribution=release_distribution)
return await self._servermodel_describe(risotto_context, return await self._servermodel_describe(risotto_context,
servermodel_name, servermodel_name,
release['release_id']) release['release_id'],
source_name,
release_distribution)
async def _servermodel_describe(self, async def _servermodel_describe(self,
risotto_context, risotto_context,
servermodel_name, servermodel_name,
release_id): release_id,
source_name,
release_distribution):
sql = ''' sql = '''
SELECT ServermodelId as servermodel_id, ServermodelName as servermodel_name, ServermodelDescription as servermodel_description, ServermodelParentsId as servermodel_parents_id, ServermodelReleaseId as release_id, ServermodelApplicationServiceId as servermodel_applicationservice_id SELECT ServermodelId as servermodel_id, ServermodelName as servermodel_name, ServermodelDescription as servermodel_description, ServermodelParentsId as servermodel_parents_id, ServermodelReleaseId as release_id, ServermodelApplicationServiceId as servermodel_applicationservice_id
FROM Servermodel FROM Servermodel
@ -272,7 +278,9 @@ class Risotto(Generator):
for servermodel_parent_name in servermodel_parents_name: for servermodel_parent_name in servermodel_parents_name:
servermodel_parents.append(await self._servermodel_describe(risotto_context, servermodel_parents.append(await self._servermodel_describe(risotto_context,
servermodel_parent_name, servermodel_parent_name,
release_id)) release_id,
servermodel_parents_source_name,
servermodel_parents_release_distribution))
return await self._servermodel_create(risotto_context, return await self._servermodel_create(risotto_context,
servermodel_name, servermodel_name,
servermodel_description, servermodel_description,

View File

@ -79,7 +79,7 @@ class Risotto(Controller):
if not server or server['server_id'] not in config_module.server: if not server or server['server_id'] not in config_module.server:
raise Exception(_(f'cannot find server with name {server_name}')) raise Exception(_(f'cannot find server with name {server_name}'))
id = server['server_id'] id = server['server_id']
config = config_module.server[id]['server_to_deploy'] config = config_module.server[id]['server']
storage = self.get_storage('server') storage = self.get_storage('server')
@ -287,7 +287,7 @@ class Risotto(Controller):
id_ = session['id'] id_ = session['id']
config_module = dispatcher.get_service('config') config_module = dispatcher.get_service('config')
if type == 'server': if type == 'server':
config = config_module.server[id_]['server_to_deploy'] config = config_module.server[id_]['server']
else: else:
config = config_module.servermodel[id_] config = config_module.servermodel[id_]
if save: if save:

View File

@ -124,7 +124,7 @@ class Storage(object):
class StorageServer(Storage): class StorageServer(Storage):
def get_config_name(self, def get_config_name(self,
server_id: int): server_id: int):
return f'std_{server_id}' return f's_{server_id}'
async def set_owner(self, async def set_owner(self,
config: Config, config: Config,