SVN: zdaemon/trunk/src/zdaemon/ finished creation of rundirectory

Christian Zagrodnick <[email protected]>
Newsgroups gmane.comp.web.zope.zope3.cvs
Message-ID <20090128164812.6290A9418B__20770.468193996$1233161386$gmane$org@cvs.zope.org>
Log message for revision 95349:
  finished creation of rundirectory
  

Changed:
  U   zdaemon/trunk/src/zdaemon/tests/testzdoptions.py
  U   zdaemon/trunk/src/zdaemon/tests/testzdrun.py
  U   zdaemon/trunk/src/zdaemon/zdctl.py
  U   zdaemon/trunk/src/zdaemon/zdoptions.py

-=-
Modified: zdaemon/trunk/src/zdaemon/tests/testzdoptions.py
===================================================================
--- zdaemon/trunk/src/zdaemon/tests/testzdoptions.py	2009-01-28 16:39:33 UTC (rev 95348)
+++ zdaemon/trunk/src/zdaemon/tests/testzdoptions.py	2009-01-28 16:48:11 UTC (rev 95349)
@@ -24,7 +24,8 @@
 import ZConfig
 import zdaemon
 from zdaemon.zdoptions import (
-    ZDOptions, RunnerOptions, existing_parent_directory)
+    ZDOptions, RunnerOptions,
+    existing_parent_directory, existing_parent_dirpath)
 
 class ZDOptionsTestBase(unittest.TestCase):
 
@@ -340,16 +341,23 @@
         options = self.OptionsClass()
         path = os.path.join(self.root, 'does-not-exist', 'really-not')
         self.check_exit_code(options, ["-z", path])
+        socket = os.path.join(path, 'socket')
+        self.check_exit_code(options, ["-s", socket])
 
     def test_existing_directory(self):
         options = self.OptionsClass()
         options.realize(["-z", self.root])
+        socket = os.path.join(self.root, 'socket')
+        self.check_exit_code(options, ["-s", socket])
 
     def test_parent_is_created(self):
         options = self.OptionsClass()
         path = os.path.join(self.root, 'will-be-created')
         options.realize(["-z", path])
         self.assertEquals(path, options.directory)
+        socket = os.path.join(path, 'socket')
+        options = self.OptionsClass()
+        options.realize(["-s", socket])
         # Directory will be created when zdaemon runs, not when the
         # configuration is read
         self.assertFalse(os.path.exists(path))
@@ -362,7 +370,16 @@
             ValueError, existing_parent_directory,
             os.path.join(self.root, 'not-there', 'this-also-not'))
 
+    def test_existing_parent_dirpath(self):
+        self.assertTrue(existing_parent_dirpath(
+            os.path.join(self.root, 'sock')))
+        self.assertTrue(existing_parent_dirpath(
+            os.path.join(self.root, 'not-there', 'sock')))
+        self.assertRaises(
+            ValueError, existing_parent_dirpath,
+            os.path.join(self.root, 'not-there', 'this-also-not', 'sock'))
 
+
 def test_suite():
     suite = unittest.TestSuite()
     for cls in [TestBasicFunctionality,

Modified: zdaemon/trunk/src/zdaemon/tests/testzdrun.py
===================================================================
--- zdaemon/trunk/src/zdaemon/tests/testzdrun.py	2009-01-28 16:39:33 UTC (rev 95348)
+++ zdaemon/trunk/src/zdaemon/tests/testzdrun.py	2009-01-28 16:48:11 UTC (rev 95349)
@@ -315,39 +315,60 @@
         super(TestRunnerDirectory, self).setUp()
         self.root = tempfile.mkdtemp()
         self.save_stdout = sys.stdout
-        self.save_stderr = sys.stderr
+        self.save_stderr = sys.stdout
         sys.stdout = StringIO()
         sys.stderr = StringIO()
+        self.expect = ''
 
     def tearDown(self):
         shutil.rmtree(self.root)
+        got = sys.stdout.getvalue()
+        err = sys.stderr.getvalue()
         sys.stdout = self.save_stdout
         sys.stderr = self.save_stderr
+        if err:
+            print >>sys.stderr, err,
+        self.assertEqual(self.expect, got)
         super(TestRunnerDirectory, self).tearDown()
 
-    def run_ctl(self, path):
+    def run_ctl(self, opts):
         true_cmd = "/bin/true"
         if not os.path.exists(true_cmd):
             true_cmd = "/usr/bin/true"  # Mac OS X
         options = zdctl.ZDCtlOptions()
-        options.realize(['-z', path, '-p', 'sleep 1', 'fg'])
+        options.realize(opts + ['-p', 'sleep 1', 'fg'])
         self.expect = 'sleep 1\n'
         proc = zdctl.ZDCmd(options)
         proc.onecmd(" ".join(options.args))
 
     def testCtlRunDirectoryCreation(self):
         path = os.path.join(self.root, 'rundir')
-        self.run_ctl(path)
+        self.run_ctl(['-z', path])
         self.assert_(os.path.exists(path))
 
     def testCtlRunDirectoryCreationOnlyOne(self):
         path = os.path.join(self.root, 'rundir', 'not-created')
-        self.run_ctl(path)
+        self.assertRaises(SystemExit, self.run_ctl, ['-z', path])
         self.assertFalse(os.path.exists(path))
-        self.assertTrue(sys.stdout.getvalue().startswith(
-            'Error: invalid value for -z'))
+        got = sys.stderr.getvalue().strip()
+        sys.stderr = StringIO()
+        self.assertTrue(got.startswith('Error: invalid value for -z'))
 
+    def testCtlSocketDirectoryCreation(self):
+        path = os.path.join(self.root, 'rundir', 'sock')
+        self.run_ctl(['-s', path])
+        self.assert_(os.path.exists(os.path.dirname(path)))
 
+
+    def testCtlSocketDirectoryCreationOnlyOne(self):
+        path = os.path.join(self.root, 'rundir', 'not-created', 'sock')
+        self.assertRaises(SystemExit, self.run_ctl, ['-s', path])
+        self.assertFalse(os.path.exists(path))
+        got = sys.stderr.getvalue().strip()
+        sys.stderr = StringIO()
+        self.assertTrue(got.startswith('Error: invalid value for -s'))
+
+
 def send_action(action, sockname):
     """Send an action to the zdrun server and return the response.
 

Modified: zdaemon/trunk/src/zdaemon/zdctl.py
===================================================================
--- zdaemon/trunk/src/zdaemon/zdctl.py	2009-01-28 16:39:33 UTC (rev 95348)
+++ zdaemon/trunk/src/zdaemon/zdctl.py	2009-01-28 16:48:11 UTC (rev 95349)
@@ -43,6 +43,7 @@
 """
 
 import os
+import os.path
 import re
 import cmd
 import sys
@@ -145,14 +146,24 @@
                         os.environ[k] = v
 
         self.create_rundir()
+        self.create_socket_dir()
         self.set_uid()
 
     def create_rundir(self):
         if self.options.directory is None:
             return
-        if os.path.isdir(self.options.directory):
+        self.create_directory(self.options.directory)
+
+    def create_socket_dir(self):
+        dir = os.path.dirname(self.options.sockname)
+        if not dir:
             return
-        os.mkdir(self.options.directory)
+        self.create_directory(dir)
+
+    def create_directory(self, directory):
+        if os.path.isdir(directory):
+            return
+        os.mkdir(directory)
         uid = os.geteuid()
         if uid == 0 and uid != self.options.uid:
             # Change owner of directory to target

Modified: zdaemon/trunk/src/zdaemon/zdoptions.py
===================================================================
--- zdaemon/trunk/src/zdaemon/zdoptions.py	2009-01-28 16:39:33 UTC (rev 95348)
+++ zdaemon/trunk/src/zdaemon/zdoptions.py	2009-01-28 16:48:11 UTC (rev 95349)
@@ -355,7 +355,7 @@
         self.add("forever", "runner.forever", "f", "forever",
                  flag=1, default=0)
         self.add("sockname", "runner.socket_name", "s:", "socket-name=",
-                 ZConfig.datatypes.existing_dirpath, default="zdsock")
+                 existing_parent_dirpath, default="zdsock")
         self.add("exitcodes", "runner.exit_codes", "x:", "exit-codes=",
                  list_of_ints, default=[0, 2])
         self.add("user", "runner.user", "u:", "user=")
@@ -409,6 +409,19 @@
     raise ValueError('%s is not an existing directory' % arg)
 
 
+def existing_parent_dirpath(arg):
+    path = os.path.expanduser(arg)
+    dir = os.path.dirname(path)
+    if not dir:
+        # relative pathname with no directory component
+        return path
+    parent, tail = os.path.split(dir)
+    if os.path.isdir(parent):
+        return path
+    raise ValueError('The directory named as part of the path %s '
+                     'does not exist.' % arg)
+
+
 def _test():
     # Stupid test program
     z = ZDOptions()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.