Commit fe08658f authored by Gabriel Monnerat's avatar Gabriel Monnerat

[SlapOS Core] Improve configure-local command and add test for this command

parent de11308a
include CHANGES.txt
include slapos/proxy/schema.sql
include slapos/slapos-client.cfg.example
include slapos/slapos-proxy.cfg.example
include slapos/slapos.cfg.example
recursive-include slapos *.in *.txt *.xsd
from setuptools import setup, find_packages
from shutil import copyfile
import glob
import os
from slapos.version import version
name = 'slapos.core'
long_description = open("README.txt").read() + "\n" + \
open("CHANGES.txt").read() + "\n"
......@@ -11,6 +11,12 @@ long_description = open("README.txt").read() + "\n" + \
for f in sorted(glob.glob(os.path.join('slapos', 'README.*.txt'))):
long_description += '\n' + open(f).read() + '\n'
slapos_folder_path = os.path.dirname(__file__)
for template_name in ('slapos-client.cfg.example',
'slapos-proxy.cfg.example', 'slapos.cfg.example'):
copyfile(os.path.join(slapos_folder_path, template_name),
os.path.join(slapos_folder_path, 'slapos', template_name))
additional_install_requires = []
# Even if argparse is available in python2.7, some python2.7 installations
# do not have it, so checking python version is dangerous
......
# This is an example configuration file for a standalone micro slapos master
# a.k.a slapproxy
[slapos]
instance_root = /srv/slapgrid
software_root = /opt/slapgrid
computer_id = local_computer
[slapproxy]
host = 127.0.0.1
port = 5000
......@@ -8,7 +13,7 @@ database_uri = /opt/slapos/slapproxy.db
# Below is the list of software maintained by slapos.org and contributors
# It is used to simulate a proper configuration of a real slapos master.
software_product_list =
erp5 http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.143:/software/erp5/software.cfg
erp5 http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.195:/software/erp5/software.cfg
erp5_branch http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/heads/erp5:/software/erp5/software.cfg
kumofs http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.141:/software/kumofs/software.cfg
kvm http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.193:/software/kvm/software.cfg
......
......@@ -5,10 +5,10 @@ import functools
import os
import sys
import cliff
from cliff import command
class Command(cliff.command.Command):
class Command(command.Command):
def get_parser(self, prog_name):
parser = argparse.ArgumentParser(
......
......@@ -28,21 +28,23 @@
#
##############################################################################
import logging
import os
import pkg_resources
import re
import subprocess
import sys
from slapos.cli.command import Command, must_be_root
from slapos.grid.utils import updateFile
from slapos.cli.command import must_be_root
from slapos.format import FormatConfig
from slapos.cli.config import ConfigCommand
from slapos.grid.slapgrid import create_slapgrid_object
from slapos.grid.utils import updateFile, createPrivateDirectory
from slapos.grid.svcbackend import launchSupervisord
DEFAULT_COMPUTER_ID = 'local_computer'
class ConfigureLocalCommand(Command):
class ConfigureLocalCommand(ConfigCommand):
"""
Configure a slapos node, from scratch to ready-ro-use, using slapproxy.
"""
......@@ -74,10 +76,25 @@ class ConfigureLocalCommand(Command):
' (default: %(default)s)')
ap.add_argument('--daemon-listen-port',
default='127.0.0.1',
default='8080',
help='Listening port of the "slapproxy" daemon'
' (default: %(default)s)')
ap.add_argument('--slapos-instance-root',
default='/srv/slapgrid',
help='Target location of the SlapOS configuration'
' directory (default: %(default)s)')
ap.add_argument('--slapos-software-root',
default='/opt/slapgrid',
help='Target location of the SlapOS configuration'
' directory (default: %(default)s)')
ap.add_argument('--slapos-buildout-directory',
default='/opt/slapos',
help='Target location of the SlapOS configuration'
' directory (default: %(default)s)')
ap.add_argument('--slapos-configuration-directory',
default='/etc/opt/slapos',
help='Target location of the SlapOS configuration'
......@@ -88,100 +105,86 @@ class ConfigureLocalCommand(Command):
@must_be_root
def take_action(self, args):
try:
return_code = do_configure(args, logger)
return_code = do_configure(args, self.fetch_config, self.app.log)
except SystemExit as err:
return_code = err
sys.exit(return_code)
def _createDirectoryIfNotExist(target_directory, logger):
def _createConfigurationDirectory(target_directory):
target_directory = os.path.normpath(target_directory)
# XXX: hardcoded
if os.path.exists(os.path.join(target_directory, 'slapos.cfg')):
logger.error('A SlapOS configuration directory already exist at'
' %s. Aborting.' % target_directory)
raise SystemExit(1)
if not os.path.exists(target_directory):
os.mkdir(target_directory, 0o711)
return target_directory
os.makedirs(target_directory)
def _replaceParameterValue(original_content, to_replace):
"""
Replace in a .ini-like file the value of all parameters specified in
to_replace by their value.
"""
# XXX: Can be cleaned up by being replaced by a simple dict
new_content = ''
for key, value in to_replace:
# Replace all values of the given parameters to the specified values
new_content = re.sub(
'%s\s+=.*' % key, '%s = %s' % (key, value),
original_content
)
return new_content
def _generateSlaposNodeConfigurationFile(target_directory,
listening_ip, listening_port,
interface_name,
ipv4_local_network,
partition_number):
slapos_node_configuration_template = pkg_resources.resource_stream(
__name__, 'template/slapos.cfg.in').read()
slapos_node_configuration_file_location = os.path.join(
target_directory, 'slapos.cfg')
original_content = re.sub('%s\s+=.*' % key, '%s = %s' % (key, value),
original_content)
return original_content
def _generateSlaposNodeConfigurationFile(slapos_node_config_path, args):
template_arg_list = (__name__.split('.')[0], 'slapos.cfg.example')
with pkg_resources.resource_stream(*template_arg_list) as fout:
slapos_node_configuration_template = fout.read()
master_url = 'http://%s:%s' % (args.daemon_listen_ip, args.daemon_listen_port)
slapos_home = args.slapos_buildout_directory
to_replace = [
('computer_id', DEFAULT_COMPUTER_ID),
('master_url', 'http://%s:%s' % (listening_ip, listening_port)),
('interface_name', interface_name),
('ipv4_local_network', ipv4_local_network),
('partition_amount', partition_number),
('master_url', master_url),
('interface_name', args.interface_name),
('ipv4_local_network', args.ipv4_local_network),
('partition_amount', args.partition_number),
('instance_root', args.slapos_instance_root),
('software_root', args.slapos_software_root),
('computer_xml', '%s/slapos.xml' % slapos_home),
('log_file', '%s/log/slapos-node-format.log' % slapos_home),
('use_unique_local_address', 'true')
]
slapos_node_configuration_content = _replaceParameterValue(
slapos_node_configuration_template, to_replace)
with open(slapos_node_configuration_file_location, 'w') as fout:
slapos_node_configuration_content = re.sub(
'(key_file|cert_file|certificate_repository_path).*=.*\n',
'', slapos_node_configuration_content)
with open(slapos_node_config_path, 'w') as fout:
fout.write(slapos_node_configuration_content.encode('utf8'))
def _generateSlaposProxyConfigurationFile(target_directory,
listening_ip, listening_port
):
slapos_proxy_configuration_template = pkg_resources.resource_stream(
__name__, 'template/slapos-proxy.cfg.in').read()
slapos_proxy_configuration_file_location = os.path.join(
target_directory, 'slapos-proxy.cfg')
def _generateSlaposProxyConfigurationFile(conf):
template_arg_list = (__name__.split('.')[0], 'slapos-proxy.cfg.example')
with pkg_resources.resource_stream(*template_arg_list) as fout:
slapos_proxy_configuration_template = fout.read()
slapos_proxy_configuration_path = os.path.join(
conf.slapos_configuration_directory, 'slapos-proxy.cfg')
listening_ip, listening_port = \
conf.daemon_listen_ip, conf.daemon_listen_port
to_replace = [
('host', listening_ip),
('port', listening_port),
('master_url', 'http://%s:%s/' % (listening_ip, listening_port)),
('computer_id', DEFAULT_COMPUTER_ID),
('instance_root', conf.instance_root),
('software_root', conf.software_root)
]
slapos_proxy_configuration_content = _replaceParameterValue(
slapos_proxy_configuration_template, to_replace)
with open(slapos_proxy_configuration_file_location, 'w') as fout:
with open(slapos_proxy_configuration_path, 'w') as fout:
fout.write(slapos_proxy_configuration_content.encode('utf8'))
return slapos_proxy_configuration_file_location
return slapos_proxy_configuration_path
def _addProxyToSupervisor(proxy_configuration_file):
def _addProxyToSupervisor(conf):
"""
Create a supervisord configuration file containing informations to run
slapproxy as daemon
"""
# In the beginning God created SlapOS.
# And SlapOS was without form, and void; and darkness was upon the face of the deep.
# And God said, Let there be supervisord manager.
# But God was drunk. The result can be found by the Brave in slapgrid, but it may turn the Brave blind forever.
# So, for the sake of God, I'm not using that helper.
# XXX every path here is hardcoded, assuming default values
program_partition_template = """\
[program:slapproxy]
directory=/opt/slapos
directory=%(slapos_buildout_directory)s
command=%(program_command)s
process_name=slapproxy
autostart=true
......@@ -201,24 +204,28 @@ stdout_logfile_backups=1
stderr_logfile=%(log_file)s
stderr_logfile_maxbytes=100KB
stderr_logfile_backups=1
""" % {'log_file': '/opt/slapos/log/slapos-proxy.log',
'program_command': '/opt/slapos/bin/slapproxy %s' % proxy_configuration_file}
""" % {'log_file': '%s/log/slapos-proxy.log' % conf.slapos_buildout_directory,
'slapos_buildout_directory': conf.slapos_buildout_directory,
'program_command': '%s/bin/slapproxy %s' % \
(conf.slapos_buildout_directory, conf.proxy_configuration_file)}
supervisord_conf_folder_path = os.path.join(conf.instance_root,
'etc', 'supervisord.conf.d')
_createConfigurationDirectory(supervisord_conf_folder_path)
updateFile(
'/srv/slapgrid/etc/supervisord.conf.d/slapproxy.conf',
program_partition_template
)
os.path.join(supervisord_conf_folder_path, 'slapproxy.conf'),
program_partition_template)
def _runFormat():
def _runFormat(slapos_directory):
"""
Launch slapos node format.
"""
# XXX: hardcoded
command = '/opt/slapos/bin/slapos node format --now -v'.split()
subprocess.Popen(command).communicate()
subprocess.Popen(
["%s/bin/slapos" % slapos_directory,
"node", "format", "--now"]).communicate()
def do_configure(conf, logger):
def do_configure(args, fetch_config_func, logger):
"""
Generate configuration files,
Create the instance path by running slapformat (but will crash),
......@@ -226,28 +233,43 @@ def do_configure(conf, logger):
Run supervisor, which will run the proxy,
Run format, which will finish correctly.
"""
slapos_configuration_directory = _createDirectoryIfNotExist(
conf.slapos_configuration_directory, logger)
_generateSlaposNodeConfigurationFile(
slapos_configuration_directory,
conf.daemon_listen_ip,
conf.daemon_listen_port,
conf.interface_name,
conf.ipv4_local_network,
conf.partition_number
)
proxy_configuration_file_location = _generateSlaposProxyConfigurationFile(
slapos_configuration_directory,
conf.daemon_listen_ip,
conf.daemon_listen_port
slapos_node_config_path = os.path.join(
args.slapos_configuration_directory, 'slapos.cfg')
if os.path.exists(slapos_node_config_path):
logger.error('A SlapOS configuration directory already exist at'
' %s. Aborting.' % slapos_node_config_path)
raise SystemExit(1)
if not getattr(args, 'cfg', None):
args.cfg = slapos_node_config_path
_createConfigurationDirectory(args.slapos_configuration_directory)
_generateSlaposNodeConfigurationFile(slapos_node_config_path, args)
configp = fetch_config_func(args)
conf = FormatConfig(logger=logger)
conf.mergeConfig(args, configp)
supervisord_socket_path = os.path.join(conf.instance_root,
'supervisord.socket')
supervisord_conf_path = os.path.join(conf.instance_root,
'etc', 'supervisord.conf')
conf_property_list = (
('supervisord_socket', supervisord_socket_path),
('supervisord_configuration_path', supervisord_conf_path),
)
_runFormat()
_addProxyToSupervisor(proxy_configuration_file_location)
# XXX hardcoded
launchSupervisord(
'/srv/slapgrid/supervisord.socket',
'/srv/slapgrid/etc/supervisord.conf',
logger=logger)
_runFormat()
for key, value in conf_property_list:
if not getattr(conf, key, None):
setattr(conf, key, value)
slapgrid = create_slapgrid_object(conf.__dict__, logger)
createPrivateDirectory(os.path.join(conf.slapos_buildout_directory, 'log'))
_runFormat(conf.slapos_buildout_directory)
slapgrid.checkEnvironmentAndCreateStructure()
proxy_configuration_file = _generateSlaposProxyConfigurationFile(conf)
conf.proxy_configuration_file = proxy_configuration_file
_addProxyToSupervisor(conf)
home_folder_path = os.environ['HOME']
createPrivateDirectory("%s/.slapos" % home_folder_path)
slapos_client_cfg_path = '%s/.slapos/slapos-client.cfg' % home_folder_path
if not os.path.exists(slapos_client_cfg_path):
os.symlink(slapos_node_config_path, slapos_client_cfg_path)
launchSupervisord(socket=supervisord_socket_path,
configuration_file=supervisord_conf_path, logger=logger)
_runFormat(conf.slapos_buildout_directory)
return 0
# This is an example configuration file for a standalone micro slapos master
# a.k.a slapproxy
[slapproxy]
host = %(host)s
port = %(port)s
database_uri = /opt/slapos/slapproxy.db
# Below is the list of software maintained by slapos.org and contributors
# It is used to simulate a proper configuration of a real slapos master.
software_product_list =
erp5 http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.143:/software/erp5/software.cfg
erp5_branch http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/heads/erp5:/software/erp5/software.cfg
kumofs http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.141:/software/kumofs/software.cfg
kvm http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.193:/software/kvm/software.cfg
maarch http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.159:/software/maarch/software.cfg
mariadb http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.152:/software/mariadb/software.cfg
memcached http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.82:/software/memcached/software.cfg
slaposwebrunner http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.160:/software/slaprunner/software.cfg
wordpress http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.163:/software/wordpress/software.cfg
zabbixagent http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.162:/software/zabbix-agent/software.cfg
[slapos]
# Replace computer_id by the unique identifier of your computer on your SlapOS,
# Master, usually starting by COMP-
computer_id = %(computer_id)s
master_url = %(master_url)s
software_root = /opt/slapgrid
instance_root = /srv/slapgrid
[slapformat]
# Replace by your network interface providing IPv6 if you don't use re6st
interface_name = %(interface_name)s
# Change "create_tap" into "true" if you need to host KVM services
create_tap = false
partition_amount = %(partition_amount)s
computer_xml = /opt/slapos/slapos.xml
log_file = /opt/slapos/log/slapos-node-format.log
partition_base_name = slappart
user_base_name = slappart
# You can choose any other local network which does not conflict with your
# current machine configuration
ipv4_local_network = %(ipv4_local_network)
# Change to true if you want slapos to use local-only IPv6
use_unique_local_address = True
[networkcache]
# Define options for binary cache, used to download already compiled software.
download-binary-cache-url = http://www.shacache.org/shacache
download-cache-url = https://www.shacache.org/shacache
download-binary-dir-url = http://www.shacache.org/shadir
# Configuration to Upload Configuration for Binary cache
#upload-binary-dir-url = https://www.shacache.org/shadir
#upload-binary-cache-url = https://www.shacache.org/shacache
#signature_private_key_file = /etc/opt/slapos/shacache/signature.key
#signature_certificate_file = /etc/opt/slapos/shacache/signature.cert
#upload-cache-url = https://www.shacache.org/shacache
#shacache-cert-file = /etc/opt/slapos/shacache/shacache.cert
#shacache-key-file = /etc/opt/slapos/shacache/shacache.key
#upload-binary-dir-url = https://www.shacache.org/shadir
#upload-binary-cache-url = https://www.shacache.org/shacache
#upload-dir-url = https://www.shacache.org/shadir
#shadir-cert-file = /etc/opt/slapos/shacache/shacache.cert
#shadir-key-file = /etc/opt/slapos/shacache/shacache.key
# List of signatures of uploaders we trust:
# Romain Courteaud
# Sebastien Robin
# Kazuhiko Shiozaki
# Cedric de Saint Martin
# Yingjie Xu
# Gabriel Monnerat
# Lukasz Nowak
# Marco Mariani
# Test Agent Signature
signature-certificate-list =
-----BEGIN CERTIFICATE-----
MIIB4DCCAUkCADANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJGUjEZMBcGA1UE
CBMQRGVmYXVsdCBQcm92aW5jZTEPMA0GA1UEChMGTmV4ZWRpMB4XDTExMDkxNTA5
MDAwMloXDTEyMDkxNTA5MDAwMlowOTELMAkGA1UEBhMCRlIxGTAXBgNVBAgTEERl
ZmF1bHQgUHJvdmluY2UxDzANBgNVBAoTBk5leGVkaTCBnzANBgkqhkiG9w0BAQEF
AAOBjQAwgYkCgYEApYZv6OstoqNzxG1KI6iE5U4Ts2Xx9lgLeUGAMyfJLyMmRLhw
boKOyJ9Xke4dncoBAyNPokUR6iWOcnPHtMvNOsBFZ2f7VA28em3+E1JRYdeNUEtX
Z0s3HjcouaNAnPfjFTXHYj4um1wOw2cURSPuU5dpzKBbV+/QCb5DLheynisCAwEA
ATANBgkqhkiG9w0BAQsFAAOBgQBCZLbTVdrw3RZlVVMFezSHrhBYKAukTwZrNmJX
mHqi2tN8tNo6FX+wmxUUAf3e8R2Ymbdbn2bfbPpcKQ2fG7PuKGvhwMG3BlF9paEC
q7jdfWO18Zp/BG7tagz0jmmC4y/8akzHsVlruo2+2du2freE8dK746uoMlXlP93g
QUUGLQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB8jCCAVugAwIBAgIJAPu2zchZ2BxoMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
BAMMB3RzeGRldjMwHhcNMTExMDE0MTIxNjIzWhcNMTIxMDEzMTIxNjIzWjASMRAw
DgYDVQQDDAd0c3hkZXYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrPbh+
YGmo6mWmhVb1vTqX0BbeU0jCTB8TK3i6ep3tzSw2rkUGSx3niXn9LNTFNcIn3MZN
XHqbb4AS2Zxyk/2tr3939qqOrS4YRCtXBwTCuFY6r+a7pZsjiTNddPsEhuj4lEnR
L8Ax5mmzoi9nE+hiPSwqjRwWRU1+182rzXmN4QIDAQABo1AwTjAdBgNVHQ4EFgQU
/4XXREzqBbBNJvX5gU8tLWxZaeQwHwYDVR0jBBgwFoAU/4XXREzqBbBNJvX5gU8t
LWxZaeQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA07q/rKoE7fAda
FED57/SR00OvY9wLlFEF2QJ5OLu+O33YUXDDbGpfUSF9R8l0g9dix1JbWK9nQ6Yd
R/KCo6D0sw0ZgeQv1aUXbl/xJ9k4jlTxmWbPeiiPZEqU1W9wN5lkGuLxV4CEGTKU
hJA/yXa1wbwIPGvX3tVKdOEWPRXZLg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB7jCCAVegAwIBAgIJAJWA0jQ4o9DGMA0GCSqGSIb3DQEBBQUAMA8xDTALBgNV
BAMMBHg2MXMwIBcNMTExMTI0MTAyNDQzWhgPMjExMTEwMzExMDI0NDNaMA8xDTAL
BgNVBAMMBHg2MXMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANdJNiFsRlkH
vq2kHP2zdxEyzPAWZH3CQ3Myb3F8hERXTIFSUqntPXDKXDb7Y/laqjMXdj+vptKk
3Q36J+8VnJbSwjGwmEG6tym9qMSGIPPNw1JXY1R29eF3o4aj21o7DHAkhuNc5Tso
67fUSKgvyVnyH4G6ShQUAtghPaAwS0KvAgMBAAGjUDBOMB0GA1UdDgQWBBSjxFUE
RfnTvABRLAa34Ytkhz5vPzAfBgNVHSMEGDAWgBSjxFUERfnTvABRLAa34Ytkhz5v
PzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAFLDS7zNhlrQYSQO5KIj
z2RJe3fj4rLPklo3TmP5KLvendG+LErE2cbKPqnhQ2oVoj6u9tWVwo/g03PMrrnL
KrDm39slYD/1KoE5kB4l/p6KVOdeJ4I6xcgu9rnkqqHzDwI4v7e8/D3WZbpiFUsY
vaZhjNYKWQf79l6zXfOvphzJ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAO4V/jiMoICoMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCENPTVAtMjMyMCAXDTEyMDIxNjExMTAyM1oYDzIxMTIwMTIzMTExMDIzWjAT
MREwDwYDVQQDDAhDT01QLTIzMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
wi/3Z8W9pUiegUXIk/AiFDQ0UJ4JFAwjqr+HSRUirlUsHHT+8DzH/hfcTDX1I5BB
D1ADk+ydXjMm3OZrQcXjn29OUfM5C+g+oqeMnYQImN0DDQIOcUyr7AJc4xhvuXQ1
P2pJ5NOd3tbd0kexETa1LVhR6EgBC25LyRBRae76qosCAwEAAaNQME4wHQYDVR0O
BBYEFMDmW9aFy1sKTfCpcRkYnP6zUd1cMB8GA1UdIwQYMBaAFMDmW9aFy1sKTfCp
cRkYnP6zUd1cMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAskbFizHr
b6d3iIyN+wffxz/V9epbKIZVEGJd/6LrTdLiUfJPec7FaxVCWNyKBlCpINBM7cEV
Gn9t8mdVQflNqOlAMkOlUv1ZugCt9rXYQOV7rrEYJBWirn43BOMn9Flp2nibblby
If1a2ZoqHRxoNo2yTmm7TSYRORWVS+vvfjY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAIlBksrZVkK8MA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCENPTVAtMzU3MCAXDTEyMDEyNjEwNTUyOFoYDzIxMTIwMTAyMTA1NTI4WjAT
MREwDwYDVQQDDAhDT01QLTM1NzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
ts+iGUwi44vtIfwXR8DCnLtHV4ydl0YTK2joJflj0/Ws7mz5BYkxIU4fea/6+VF3
i11nwBgYgxQyjNztgc9u9O71k1W5tU95yO7U7bFdYd5uxYA9/22fjObaTQoC4Nc9
mTu6r/VHyJ1yRsunBZXvnk/XaKp7gGE9vNEyJvPn2bkCAwEAAaNQME4wHQYDVR0O
BBYEFKuGIYu8+6aEkTVg62BRYaD11PILMB8GA1UdIwQYMBaAFKuGIYu8+6aEkTVg
62BRYaD11PILMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAMoTRpBxK
YLEZJbofF7gSrRIcrlUJYXfTfw1QUBOKkGFFDsiJpEg4y5pUk1s5Jq9K3SDzNq/W
it1oYjOhuGg3al8OOeKFrU6nvNTF1BAvJCl0tr3POai5yXyN5jlK/zPfypmQYxE+
TaqQSGBJPVXYt6lrq/PRD9ciZgKLOwEqK8w=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAPHoWu90gbsgMA0GCSqGSIb3DQEBBQUAMBQxEjAQBgNV
BAMMCXZpZmlibm9kZTAeFw0xMjAzMTkyMzIwNTVaFw0xMzAzMTkyMzIwNTVaMBQx
EjAQBgNVBAMMCXZpZmlibm9kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
ozBijpO8PS5RTeKTzA90vi9ezvv4vVjNaguqT4UwP9+O1+i6yq1Y2W5zZxw/Klbn
oudyNzie3/wqs9VfPmcyU9ajFzBv/Tobm3obmOqBN0GSYs5fyGw+O9G3//6ZEhf0
NinwdKmrRX+d0P5bHewadZWIvlmOupcnVJmkks852BECAwEAAaNQME4wHQYDVR0O
BBYEFF9EtgfZZs8L2ZxBJxSiY6eTsTEwMB8GA1UdIwQYMBaAFF9EtgfZZs8L2ZxB
JxSiY6eTsTEwMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAc43YTfc6
baSemaMAc/jz8LNLhRE5dLfLOcRSoHda8y0lOrfe4lHT6yP5l8uyWAzLW+g6s3DA
Yme/bhX0g51BmI6gjKJo5DoPtiXk/Y9lxwD3p7PWi+RhN+AZQ5rpo8UfwnnN059n
yDuimQfvJjBFMVrdn9iP6SfMjxKaGk6gVmI=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAMNZBmoIOXPBMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCENPTVAtMTMyMCAXDTEyMDUwMjEyMDQyNloYDzIxMTIwNDA4MTIwNDI2WjAT
MREwDwYDVQQDDAhDT01QLTEzMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
6peZQt1sAmMAmSG9BVxxcXm8x15kE9iAplmANYNQ7z2YO57c10jDtlYlwVfi/rct
xNUOKQtc8UQtV/fJWP0QT0GITdRz5X/TkWiojiFgkopza9/b1hXs5rltYByUGLhg
7JZ9dZGBihzPfn6U8ESAKiJzQP8Hyz/o81FPfuHCftsCAwEAAaNQME4wHQYDVR0O
BBYEFNuxsc77Z6/JSKPoyloHNm9zF9yqMB8GA1UdIwQYMBaAFNuxsc77Z6/JSKPo
yloHNm9zF9yqMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAl4hBaJy1
cgiNV2+Z5oNTrHgmzWvSY4duECOTBxeuIOnhql3vLlaQmo0p8Z4c13kTZq2s3nhd
Loe5mIHsjRVKvzB6SvIaFUYq/EzmHnqNdpIGkT/Mj7r/iUs61btTcGUCLsUiUeci
Vd0Ozh79JSRpkrdI8R/NRQ2XPHAo+29TT70=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAL9FOtBJZBqAMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCENPTVAtOTIyMCAXDTEyMDkyNjE2MDkwM1oYDzIxMTIwOTAyMTYwOTAzWjAT
MREwDwYDVQQDDAhDT01QLTkyMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
wlGVd6qOsc2xrtAQ5/rpflzS14/84SE/joaujMw2GGk6EFVSOcqKLq1TnHxkcCkv
nv1NYRPK/hpQOIKcGC1f+DvXXpMJI29R/rt2b2/y1oolxXonSVigBtCQlSyDoOFN
6LBX84CI5aYMvy3mqJCvfGEFBaPqze/PVugq9IpgZg0CAwEAAaNQME4wHQYDVR0O
BBYEFJ7HWyzVKkeSYnSK4FIwcdyng/tRMB8GA1UdIwQYMBaAFJ7HWyzVKkeSYnSK
4FIwcdyng/tRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAZQWob2ki
ie6h90FgSctozXrotb8NIis2MtLIj+WonE0wSqYefxwBmAGjB9cfWz/sNamhM4rn
BP1A2ojVhF6hOE1qvTP5YxcGXOoYTrEQSuDF1hn12WlA4vqIAz1f+4CiMJNlXPwh
7N+X2kvRpHdXAHkBOxX3j34AeCZrSpu/yDQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB9jCCAV+gAwIBAgIJAKRvzcy7OH0UMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCENPTVAtNzcyMCAXDTEyMDgxMDE1NDI1MVoYDzIxMTIwNzE3MTU0MjUxWjAT
MREwDwYDVQQDDAhDT01QLTc3MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
o7aipd6MbnuGDeR1UJUjuMLQUariAyQ2l2ZDS6TfOwjHiPw/mhzkielgk73kqN7A
sUREx41eTcYCXzTq3WP3xCLE4LxLg1eIhd4nwNHj8H18xR9aP0AGjo4UFl5BOMa1
mwoyBt3VtfGtUmb8whpeJgHhqrPPxLoON+i6fIbXDaUCAwEAAaNQME4wHQYDVR0O
BBYEFEfjy3OopT2lOksKmKBNHTJE2hFlMB8GA1UdIwQYMBaAFEfjy3OopT2lOksK
mKBNHTJE2hFlMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAaNRx6YN2
M/p3R8/xS6zvH1EqJ3FFD7XeAQ52WuQnKSREzuw0dsw12ClxjcHiQEFioyTiTtjs
5pW18Ry5Ie7iFK4cQMerZwWPxBodEbAteYlRsI6kePV7Gf735Y1RpuN8qZ2sYL6e
x2IMeSwJ82BpdEI5niXxB+iT0HxhmR+XaMI=
-----END CERTIFICATE-----
# List of URL(s) which shouldn't be downloaded from binary cache.
# Any URL beginning by a blacklisted URL will be blacklisted as well.
download-from-binary-cache-url-blacklist =
http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD
http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/heads
/
# List of URL(s) which shouldn't be uploaded into binary cache.
# Any URL beginning by a blacklisted URL will be blacklisted as well.
upload-to-binary-cache-url-blacklist =
http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD
http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/heads
/
......@@ -65,6 +65,7 @@ COMPUTER_PARTITION_STOPPED_STATE = 'stopped'
SLAPGRID_SUCCESS = 0
SLAPGRID_FAIL = 1
SLAPGRID_PROMISE_FAIL = 2
PROMISE_TIMEOUT = 3
# XXX hardcoded watchdog_path
WATCHDOG_PATH = '/opt/slapos/bin/slapos-watchdog'
......@@ -214,7 +215,7 @@ def create_slapgrid_object(options, logger):
upload_dir_url=op.get('upload-dir-url'),
master_ca_file=op.get('master_ca_file'),
certificate_repository_path=op.get('certificate_repository_path'),
promise_timeout=op['promise_timeout'],
promise_timeout=op.get('promise_timeout', PROMISE_TIMEOUT),
shacache_cert_file=op.get('shacache-cert-file'),
shacache_key_file=op.get('shacache-key-file'),
shadir_cert_file=op.get('shadir-cert-file'),
......
......@@ -69,8 +69,6 @@ class ProxyConfig(object):
def setConfig(self):
if not self.database_uri:
raise ValueError('database-uri is required.')
self.software_product_list = _generateSoftwareProductListFromString(
getattr(self, 'software_product_list', ''))
def do_proxy(conf):
......@@ -80,5 +78,7 @@ def do_proxy(conf):
app.logger.setLevel(logging.INFO)
app.config['computer_id'] = conf.computer_id
app.config['DATABASE_URI'] = conf.database_uri
app.config['software_product_list'] = conf.software_product_list
app.config['software_product_list'] = \
_generateSoftwareProductListFromString(
getattr(conf, 'software_product_list', ""))
app.run(host=conf.host, port=int(conf.port))
##############################################################################
#
# Copyright (c) 2014 Vifib SARL and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import os
import unittest
import shutil
import tempfile
import slapos.slap
import slapos.cli.configure_local
from slapos.cli.configure_local import ConfigureLocalCommand, _createConfigurationDirectory
from slapos.cli.entry import SlapOSApp
from argparse import Namespace
from ConfigParser import ConfigParser
# Disable any command to launch slapformat and supervisor
slapos.cli.configure_local._runFormat = lambda x: "Do nothing"
slapos.cli.configure_local.launchSupervisord = lambda socket, \
configuration_file, logger: "Do nothing"
class TestConfigureLocal(unittest.TestCase):
def setUp(self):
self.slap = slapos.slap.slap()
self.app = SlapOSApp()
self.temp_dir = tempfile.mkdtemp()
os.environ["HOME"] = self.temp_dir
self.instance_root = tempfile.mkdtemp()
self.software_root = tempfile.mkdtemp()
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
def tearDown(self):
for temp_path in (self.temp_dir, \
self.instance_root, self.software_root):
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
def test_configure_local_environment_with_default_value(self):
config = ConfigureLocalCommand(self.app, Namespace())
config.__dict__.update({i.dest: i.default \
for i in config.get_parser(None)._option_string_actions.values()})
config.slapos_configuration_directory = self.temp_dir
config.slapos_buildout_directory = self.temp_dir
config.slapos_instance_root = self.instance_root
slapos.cli.configure_local.do_configure(
config, config.fetch_config, self.app.log)
expected_software_root = "/opt/slapgrid"
self.assertTrue(
os.path.exists("%s/.slapos/slapos-client.cfg" % self.temp_dir))
with open(self.temp_dir + '/slapos-proxy.cfg') as fout:
proxy_config = ConfigParser()
proxy_config.readfp(fout)
self.assertEquals(proxy_config.get('slapos', 'instance_root'),
self.instance_root)
self.assertEquals(proxy_config.get('slapos', 'software_root'),
expected_software_root)
with open(self.temp_dir + '/slapos.cfg') as fout:
proxy_config = ConfigParser()
proxy_config.readfp(fout)
self.assertEquals(proxy_config.get('slapos', 'instance_root'),
self.instance_root)
self.assertEquals(proxy_config.get('slapos', 'software_root'),
expected_software_root)
def test_configure_local_environment(self):
config = ConfigureLocalCommand(self.app, Namespace())
config.__dict__.update({i.dest: i.default \
for i in config.get_parser(None)._option_string_actions.values()})
config.slapos_configuration_directory = self.temp_dir
config.slapos_buildout_directory = self.temp_dir
config.slapos_instance_root = self.instance_root
config.slapos_software_root = self.software_root
slapos.cli.configure_local.do_configure(
config, config.fetch_config, self.app.log)
log_folder = os.path.join(config.slapos_buildout_directory, 'log')
self.assertTrue(os.path.exists(log_folder), "%s not exists" % log_folder)
self.assertTrue(
os.path.exists("%s/.slapos/slapos-client.cfg" % self.temp_dir))
with open(self.temp_dir + '/slapos-proxy.cfg') as fout:
proxy_config = ConfigParser()
proxy_config.readfp(fout)
self.assertEquals(proxy_config.get('slapos', 'instance_root'),
self.instance_root)
self.assertEquals(proxy_config.get('slapos', 'software_root'),
self.software_root)
with open(self.temp_dir + '/slapos.cfg') as fout:
proxy_config = ConfigParser()
proxy_config.readfp(fout)
self.assertEquals(proxy_config.get('slapos', 'instance_root'),
self.instance_root)
self.assertEquals(proxy_config.get('slapos', 'software_root'),
self.software_root)
log_file = proxy_config.get('slapformat', 'log_file')
self.assertTrue(log_file.startswith(log_folder),
"%s don't starts with %s" % (log_file, log_folder))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment