Commit 7244f1f0 authored by Xavier Thompson's avatar Xavier Thompson

slap/standalone: Add slapformat configuration

This enables calling `slapos node format` from the command line.

The configuration is updated every time `StandaloneSlapOS.format()`
is called so that subsequent calls to `slapos node format` produce
the same output.

In the future, `StandaloneSlapOS.format()` could be adapted to call
`slapos node format` directly.

See merge request nexedi/slapos.core!308
parent 8a2561ad
Pipeline #16175 failed with stage
in 0 seconds
...@@ -33,6 +33,7 @@ import logging ...@@ -33,6 +33,7 @@ import logging
import time import time
import errno import errno
import socket import socket
import pwd
from six.moves import urllib from six.moves import urllib
from six.moves import http_client from six.moves import http_client
...@@ -207,6 +208,15 @@ class SlapOSConfigWriter(ConfigWriter): ...@@ -207,6 +208,15 @@ class SlapOSConfigWriter(ConfigWriter):
pidfile_report = {standalone_slapos._report_pid} pidfile_report = {standalone_slapos._report_pid}
forbid_supervisord_automatic_launch = true forbid_supervisord_automatic_launch = true
[slapformat]
input_definition_file = {standalone_slapos._slapformat_definition}
partition_amount = {standalone_slapos._partition_count}
alter_user = false
alter_network = false
create_tap = false
create_tun = false
computer_xml = {standalone_slapos._slapos_xml}
[slapproxy] [slapproxy]
host = {standalone_slapos._server_ip} host = {standalone_slapos._server_ip}
port = {standalone_slapos._server_port} port = {standalone_slapos._server_port}
...@@ -256,6 +266,35 @@ class SlapOSNodeAutoWriter(ConfigWriter): ...@@ -256,6 +266,35 @@ class SlapOSNodeAutoWriter(ConfigWriter):
os.chmod(path, 0o755) os.chmod(path, 0o755)
class SlapformatDefinitionWriter(ConfigWriter):
"""Write slapformat-definition.cfg configuration.
"""
def writeConfig(self, path):
ipv4 = self._standalone_slapos._ipv4_address
ipv6 = self._standalone_slapos._ipv6_address
ipv4_cidr = ipv4 + '/255.255.255.255' if ipv4 else ''
ipv6_cidr = ipv6 + '/64' if ipv6 else ''
user = pwd.getpwuid(os.getuid()).pw_name
partition_base_name = self._standalone_slapos._partition_base_name
with open(path, 'w') as f:
f.write(
textwrap.dedent(
"""
[computer]
address = {ipv4_cidr}\n
""").format(**locals()))
for i in range(self._standalone_slapos._partition_count):
f.write(
textwrap.dedent(
"""
[partition_{i}]
address = {ipv6_cidr} {ipv4_cidr}
pathname = {partition_base_name}{i}
user = {user}
network_interface =\n
""").format(**locals()))
class PartitionForwardConfiguration(object): class PartitionForwardConfiguration(object):
"""Specification of request forwarding to another master, requested as user. """Specification of request forwarding to another master, requested as user.
""" """
...@@ -352,6 +391,10 @@ class StandaloneSlapOS(object): ...@@ -352,6 +391,10 @@ class StandaloneSlapOS(object):
self._base_directory = base_directory self._base_directory = base_directory
self._shared_part_list = list(shared_part_list) self._shared_part_list = list(shared_part_list)
self._partition_forward_configuration = list(partition_forward_configuration) self._partition_forward_configuration = list(partition_forward_configuration)
self._partition_count = 0
self._partition_base_name = 'slappart'
self._ipv4_address = None
self._ipv6_address = None
self._slapos_bin = slapos_bin self._slapos_bin = slapos_bin
...@@ -424,6 +467,8 @@ class StandaloneSlapOS(object): ...@@ -424,6 +467,8 @@ class StandaloneSlapOS(object):
ensureDirectoryExists(etc_directory) ensureDirectoryExists(etc_directory)
self._supervisor_config = os.path.join(etc_directory, 'supervisord.conf') self._supervisor_config = os.path.join(etc_directory, 'supervisord.conf')
self._slapos_config = os.path.join(etc_directory, 'slapos.cfg') self._slapos_config = os.path.join(etc_directory, 'slapos.cfg')
self._slapformat_definition = os.path.join(etc_directory, 'slapformat-definition.cfg')
self._slapos_xml = os.path.join(etc_directory, 'slapos.xml')
var_directory = os.path.join(base_directory, 'var') var_directory = os.path.join(base_directory, 'var')
ensureDirectoryExists(var_directory) ensureDirectoryExists(var_directory)
...@@ -451,6 +496,7 @@ class StandaloneSlapOS(object): ...@@ -451,6 +496,7 @@ class StandaloneSlapOS(object):
SupervisorConfigWriter(self).writeConfig(self._supervisor_config) SupervisorConfigWriter(self).writeConfig(self._supervisor_config)
SlapOSConfigWriter(self).writeConfig(self._slapos_config) SlapOSConfigWriter(self).writeConfig(self._slapos_config)
SlapformatDefinitionWriter(self).writeConfig(self._slapformat_definition)
SlapOSCommandWriter(self).writeConfig(self._slapos_wrapper) SlapOSCommandWriter(self).writeConfig(self._slapos_wrapper)
SlapOSNodeAutoWriter(self).writeConfig(self._slapos_node_auto_bin) SlapOSNodeAutoWriter(self).writeConfig(self._slapos_node_auto_bin)
...@@ -607,6 +653,16 @@ class StandaloneSlapOS(object): ...@@ -607,6 +653,16 @@ class StandaloneSlapOS(object):
supervisor_conf) supervisor_conf)
os.unlink(supervisor_conf) os.unlink(supervisor_conf)
# update slapformat configuration
old_partition_count = self._partition_count
self._partition_count = partition_count
self._partition_base_name = partition_base_name
self._ipv4_address = ipv4_address
self._ipv6_address = ipv6_address
if old_partition_count != partition_count:
SlapOSConfigWriter(self).writeConfig(self._slapos_config)
SlapformatDefinitionWriter(self).writeConfig(self._slapformat_definition)
def supply(self, software_url, computer_guid=None, state="available"): def supply(self, software_url, computer_guid=None, state="available"):
"""Supply a software, see ISupply.supply """Supply a software, see ISupply.supply
......
...@@ -35,6 +35,8 @@ import hashlib ...@@ -35,6 +35,8 @@ import hashlib
import socket import socket
import errno import errno
import time import time
import glob
import subprocess
import multiprocessing import multiprocessing
from contextlib import closing from contextlib import closing
from six.moves.configparser import ConfigParser from six.moves.configparser import ConfigParser
...@@ -159,6 +161,29 @@ class TestSlapOSStandaloneSetup(unittest.TestCase): ...@@ -159,6 +161,29 @@ class TestSlapOSStandaloneSetup(unittest.TestCase):
self.assertRaisesRegex(ValueError, "Cannot reformat to remove busy partition at .*slappart0"): self.assertRaisesRegex(ValueError, "Cannot reformat to remove busy partition at .*slappart0"):
standalone.format(0, SLAPOS_TEST_IPV4, SLAPOS_TEST_IPV6) standalone.format(0, SLAPOS_TEST_IPV4, SLAPOS_TEST_IPV6)
def test_slapos_node_format(self):
working_dir = tempfile.mkdtemp(prefix=__name__)
self.addCleanup(shutil.rmtree, working_dir)
standalone = StandaloneSlapOS(
working_dir, SLAPOS_TEST_IPV4, SLAPOS_TEST_PORT)
self.addCleanup(standalone.stop)
self.assertTrue(os.path.exists(standalone.instance_directory))
format_command = (standalone._slapos_wrapper, 'node', 'format', '--now')
glob_pattern = os.path.join(standalone.instance_directory, 'slappart*')
self.assertFalse(glob.glob(glob_pattern))
self.assertTrue(subprocess.call(format_command))
self.assertFalse(glob.glob(glob_pattern))
for partition_count in (3, 2):
standalone.format(partition_count, SLAPOS_TEST_IPV4, SLAPOS_TEST_IPV6)
self.assertEqual(partition_count, len(glob.glob(glob_pattern)))
subprocess.check_call(format_command)
partitions = glob.glob(glob_pattern)
self.assertEqual(partition_count, len(partitions))
for path in partitions:
shutil.rmtree(path)
subprocess.check_call(format_command)
self.assertEqual(partition_count, len(glob.glob(glob_pattern)))
def test_two_instance_from_same_directory(self): def test_two_instance_from_same_directory(self):
working_dir = tempfile.mkdtemp(prefix=__name__) working_dir = tempfile.mkdtemp(prefix=__name__)
self.addCleanup(shutil.rmtree, working_dir) self.addCleanup(shutil.rmtree, working_dir)
......
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