Compare commits

...

26 Commits

Author SHA1 Message Date
14f4bbf234 Merge branch 'develop' into dist/risotto/risotto-2.8.0/develop 2021-04-02 09:22:20 +02:00
6dcb5b3bf4 remove scripts in setup.py 2021-04-02 09:22:09 +02:00
1b5dab9406 script => scripts 2021-04-02 09:21:37 +02:00
43de83cce7 add cucciaiata-import 2021-04-02 09:16:53 +02:00
aacdd094f3 Merge branch 'develop' into dist/risotto/risotto-2.8.0/develop 2021-03-27 22:17:45 +01:00
3d5d831a8c add namespace when query configuration 2021-03-27 22:17:39 +01:00
00017de13c update config 2020-11-16 08:12:02 +01:00
c3e90fe0b2 Merge branch 'develop' into dist/risotto/risotto-2.8.0/develop 2020-11-14 08:18:32 +01:00
03809f041c zone/cluster in infra 2020-11-14 08:18:24 +01:00
2aa6115491 Merge branch 'develop' into dist/risotto/risotto-2.8.0/develop 2020-10-14 18:32:16 +02:00
a768d43d9f add email to user 2020-10-14 18:32:09 +02:00
f59edb386f simplifying 2020-09-20 21:10:18 +02:00
c88b4ddfb1 update source directory 2020-09-19 10:34:36 +02:00
4133c90b19 Merge branch 'develop' into dist/risotto/risotto-2.8.0/develop 2020-09-16 08:16:03 +02:00
cf42a3a25a update provisioning_example.sh file 2020-09-16 08:04:56 +02:00
fe0e160940 simplification du fichier de provisioning 2020-09-02 09:03:34 +02:00
ee37254fa6 utiliser des uri et non des messages depuis le client 2020-09-02 09:03:18 +02:00
36391b4f7a update dependencies 2020-08-12 14:06:56 +02:00
6b1e90e7a4 add debian/cucchiaiata.install file 2020-08-12 12:23:51 +02:00
756b5baa32 cucchiaiata => python3-cucchiaiata 2020-08-12 12:14:45 +02:00
5bef815c43 Merge branch 'develop' into dist/risotto/risotto-2.7.1/develop 2020-08-12 08:36:58 +02:00
39206076f1 update provisioning_example.sh file 2020-08-12 08:24:10 +02:00
29f71266b3 Merge branch 'master' into develop 2020-08-05 09:42:13 +02:00
5403d45632 Delete changelog 2020-07-29 09:40:15 +02:00
d42b88fa2f Add packaging file in packaging branch 2020-07-29 09:39:58 +02:00
4d81d4f5dd Do not include packaging file in code branch 2020-07-29 09:39:12 +02:00
12 changed files with 520 additions and 172 deletions

5
debian/changelog vendored
View File

@ -1,5 +0,0 @@
cucchiaiata (0.1) unstable; urgency=low
* first version
-- Cadoles <contact@cadoles.com> Tue, 07 Apr 2020 15:25:29 +0200

10
debian/control vendored
View File

@ -2,13 +2,19 @@ Source: cucchiaiata
Section: admin Section: admin
Priority: extra Priority: extra
Maintainer: Cadoles <contact@cadoles.com> Maintainer: Cadoles <contact@cadoles.com>
Build-depends: debhelper (>=11), python3-all, python3-setuptools Build-depends: debhelper (>=11), python3-all, python3-setuptools, dh-python
Standards-Version: 3.9.4 Standards-Version: 3.9.4
Homepage: https://forge.cadoles.com/Infra/risotto Homepage: https://forge.cadoles.com/Infra/risotto
Package: python3-cucchiaiata
Architecture: any
Pre-Depends: dpkg, python3, ${misc:Pre-Depends}
Depends: ${python:Depends}, ${misc:Depends}, python3-tiramisu-api, python3-tiramisu-cmdline-parser
Description: configuration manager cli
Package: cucchiaiata Package: cucchiaiata
Architecture: any Architecture: any
Pre-Depends: dpkg, python3, ${misc:Pre-Depends} Pre-Depends: dpkg, python3, ${misc:Pre-Depends}
Depends: ${python:Depends}, ${misc:Depends} Depends: ${python:Depends}, ${misc:Depends}, python3-cucchiaiata
Description: configuration manager cli Description: configuration manager cli

1
debian/cucchiaiata.install vendored Normal file
View File

@ -0,0 +1 @@
scripts/* usr/bin/

82
provisioning.yaml Executable file
View File

@ -0,0 +1,82 @@
zones:
- name: internet
settings:
configuration:
network: 192.168.1.0/24
host_start: 192.168.1.10
host_stop: 192.168.1.100
dns: [192.168.1.2]
gateway: 192.168.1.254
clusters:
- name: cluster.cadoles.com
zone: internet
settings:
configuration:
network:
virtual_ip: 192.168.1.1
nodes:
- name: node1.cadoles.com
zones: [internet]
servermodels:
- name: unbound
applicationservices: [unbound]
settings:
configuration:
serveur_dns:
unbound_local_zones: cadoles.com
unbound_allowed_client_cidr: 192.168.1.0/24
reseau:
unbound_route_address: 192.168.1.254
unbound:
unbound_zone_cadoles_com:
hostname_cadoles_com:
hostname_cadoles_com:
- toto
- titi
ip_cadoles_com:
- index: 0
value: 192.168.1.25
type_cadoles_com:
- index: 1
value: CNAME
cname_cadoles_com:
- index: 1
value: toto.cadoles.com
- name: aca
applicationservices: [openssh-server]
settings:
configuration:
serveur_ssh:
ssh_allow_networks: admin.cadoles.com
children:
- name: etb1
children:
- name: unbound_etab1
other_parents: [unbound]
settings:
configuration:
reseau:
unbound_domain_name: dns.cadoles.com
organizations:
- name: cadoles.com
sites:
- name: etab1
zones: [internet]
servers:
- name: dns.cadoles.com
cluster: cluster.cadoles.com
zones: [internet]
servermodel: unbound_etab1
settings:
configuration:
reseau:
unbound_ip_address_cidr: 192.168.1.2/24
opennebula:
cpu: 0.2
vcpu: 2
memory: 2
- name: etab2
zones: [internet]

View File

@ -1,135 +1,157 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# + = = = = = = = = = = = = = = = = = = = = = = = = = = = +
# " SITE cluster "
# " +---------------------+ "
# " | NEBULACLUSTER | "
# " | cluster.cadoles.com | "
# " +---------------------+ "
# " | "
# " +-------------------+ "
# " | NODE | "-----------+
# " | node1.cadoles.com | " |
# " +-------------------+ " |
# " | " +~~~~~~~~+
# + = = = = = = = = = = = = = | = = = = = = = = = = = = = + ! ZONE !
# | ! pedago !
# + = = = = = = = = = = = = = | = = = = = = = = = = = = = + +~~~~~~~~+
# " SITE etab1 | " |
# " +-----------------+ " |
# " | VM DNS | "-----------+
# " | dns.cadoles.com | "
# " +-----------------+ "
# " "
# + = = = = = = = = = = = = = = = = = = = = = = = = = = = +
#
set -xe set -xe
verif() { function get_id() {
i=0 S=$($1)
argv=("$@") V=$(echo $S|jq -r .session_id)
for V in creole.reseau.unbound_route_address creole.reseau.unbound_domain_name creole.serveur_dns.unbound_local_zones creole.reseau.unbound_ip_address_cidr; do if [ $? = 0 ]; then
i=$((i+1)) echo $V
R=$(cucchiaiata-cli setting.session.$1.get -s $S -n $V | jq -Mcr .content[]) else
[ "$R" = "${argv[i]}" ] echo $S
done exit 1
fi
} }
# Import EOLE #=======================================================================================================
cucchiaiata-cli setting.source.create -o cadoles -u http://localhost # Infrastructure
cucchiaiata-cli setting.source.release.create -o cadoles -r 2020.1.1 -e last #=======================================================================================================
cucchiaiata-cli setting.applicationservice.dataset.updated -o cadoles -e last
cucchiaiata-cli setting.servermodel.dataset.updated -o cadoles -e last
# Create a new user and set role 'server_rw' for this server # Create a new user and set role 'server_rw' for the server dns.cadoles.com
cucchiaiata-cli user.user.create -u gnunux -n gnunux -s gnunux cucchiaiata-cli v1.user.user.create --login gnunux \
cucchiaiata-cli user.role.create -u gnunux -o 'server_rw' -a 'Server.ServerName' -v dns.cadoles.com --name gnunux \
--surname gnunux \
--email egarette@cadoles.com
cucchiaiata-cli v1.user.role.create --user_login gnunux \
--role_name 'server_rw' \
--role_attribute 'Server.ServerName' \
--role_attribute_value dns.cadoles.com
# A servermodel for node in cluster # Zone
cucchiaiata-cli setting.servermodel.create -m cluster -d "Node in the cluster" -p base -o cadoles -e last # +~~~~~~~~~~+
# ! ZONE !
# ! internet !
# +~~~~~~~~~~+
cucchiaiata-cli v1.infra.zone.create --zone_name internet
# zone configuration
S=$(get_id "cucchiaiata-cli v1.setting.session.zone.start --zone_name internet")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.network "192.168.1.0/24" \
--configuration.host_start "192.168.1.10" \
--configuration.host_stop "192.168.1.100" \
--configuration.dns 192.168.1.2 \
--configuration.gateway 192.168.1.254
cucchiaiata-cli v1.setting.session.validate --session_id $S
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
# Heritage
## ACA
cucchiaiata-cli setting.servermodel.create -m aca -d Aca -p base -o cadoles -e last
cucchiaiata-cli setting.servermodel.dependency.add -m aca -a unbound -o cadoles -e last
S=$(cucchiaiata-cli setting.session.servermodel.start -m aca -e last| jq -r .session_id)
verif servermodel null null [] null
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.reseau.unbound_route_address 192.168.1.2
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.serveur_dns.unbound_allowed_client_cidr 192.168.1.0/24
verif servermodel 192.168.1.2 null [] null
cucchiaiata-cli setting.session.servermodel.stop -s $S -a
## etab1 # Create the cluster cluster.cadoles.com
cucchiaiata-cli setting.servermodel.create -m etab1 -d "Etab 1" -p aca -o internal -e last # +---------------------------+
S=$(cucchiaiata-cli setting.session.servermodel.start -m etab1 -e last| jq -r .session_id) # | cluster.cadoles.com | +~~~~~~~~~~+
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.reseau.unbound_domain_name dns.cadoles.com # | +--------------------+ |-------! ZONE !
verif servermodel 192.168.1.2 dns.cadoles.com [] null # | | node1.cadoles.com |---|-------! internet !
cucchiaiata-cli setting.session.servermodel.stop -s $S -a # | +--------------------+ | +~~~~~~~~~~+
# +---------------------------+
cucchiaiata-cli v1.infra.cluster.create --cluster_name cluster.cadoles.com \
--zone_name internet
cucchiaiata-cli v1.infra.cluster.node.create --node_name node1.cadoles.com \
--cluster_name cluster.cadoles.com \
--zones_name internet
## unbound # configuration
cucchiaiata-cli setting.servermodel.create -m unbound -d "generic unbound configuration" -p fedora-31 -o cadoles -e last S=$(get_id "cucchiaiata-cli v1.setting.session.cluster.start --cluster_name cluster.cadoles.com")
cucchiaiata-cli setting.servermodel.dependency.add -m unbound -a unbound -o cadoles -e last cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.network.virtual_ip "192.168.1.1"
S=$(cucchiaiata-cli setting.session.servermodel.start -m unbound -e last| jq -r .session_id) cucchiaiata-cli v1.setting.session.validate --session_id $S
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.serveur_dns.unbound_local_zones cadoles.com cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
cucchiaiata-cli setting.session.servermodel.filter -s $S -n unbound
cucchiaiata-cli setting.session.servermodel.configure -s $S --unbound.unbound_zone_cadoles_com.hostname_cadoles_com.hostname_cadoles_com toto titi
cucchiaiata-cli setting.session.servermodel.configure -s $S --unbound.unbound_zone_cadoles_com.hostname_cadoles_com.ip_cadoles_com 0 192.168.1.25
cucchiaiata-cli setting.session.servermodel.configure -s $S --unbound.unbound_zone_cadoles_com.hostname_cadoles_com.type_cadoles_com 1 CNAME
cucchiaiata-cli setting.session.servermodel.configure -s $S --unbound.unbound_zone_cadoles_com.hostname_cadoles_com.cname_cadoles_com 1 toto.cadoles.com
cucchiaiata-cli setting.session.servermodel.filter -s $S -n creole
verif servermodel null null '["cadoles.com"]' null
cucchiaiata-cli setting.session.servermodel.stop -s $S -a
## unbound_etab1 # Organization, sites and zone
cucchiaiata-cli setting.servermodel.create -m unbound_etab1 -d "unbound configuration for etab1" -p etab1 unbound -o internal -e last # + = = = = = = = = = = = = = = = = = = = = +
S=$(cucchiaiata-cli setting.session.servermodel.start -m unbound_etab1 -e last | jq -r .session_id) # " ORGANISATION cadoles.com "
verif servermodel 192.168.1.2 dns.cadoles.com '["cadoles.com"]' null # " + = = = = = = = = = = = + "
# " " SITE etab1 "----"----+ +~~~~~~~~~~+
# " + = = = = = = = = = = = + " |___! ZONE !
# " + = = = = = = = = = = = + " | ! internet !
# " " SITE etab2 "----"----+ +~~~~~~~~~~+
# " + = = = = = = = = = = = + "
# + = = = = = = = = = = = = = = = = = = = = +
cucchiaiata-cli v1.infra.organization.create --organization_name cadoles.com
cucchiaiata-cli v1.infra.site.create --site_name etab1 \
--organization_name cadoles.com \
--zones_name internet
cucchiaiata-cli v1.infra.site.create --site_name etab2 \
--organization_name cadoles.com \
--zones_name internet
# Create a site, a zone and servers # Servermodels
cucchiaiata-cli infra.site.create -i etab1 -d "Etab 1" # -> base-fedora-32 (Cadoles)
cucchiaiata-cli infra.site.create -i cluster -d "Cluster" # '-> unbound (Cadoles)
cucchiaiata-cli infra.zone.create -z pedago -d "Pedago" -s etab1 cluster -n "192.168.1.0/24" -t "192.168.1.10" -e "192.168.1.100" -q 192.168.1.1 -g 192.168.1.254 # '-> unbound (servermodel) ----,
# |
# -> openssh-server (Cadoles) |--> unbound_etab1 (servermodel)
# '-> aca (servermodel) |
# '-> etab1 (servermodel) ------'
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name unbound --applicationservices_name unbound
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name aca --applicationservices_name openssh-server
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name etab1 --parents_name aca
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name unbound_etab1 --parents_name etab1 unbound
cucchiaiata-cli infra.server.create -s node1.cadoles.com -d node1 -m cluster -e last -i cluster -z pedago # configuration
cucchiaiata-cli infra.server.create -s dns.cadoles.com -d description -m unbound_etab1 -e last -i etab1 -z pedago
# Create a cluster with one node and one VM # Servermodel ACA
cucchiaiata-cli provider.factory.cluster.create -c cluster.cadoles.com -d toto -v 192.168.1.1 -z pedago S=$(get_id "cucchiaiata-cli v1.setting.session.servermodel.start --servermodel_name aca")
cucchiaiata-cli provider.factory.cluster.join -c cluster.cadoles.com -n node1.cadoles.com cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.serveur_ssh.ssh_allow_networks admin.cadoles.com
cucchiaiata-cli provider.factory.server.add -s dns.cadoles.com -c cluster.cadoles.com -p 0.2 -v 2 -m 2 cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
# Configure server # Servermodel unbound
S=$(cucchiaiata-cli setting.session.server.start -s dns.cadoles.com | jq -r .session_id) S=$(get_id "cucchiaiata-cli v1.setting.session.servermodel.start --servermodel_name unbound")
cucchiaiata-cli setting.session.server.configure -s $S --creole.reseau.unbound_ip_address_cidr 192.168.1.1/24 cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.serveur_dns.unbound_local_zones cadoles.com \
cucchiaiata-cli setting.session.server.validate -s $S --configuration.reseau.unbound_route_address 192.168.1.254 \
verif server 192.168.1.2 dns.cadoles.com '["cadoles.com"]' 192.168.1.1/24 --configuration.serveur_dns.unbound_allowed_client_cidr 192.168.1.0/24
cucchiaiata-cli setting.session.server.stop -s $S -a cucchiaiata-cli v1.setting.session.filter --session_id "$S" --namespace unbound
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --unbound.unbound_zone_cadoles_com.hostname_cadoles_com.hostname_cadoles_com toto titi \
--unbound.unbound_zone_cadoles_com.hostname_cadoles_com.ip_cadoles_com 0 192.168.1.25 \
--unbound.unbound_zone_cadoles_com.hostname_cadoles_com.type_cadoles_com 1 CNAME \
--unbound.unbound_zone_cadoles_com.hostname_cadoles_com.cname_cadoles_com 1 toto.cadoles.com
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
# Servermodel unbound_etab1
S=$(get_id "cucchiaiata-cli v1.setting.session.servermodel.start --servermodel_name unbound_etab1")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.reseau.unbound_domain_name dns.cadoles.com
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
# Server
# + = = = = = = = = = = = = = = = = = = = = = = = +
# " SITE etab1 +-------------------+ " +~~~~~~~~~~+
# " | dns.cadoles.com |----"------! ZONE !
# " +-------------------+ " ! internet !
# " " +~~~~~~~~~~+
# + = = = = = = = = = = = = = = = = = = = = = = = +
# -> unbound_etab1
# '-> dns.cadoles.com (server)
cucchiaiata-cli v1.infra.server.create --server_name dns.cadoles.com \
--site_name etab1 \
--cluster_name cluster.cadoles.com \
--zones_name internet \
--servermodel_name unbound_etab1
# configuration
sleep 1
S=$(get_id "cucchiaiata-cli v1.setting.session.server.start --server dns.cadoles.com")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.reseau.unbound_ip_address_cidr 192.168.1.2/24
cucchiaiata-cli v1.setting.session.filter --session_id "$S" --namespace opennebula
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --opennebula.cpu 0.2 \
--opennebula.vcpu 2 \
--opennebula.memory 2
cucchiaiata-cli v1.setting.session.validate --session_id $S
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
#=======================================================================================================
# Deploy
#=======================================================================================================
# Generate configuration # Generate configuration
cucchiaiata-cli setting.config.configuration.server.deploy -s dns.cadoles.com cucchiaiata-cli v1.setting.config.configuration.server.deploy --server_name dns.cadoles.com
cucchiaiata-cli setting.template.generate -s dns.cadoles.com cucchiaiata-cli v1.setting.template.generate --server_name dns.cadoles.com
# Add OpenSSH dependency
cucchiaiata-cli setting.servermodel.dependency.add -m aca -a openssh -o cadoles -e last
S=$(cucchiaiata-cli setting.session.server.start -s dns.cadoles.com | jq -r .session_id)
R=$(cucchiaiata-cli setting.session.server.get -s $S -n creole.serveur_ssh.ssh_allow_networks | jq -Mcr .content[])
[ "$R" = "[]" ]
cucchiaiata-cli setting.session.server.stop -s $S
S=$(cucchiaiata-cli setting.session.servermodel.start -m aca -e last| jq -r .session_id)
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.serveur_ssh.ssh_allow_networks admin.cadoles.com
cucchiaiata-cli setting.session.servermodel.stop -s $S -a
S=$(cucchiaiata-cli setting.session.server.start -s dns.cadoles.com | jq -r .session_id)
R=$(cucchiaiata-cli setting.session.server.get -s $S -n creole.serveur_ssh.ssh_allow_networks | jq -Mcr .content[])
[ "$R" = '["admin.cadoles.com"]' ]
cucchiaiata-cli setting.session.server.stop -s $S
# Regenerate configuration
cucchiaiata-cli setting.config.configuration.server.deploy -s dns.cadoles.com
cucchiaiata-cli setting.template.generate -s dns.cadoles.com
# Generate cluster's configurtion # Generate cluster's configurtion
cucchiaiata-cli provider.factory.configure -c cluster.cadoles.com #cucchiaiata-cli v1.provider.configure -c cluster.cadoles.com
#cucchiaiata-cli v1.provider.deploy --server dns.cadoles.com
echo "fin" echo "fin"

View File

@ -10,13 +10,14 @@ from cucchiaiata.i18n import _
def main(): def main():
try: try:
if len(argv) > 2 and argv[1] in ['setting.session.server.configure', if len(argv) > 2 and argv[1] == 'v1.setting.session.configure':
'setting.session.servermodel.configure']:
Configuration().get() Configuration().get()
else: else:
parser = Parser() parser = Parser()
print(dumps(parser.get(), print(dumps(parser.get(),
indent=config.indent)) indent=config.indent))
except KeyboardInterrupt:
pass
except Exception as err: except Exception as err:
if config.debug: if config.debug:
print_exc() print_exc()
@ -25,7 +26,4 @@ def main():
if __name__ == "__main__": if __name__ == "__main__":
try: main()
main()
except KeyboardInterrupt:
pass

218
scripts/cucchiaiata-import Executable file
View File

@ -0,0 +1,218 @@
#!/usr/bin/python3
"""Zephir-cmd-input script
"""
from sys import exit, argv
from yaml import load, SafeLoader, YAMLError
from time import sleep
from os.path import isfile
from cucchiaiata import Configuration
from cucchiaiata.common import Common
from cucchiaiata.i18n import _
class Import(Common):
def __init__(self,
config_file: str,
) -> None:
super().__init__()
with open(config_file, 'r') as stream:
try:
self.config = load(stream,
Loader=SafeLoader,
)
except YAMLError as err:
raise Exception(_('unable to lead the YAML file {}').format(err))
self.remote_config = self.remote_json_to_config(self.cucchiaiata_config.remote_url)
def parse_zones(self) -> None:
for zone in self.config.get('zones', []):
self.configuration('infra',
'zone',
zone,
)
def parse_clusters(self) -> None:
for cluster in self.config.get('clusters', []):
self.configuration('infra',
'cluster',
cluster,
zone_name=cluster['zone'],
)
for node in cluster.get('nodes', []):
self.configuration('infra',
'cluster.node',
node,
cluster_name=cluster['name'],
zones_name=node['zones'],
)
def parse_servermodels(self) -> None:
for servermodel in self.config.get('servermodels', []):
self.add_servermodel(servermodel)
def parse_organizations(self) -> None:
for organization in self.config.get('organizations', []):
self.configuration('infra',
'organization',
organization,
)
for site in organization.get('sites', []):
self.configuration('infra',
'site',
site,
organization_name=organization['name'],
zones_name=site['zones'],
)
for server in site.get('servers', []):
self.configuration('infra',
'server',
server,
site_name=site['name'],
cluster_name=server['cluster'],
zones_name=server['zones'],
servermodel_name=server['servermodel'],
)
self.send('v1.setting.config.configuration.server.deploy',
server_name=server['name'],
)
self.send('v1.setting.template.generate',
server_name=server['name'],
)
def configuration(self,
domain: str,
element: str,
dico: dict,
**kwargs,
) -> None:
self.upset_element(domain,
element,
dico['name'],
kwargs,
)
if 'settings' in dico:
#FIXME
sleep(1)
self.apply_settings(element,
dico,
)
def apply_settings(self,
element: str,
dico: dict,
) -> None:
session_id = self.send(f'v1.setting.session.{element}.start',
**{f'{element}_name': dico['name']},
)['session_id']
config = Configuration()
config.message = 'v1.setting.session.configure'
config.session_id = session_id
tiramisu = None
tiramisu_namespace = None
for key, value in self.settings_paths(dico['settings']):
current_namespace = key.split('.', 1)[0]
if tiramisu_namespace != current_namespace:
if tiramisu is not None:
self.send_configuration(tiramisu,
session_id,
)
tiramisu_namespace = current_namespace
self.send('v1.setting.session.filter',
session_id=session_id,
namespace=tiramisu_namespace,
)
tiramisu = config.configure_server()
try:
if tiramisu.option(key).option.isfollower():
for val in value:
tiramisu.option(key, val['index']).value.set(val['value'])
else:
if tiramisu.option(key).option.ismulti() and \
not isinstance(value, list):
value = [value]
tiramisu.option(key).value.set(value)
except ValueError as err:
print(_(f'error when setting "{domain}" "{dico["name"]}": "{key}" with value "{value}": {err}'))
exit(1)
except Exception as err:
print(_(f'unexpected error when setting "{domain}" "{dico["name"]}": "{key}" with value "{value}": {err}'))
exit(1)
self.send_configuration(tiramisu,
session_id,
)
self.send('v1.setting.session.stop',
session_id=session_id,
save=True,
)
def upset_element(self,
domain: str,
element: str,
name: str,
kwargs: dict,
) -> None:
message_name = element
if '.' in message_name:
message_name = message_name.rsplit('.', 1)[-1]
try:
self.send(f'v1.{domain}.{element}.describe',
**{f'{message_name}_name': name},
)
except:
# not exists
print(f'add "{element}" "{name}"')
kwargs[f'{message_name}_name'] = name
self.send(f'v1.{domain}.{element}.create',
**kwargs,
)
def settings_paths(self,
dico: dict,
subpath: str=None,
) -> list:
ret = []
for key, value in dico.items():
if subpath:
key_path = f'{subpath}.{key}'
else:
key_path = key
if isinstance(value, dict):
ret.extend(self.settings_paths(value, key_path))
else:
ret.append((key_path, value))
return ret
def add_servermodel(self,
servermodel: dict,
parents: list=[],
) -> None:
if 'other_parents' in servermodel:
parents = parents.copy()
parents.extend(servermodel['other_parents'])
self.configuration('setting',
'servermodel',
servermodel,
parents_name=parents,
applicationservices_name=servermodel.get('applicationservices', []),
)
if 'children' in servermodel:
child_parents = parents.copy()
child_parents.append(servermodel['name'])
for child in servermodel['children']:
self.add_servermodel(child,
child_parents,
)
if __name__ == "__main__":
if len(argv) != 2 or not isfile(argv[1]):
print(_(f'usage: {argv[0]} filename.yaml'))
exit(1)
imp = Import(argv[1])
imp.parse_zones()
imp.parse_clusters()
imp.parse_servermodels()
imp.parse_organizations()

View File

@ -4,6 +4,5 @@ setup(
name='cucchiaiata', name='cucchiaiata',
version='0.1', version='0.1',
packages=['cucchiaiata' ], packages=['cucchiaiata' ],
scripts=['script/cucchiaiata-cli'],
package_dir={"": "src"}, package_dir={"": "src"},
) )

View File

@ -32,26 +32,68 @@ class Common:
return err return err
def remote_json_to_config(self, def remote_json_to_config(self,
url=None, url,
config_type=Config): config_type=Config,
):
"retrieves the remote config from the distant api description" "retrieves the remote config from the distant api description"
if url is None:
url = self.cucchiaiata_config.remote_url
token = self.get_token() token = self.get_token()
headers = {'Authorization':'Bearer {}'.format(token)} headers = {'Authorization':'Bearer {}'.format(token)}
req = get(url, req = get(url,
headers=headers, headers=headers,
verify=config.allow_insecure_https) verify=config.allow_insecure_https,
)
code = req.status_code code = req.status_code
if code != 200: if code != 200:
raise Exception(self.get_error_from_http(req)) raise Exception(self.get_error_from_http(req))
json = req.json() json = req.json()
return config_type(json) return config_type(json)
def get_payload(self,
message: str):
# remove symlinkoption and default value from payload
payload = {}
for option in self.remote_config.option(message).list():
if not option.owner.isdefault() and not option.option.issymlinkoption():
payload[option.option.name()] = option.value.get()
return payload
def send_data(message: str, def send(self,
payload: Dict): message: str,
final_url = '{}/{}'.format(config.remote_url, message) **kwargs,
) -> None:
self.remote_config.option('message').value.set(message)
for key, value in kwargs.items():
self.remote_config.option(f'{message}.{key}').value.set(value)
payload = self.get_payload(message)
return send_data(message,
payload,
)
def send_configuration(self,
tiramisu: 'ConfigAPI',
session_id: str,
) -> None:
tiramisu.send()
try:
self.send('v1.setting.session.validate',
session_id=session_id,
)
except Exception as err:
self.send('v1.setting.session.stop',
session_id=session_id,
)
print(_(f'error when validate setting to "{name}" "{dico["name"]}": {err}'))
exit(1)
def send_data(uri: str,
payload: Dict,
):
version, message = uri.split('.', 1)
final_url = '{}/{}/{}'.format(config.remote_url,
version,
message,
)
ret = post(final_url, ret = post(final_url,
data=dumps(payload), data=dumps(payload),
verify=config.allow_insecure_https) verify=config.allow_insecure_https)

View File

@ -11,11 +11,7 @@ class Config:
if not isfile(config_file): if not isfile(config_file):
print(_('Attention, there is no configuration file')) print(_('Attention, there is no configuration file'))
url = input(_('Address to Risotto server: ')) url = input(_('Address to Risotto server: '))
version = input(_('Risotto API\'s version (default: "v1"): ')) yaml_template = f'url: {url}'
if not version:
version = "v1"
yaml_template = f"""url: {url}
version: {version}"""
with open(config_file, 'w') as fh: with open(config_file, 'w') as fh:
fh.write(yaml_template) fh.write(yaml_template)
@ -28,9 +24,8 @@ version: {version}"""
raise Exception(_('Error when creating the config file {}').format(err)) raise Exception(_('Error when creating the config file {}').format(err))
self.url = config['url'] self.url = config['url']
self.version = config['version']
self.debug = config.get('debug', False) self.debug = config.get('debug', False)
self.remote_url = 'http://{}/api/{}'.format(self.url, self.version) self.remote_url = f'http://{self.url}/api'
self.token_file = join(expanduser("~"), '.zephir-client.jwt.token') self.token_file = join(expanduser("~"), '.zephir-client.jwt.token')
self.indent = config.get('indent', 2) self.indent = config.get('indent', 2)
self.allow_insecure_https = config.get('allow_insecure_https', False) self.allow_insecure_https = config.get('allow_insecure_https', False)

View File

@ -3,9 +3,9 @@ from sys import argv, exit
from tiramisu_cmdline_parser import TiramisuCmdlineParser from tiramisu_cmdline_parser import TiramisuCmdlineParser
from tiramisu_api import Config from tiramisu_api import Config
from cucchiaiata.i18n import _
from .i18n import _
from .parser import Parser
from .common import send_data, Common from .common import send_data, Common
@ -25,15 +25,14 @@ class ConfigAPI(Config):
class Configuration(Common): class Configuration(Common):
def configure_server(self): def configure_server(self):
if self.message == 'setting.session.server.configure': version = self.message.split('.', 1)[0]
type = 'server' url = '{}/{}/setting/{}'.format(self.cucchiaiata_config.remote_url,
else: version,
type = 'servermodel' self.session_id,
url = '{}/setting/{}/{}'.format(self.cucchiaiata_config.remote_url, )
type,
self.session_id)
tconfig = self.remote_json_to_config(url, tconfig = self.remote_json_to_config(url,
ConfigAPI) ConfigAPI,
)
tconfig.message = self.message tconfig.message = self.message
tconfig.session_id = self.session_id tconfig.session_id = self.session_id
return tconfig return tconfig
@ -52,14 +51,9 @@ class Configuration(Common):
index = parameters.index('-s') index = parameters.index('-s')
except ValueError: except ValueError:
try: try:
index = parameters.index('--sessionid') index = parameters.index('--session_id')
except ValueError: except ValueError:
# FIXME not working ... parser = Parser()
tiramisu_config = self.remote_json_to_config(ConfigAPI)
parser = TiramisuCmdlineParser(tiramisu_config,
self.prog,
unrestraint=True,
fullpath=True)
parser.print_help() parser.print_help()
exit(1) exit(1)
parameters.pop(index) parameters.pop(index)
@ -69,8 +63,11 @@ class Configuration(Common):
def get(self): def get(self):
parameters = self.get_parameters() parameters = self.get_parameters()
tiramisu_config = self.configure_server() tiramisu_config = self.configure_server()
option = next(tiramisu_config.option.list('all'))
namespace = option.option.path().split('.', 1)[0]
parser = TiramisuCmdlineParser(tiramisu_config, parser = TiramisuCmdlineParser(tiramisu_config,
self.prog, self.prog,
root=namespace,
unrestraint=True, unrestraint=True,
fullpath=True) fullpath=True)
parser.parse_args(parameters, parser.parse_args(parameters,

View File

@ -19,12 +19,14 @@ class Parser(Common):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
# build a tiramisu parser and parse argument # build a tiramisu parser and parse argument
self.remote_config = self.remote_json_to_config() url = self.cucchiaiata_config.remote_url
self.remote_config = self.remote_json_to_config(url)
parser = CucchiaiataParser(self.remote_config, parser = CucchiaiataParser(self.remote_config,
fullpath=False, fullpath=False,
remove_empty_od=True, remove_empty_od=True,
display_modified_value=False, display_modified_value=False,
formatter_class=RawDescriptionHelpFormatter) formatter_class=RawDescriptionHelpFormatter,
)
parser.parse_args() parser.parse_args()
def get(self): def get(self):
@ -34,12 +36,3 @@ class Parser(Common):
# send message # send message
return send_data(message, return send_data(message,
payload) payload)
def get_payload(self,
message: str):
# remove symlinkoption and default value from payload
payload = {}
for option in self.remote_config.option(message).list():
if not option.owner.isdefault() and not option.option.issymlinkoption():
payload[option.option.name()] = option.value.get()
return payload