Compare commits

...

22 Commits

Author SHA1 Message Date
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
10 changed files with 189 additions and 163 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
Priority: extra
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
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
Architecture: any
Pre-Depends: dpkg, python3, ${misc:Pre-Depends}
Depends: ${python:Depends}, ${misc:Depends}
Depends: ${python:Depends}, ${misc:Depends}, python3-cucchiaiata
Description: configuration manager cli

1
debian/cucchiaiata.install vendored Normal file
View File

@ -0,0 +1 @@
script/cucchiaiata-cli usr/bin/

View File

@ -1,135 +1,160 @@
#!/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
verif() {
i=0
argv=("$@")
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
i=$((i+1))
R=$(cucchiaiata-cli setting.session.$1.get -s $S -n $V | jq -Mcr .content[])
[ "$R" = "${argv[i]}" ]
done
function get_id() {
S=$($1)
V=$(echo $S|jq -r .session_id)
if [ $? = 0 ]; then
echo $V
else
echo $S
exit 1
fi
}
# Import EOLE
cucchiaiata-cli setting.source.create -o cadoles -u http://localhost
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
#=======================================================================================================
# Infrastructure
#=======================================================================================================
# Create a new user and set role 'server_rw' for this server
cucchiaiata-cli user.user.create -u gnunux -n gnunux -s gnunux
cucchiaiata-cli user.role.create -u gnunux -o 'server_rw' -a 'Server.ServerName' -v dns.cadoles.com
# Create a new user and set role 'server_rw' for the server dns.cadoles.com
cucchiaiata-cli v1.user.user.create --login gnunux \
--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
cucchiaiata-cli setting.servermodel.create -m cluster -d "Node in the cluster" -p base -o cadoles -e last
# Zone
# +~~~~~~~~~~+
# ! 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
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)
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.reseau.unbound_domain_name dns.cadoles.com
verif servermodel 192.168.1.2 dns.cadoles.com [] null
cucchiaiata-cli setting.session.servermodel.stop -s $S -a
# Create the cluster cluster.cadoles.com
# +---------------------------+
# | cluster.cadoles.com | +~~~~~~~~~~+
# | +--------------------+ |-------! ZONE !
# | | node1.cadoles.com |---|-------! internet !
# | +--------------------+ | +~~~~~~~~~~+
# +---------------------------+
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
cucchiaiata-cli setting.servermodel.create -m unbound -d "generic unbound configuration" -p fedora-31 -o cadoles -e last
cucchiaiata-cli setting.servermodel.dependency.add -m unbound -a unbound -o cadoles -e last
S=$(cucchiaiata-cli setting.session.servermodel.start -m unbound -e last| jq -r .session_id)
cucchiaiata-cli setting.session.servermodel.configure -s $S --creole.serveur_dns.unbound_local_zones cadoles.com
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
# configuration
S=$(get_id "cucchiaiata-cli v1.setting.session.cluster.start --cluster_name cluster.cadoles.com")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.network.virtual_ip "192.168.1.1"
cucchiaiata-cli v1.setting.session.validate --session_id $S
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
## unbound_etab1
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)
verif servermodel 192.168.1.2 dns.cadoles.com '["cadoles.com"]' null
# Organization, sites and zone
# + = = = = = = = = = = = = = = = = = = = = +
# " ORGANISATION cadoles.com "
# " + = = = = = = = = = = = + "
# " " 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
cucchiaiata-cli infra.site.create -i etab1 -d "Etab 1"
cucchiaiata-cli infra.site.create -i cluster -d "Cluster"
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
# Servermodels
# -> base-fedora-32 (Cadoles)
# |-> sm_cluster (servermodel)
# |
# '-> unbound (Cadoles)
# '-> unbound (servermodel) ----,
# |
# -> openssh-server (Cadoles) |--> unbound_etab1 (servermodel)
# '-> aca (servermodel) |
# '-> etab1 (servermodel) ------'
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name sm_cluster --applicationservices base-fedora-32
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name unbound --applicationservices unbound
cucchiaiata-cli v1.setting.servermodel.create --servermodel_name aca --applicationservices 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
cucchiaiata-cli infra.server.create -s dns.cadoles.com -d description -m unbound_etab1 -e last -i etab1 -z pedago
# configuration
# Create a cluster with one node and one VM
cucchiaiata-cli provider.factory.cluster.create -c cluster.cadoles.com -d toto -v 192.168.1.1 -z pedago
cucchiaiata-cli provider.factory.cluster.join -c cluster.cadoles.com -n node1.cadoles.com
cucchiaiata-cli provider.factory.server.add -s dns.cadoles.com -c cluster.cadoles.com -p 0.2 -v 2 -m 2
# Servermodel ACA
S=$(get_id "cucchiaiata-cli v1.setting.session.servermodel.start --servermodel_name aca")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.serveur_ssh.ssh_allow_networks admin.cadoles.com
cucchiaiata-cli v1.setting.session.stop --session_id "$S" --save
# Configure server
S=$(cucchiaiata-cli setting.session.server.start -s dns.cadoles.com | jq -r .session_id)
cucchiaiata-cli setting.session.server.configure -s $S --creole.reseau.unbound_ip_address_cidr 192.168.1.1/24
cucchiaiata-cli setting.session.server.validate -s $S
verif server 192.168.1.2 dns.cadoles.com '["cadoles.com"]' 192.168.1.1/24
cucchiaiata-cli setting.session.server.stop -s $S -a
# Servermodel unbound
S=$(get_id "cucchiaiata-cli v1.setting.session.servermodel.start --servermodel_name unbound")
cucchiaiata-cli v1.setting.session.configure --session_id "$S" --configuration.serveur_dns.unbound_local_zones cadoles.com \
--configuration.reseau.unbound_route_address 192.168.1.254 \
--configuration.serveur_dns.unbound_allowed_client_cidr 192.168.1.0/24
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
cucchiaiata-cli setting.config.configuration.server.deploy -s dns.cadoles.com
cucchiaiata-cli setting.template.generate -s 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
cucchiaiata-cli v1.setting.config.configuration.server.deploy --server dns.cadoles.com
cucchiaiata-cli v1.setting.template.generate --server dns.cadoles.com
# 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"

View File

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

View File

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

View File

@ -32,16 +32,16 @@ class Common:
return err
def remote_json_to_config(self,
url=None,
config_type=Config):
url,
config_type=Config,
):
"retrieves the remote config from the distant api description"
if url is None:
url = self.cucchiaiata_config.remote_url
token = self.get_token()
headers = {'Authorization':'Bearer {}'.format(token)}
req = get(url,
headers=headers,
verify=config.allow_insecure_https)
verify=config.allow_insecure_https,
)
code = req.status_code
if code != 200:
raise Exception(self.get_error_from_http(req))
@ -49,9 +49,14 @@ class Common:
return config_type(json)
def send_data(message: str,
payload: Dict):
final_url = '{}/{}'.format(config.remote_url, message)
def send_data(uri: str,
payload: Dict,
):
version, message = uri.split('.', 1)
final_url = '{}/{}/{}'.format(config.remote_url,
version,
message,
)
ret = post(final_url,
data=dumps(payload),
verify=config.allow_insecure_https)

View File

@ -11,11 +11,7 @@ class Config:
if not isfile(config_file):
print(_('Attention, there is no configuration file'))
url = input(_('Address to Risotto server: '))
version = input(_('Risotto API\'s version (default: "v1"): '))
if not version:
version = "v1"
yaml_template = f"""url: {url}
version: {version}"""
yaml_template = f'url: {url}'
with open(config_file, 'w') as fh:
fh.write(yaml_template)
@ -28,9 +24,8 @@ version: {version}"""
raise Exception(_('Error when creating the config file {}').format(err))
self.url = config['url']
self.version = config['version']
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.indent = config.get('indent', 2)
self.allow_insecure_https = config.get('allow_insecure_https', False)

View File

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

View File

@ -19,12 +19,14 @@ class Parser(Common):
def __init__(self):
super().__init__()
# 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,
fullpath=False,
remove_empty_od=True,
display_modified_value=False,
formatter_class=RawDescriptionHelpFormatter)
formatter_class=RawDescriptionHelpFormatter,
)
parser.parse_args()
def get(self):