From 9331117f8904d4d87468e4aa6df654b087a0c9d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Thu, 19 Nov 2020 08:52:15 +0100
Subject: [PATCH] cookbook: support python3 in erp5testnode recipe and add
 missing tests

---
 slapos/recipe/erp5testnode/__init__.py  |   4 +-
 slapos/test/recipe/test_erp5testnode.py | 131 ++++++++++++++++++++++++
 2 files changed, 133 insertions(+), 2 deletions(-)
 create mode 100644 slapos/test/recipe/test_erp5testnode.py

diff --git a/slapos/recipe/erp5testnode/__init__.py b/slapos/recipe/erp5testnode/__init__.py
index 0e724e808..d0a6e8594 100644
--- a/slapos/recipe/erp5testnode/__init__.py
+++ b/slapos/recipe/erp5testnode/__init__.py
@@ -36,7 +36,7 @@ class Recipe(GenericBaseRecipe):
     self.path_list = []
     options = self.options.copy()
     del options['recipe']
-    CONFIG = {k.replace('-', '_'): v for k, v in options.iteritems()}
+    CONFIG = {k.replace('-', '_'): v for k, v in options.items()}
     CONFIG['PATH'] = os.environ['PATH']
 
     if self.options['instance-dict']:
@@ -44,7 +44,7 @@ class Recipe(GenericBaseRecipe):
       config_instance_dict.add_section('instance_dict')
       instance_dict = json.loads(self.options['instance-dict'])
 
-      for k ,v in instance_dict.iteritems():
+      for k ,v in instance_dict.items():
         config_instance_dict.set('instance_dict', k, v)
       value = io.StringIO()
       config_instance_dict.write(value)
diff --git a/slapos/test/recipe/test_erp5testnode.py b/slapos/test/recipe/test_erp5testnode.py
new file mode 100644
index 000000000..3548ae029
--- /dev/null
+++ b/slapos/test/recipe/test_erp5testnode.py
@@ -0,0 +1,131 @@
+import functools
+import os
+import shutil
+import tempfile
+import unittest
+
+from six.moves import configparser
+import zc.buildout.testing
+
+
+class UserInfoTest(unittest.TestCase):
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
+    self.addCleanup(shutil.rmtree, self.tmp_dir)
+
+    self.get_temp_path = functools.partial(os.path.join, self.tmp_dir)
+
+    self.buildout = buildout = zc.buildout.testing.Buildout()
+    buildout['slap-connection'] = {
+        'computer-id': 'computer-id',
+        'server-url': 'https://slapos.example.com',
+    }
+    # dummy defaults
+    buildout['erp5testnode'] = {
+        'apache-binary': '/bin/httpd',
+        'apache-htpasswd': '/bin/htpasswd',
+        'apache-mime-file': '/etc/mime.types',
+        'apache-modules-dir': '/srv/modules',
+        'frontend-url': 'https://example.com/',
+        'git-binary': '/bin/git',
+        'httpd-cert-file': 'etc/httpd-public.crt',
+        'httpd-key-file': 'etc/httpd-public.key',
+        'httpd-conf-file': 'etc/httpd.conf',
+        'httpd-ip': '::1',
+        'httpd-lock-file': 'var/run/httpd.lock',
+        'httpd-log-directory': 'var/log',
+        'httpd-pid-file': 'var/run/httpd.pid',
+        'httpd-port': '9080',
+        'httpd-software-access-port': '9081',
+        'httpd-software-directory': 'srv/software',
+        'httpd-wrapper': 'bin/httpd',
+        'instance-dict': '',
+        'ipv4-address': '127.0.0.1',
+        'ipv6-address': '::1',
+        'keep-log-days': '3',
+        'log-directory': 'var/log/testnode',
+        'log-file': 'var/log/erp5testnode.log',
+        'log-frontend-url': 'https://example.com',
+        'node-quantity': '2',
+        'proxy-host': '127.0.0.1',
+        'proxy-port': '5000',
+        'recipe': 'slapos.cookbook:erp5testnode',
+        'run-directory': 'var/run/testnode',
+        'shared-part-list': 'srv/shared',
+        'slapos-binary': '/bin/slapos',
+        'slapos-directory': 'srv/slapos',
+        'software-directory': 'srv/software',
+        'software-path-list': '[""]',
+        'srv-directory': 'srv',
+        'test-node-title': 'TEST NODE TITLE',
+        'test-suite-directory': 'srv/test_suite',
+        'test-suite-master-url': 'https://testnode.example.com',
+        'testnode': '/bin/testnode',
+        'working-directory': 'srv/testnode',
+        'wrapper': 'bin/erp5testnode-service',
+        'zip-binary': '/bin/zip',
+    }
+
+    # values for test
+    buildout['erp5testnode']['configuration-file'] = self.get_temp_path(
+        'configuration-file')
+    buildout['erp5testnode']['wrapper'] = self.get_temp_path('wrapper')
+    buildout['erp5testnode']['httpd-conf-file'] = self.get_temp_path(
+        'httpd-conf-file')
+    buildout['erp5testnode']['httpd-wrapper'] = self.get_temp_path(
+        'httpd-wrapper')
+
+    buildout['erp5testnode']['log-directory'] = self.get_temp_path(
+        'log-directory')
+    os.mkdir(self.get_temp_path('log-directory'))
+    # software URLs are given as a json encoded string
+    buildout['erp5testnode'][
+        'software-path-list'] = '["https://example.com/slapos/software.cfg", "https://example.com/slapos/another-software.cfg"]'
+
+    from slapos.recipe import erp5testnode
+    self.recipe = erp5testnode.Recipe(
+        buildout,
+        'erp5testnode',
+        buildout['erp5testnode'],
+    )
+
+  def test_installed_paths(self):
+    self.assertEqual(
+        sorted(self.recipe.install()),
+        sorted([
+            self.get_temp_path('configuration-file'),
+            self.get_temp_path('wrapper'),
+            self.get_temp_path('httpd-conf-file'),
+            self.get_temp_path('httpd-wrapper'),
+        ]))
+
+  def test_configuration_file(self):
+    self.recipe.install()
+
+    parser = configparser.ConfigParser()
+    parser.read(self.get_temp_path('configuration-file'))
+
+    # this is generally a valid configparser file.
+    self.assertEqual(parser.get('testnode', 'slapos_directory'), 'srv/slapos')
+
+    # software URLs are specified comma separated (XXX not sure it was
+    # good idea, but it's like this)
+    self.assertEqual(parser.get('software_list', 'path_list'),
+      "https://example.com/slapos/software.cfg,https://example.com/slapos/another-software.cfg")
+
+
+  def test_log_directory_apache(self):
+    self.recipe.install()
+
+    self.assertTrue(
+        os.path.exists(self.get_temp_path('log-directory', 'index.html')))
+
+    # apache to expose log directory
+    with open(self.get_temp_path('httpd-conf-file')) as f:
+      self.assertIn(
+          'DocumentRoot "{}"'.format(self.get_temp_path('log-directory')),
+          f.read())
+
+    # wrapper references the config file
+    with open(self.get_temp_path('httpd-wrapper')) as f:
+      self.assertIn(self.get_temp_path('httpd-conf-file'), f.read())
-- 
2.30.9