cedar-backup-svn Mailing List for Cedar Backup (Page 12)
Brought to you by:
pronovic
You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(5) |
Dec
(50) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
|
Feb
(5) |
Mar
(55) |
Apr
(13) |
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(5) |
Nov
(3) |
Dec
(3) |
| 2009 |
Jan
|
Feb
|
Mar
(11) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(7) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2010 |
Jan
(14) |
Feb
(2) |
Mar
|
Apr
|
May
(7) |
Jun
(8) |
Jul
(30) |
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(9) |
Nov
|
Dec
|
| 2013 |
Jan
|
Feb
|
Mar
(3) |
Apr
(10) |
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(48) |
Nov
(1) |
Dec
|
| 2015 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <pro...@us...> - 2007-12-19 04:09:44
|
Revision: 827
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=827&view=rev
Author: pronovic
Date: 2007-12-18 20:09:43 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Fix epydoc typo
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-19 04:08:16 UTC (rev 826)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-19 04:09:43 UTC (rev 827)
@@ -2278,7 +2278,7 @@
@param cbackCommand: Default cback-compatible command to use on managed remote peers.
@param overrides: List of configured command path overrides, if any.
@param hooks: List of configured pre- and post-action hooks.
- @parma managedActions: Default set of actions that are managed on remote peers.
+ @param managedActions: Default set of actions that are managed on remote peers.
@raise ValueError: If one of the values is invalid.
"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-19 04:08:20
|
Revision: 826
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=826&view=rev
Author: pronovic
Date: 2007-12-18 20:08:16 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Release 2.15.0
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/release.py
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/CedarBackup2/release.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/release.py 2007-12-19 04:06:57 UTC (rev 825)
+++ cedar-backup2/trunk/CedarBackup2/release.py 2007-12-19 04:08:16 UTC (rev 826)
@@ -34,7 +34,7 @@
AUTHOR = "Kenneth J. Pronovici"
EMAIL = "pro...@ie..."
COPYRIGHT = "2004-2007"
-VERSION = "2.14.0"
-DATE = "19 Sep 2007"
+VERSION = "2.15.0"
+DATE = "18 Dec 2007"
URL = "http://cedar-solutions.com/software/cedar-backup"
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2007-12-19 04:06:57 UTC (rev 825)
+++ cedar-backup2/trunk/Changelog 2007-12-19 04:08:16 UTC (rev 826)
@@ -1,4 +1,4 @@
-Version 2.15.0 unreleased
+Version 2.15.0 18 Dec 2007
* Minor documentation tweaks discovered during 3.0 development.
* Add support for a new managed backup feature.
@@ -6,7 +6,7 @@
- Change peers configuration in <stage> to just override <peers>
- Modify stage process to take peers list from peers section (if available)
- Add new configuration in options and remote peers to support remote shells
- - Updated user manual to discuss managed backup concept and configuration
+ - Update user manual to discuss managed backup concept and configuration
- Add executeRemoteCommand() and executeManagedAction() on peer.RemotePeer
Version 2.14.0 19 Sep 2007
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-19 04:07:01
|
Revision: 825
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=825&view=rev
Author: pronovic
Date: 2007-12-18 20:06:57 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Fix pychecker warnings
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
cedar-backup2/trunk/test/clitests.py
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-19 04:05:16 UTC (rev 824)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-19 04:06:57 UTC (rev 825)
@@ -731,7 +731,6 @@
for peer in peers.remotePeers:
if peer.managed:
remoteUser = _ActionSet._getRemoteUser(options, peer)
- localUser = _ActionSet._getRemoteUser(options, peer)
rshCommand = _ActionSet._getRshCommand(options, peer)
cbackCommand = _ActionSet._getCbackCommand(options, peer)
managedActions = _ActionSet._getManagedActions(options, peer)
Modified: cedar-backup2/trunk/test/clitests.py
===================================================================
--- cedar-backup2/trunk/test/clitests.py 2007-12-19 04:05:16 UTC (rev 824)
+++ cedar-backup2/trunk/test/clitests.py 2007-12-19 04:06:57 UTC (rev 825)
@@ -8992,7 +8992,6 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-19 04:05:18
|
Revision: 824
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=824&view=rev
Author: pronovic
Date: 2007-12-18 20:05:16 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Remove some unused variables
Modified Paths:
--------------
cedar-backup2/trunk/test/clitests.py
Modified: cedar-backup2/trunk/test/clitests.py
===================================================================
--- cedar-backup2/trunk/test/clitests.py 2007-12-19 04:00:31 UTC (rev 823)
+++ cedar-backup2/trunk/test/clitests.py 2007-12-19 04:05:16 UTC (rev 824)
@@ -8609,7 +8609,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
@@ -8626,7 +8625,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
@@ -8643,7 +8641,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
@@ -8660,7 +8657,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
@@ -8677,7 +8673,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 4)
@@ -8703,7 +8698,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(0, actionSet.actionSet[0].index)
@@ -8719,7 +8713,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(0, actionSet.actionSet[0].index)
@@ -8735,7 +8728,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8754,7 +8746,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8773,7 +8764,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8792,7 +8782,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8811,7 +8800,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
@@ -8830,7 +8818,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
@@ -8849,7 +8836,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
@@ -8868,7 +8854,6 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
@@ -8887,7 +8872,6 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
@@ -8906,7 +8890,6 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8925,7 +8908,6 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(150, actionSet.actionSet[0].index)
@@ -8944,7 +8926,6 @@
extensions = ExtensionsConfig([], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 4)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -8972,7 +8953,6 @@
ExtendedAction("five", "os.path", "exists", 450), ], None)
options = OptionsConfig()
options.managedActions = [ "collect", "purge", "one", ]
- peers = PeersConfig()
actionSet = _ActionSet(actions, extensions, options, None, True, True)
self.failUnless(len(actionSet.actionSet) == 9)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-19 04:00:39
|
Revision: 823
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=823&view=rev
Author: pronovic
Date: 2007-12-18 20:00:31 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Changes from testing on daystrom
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
cedar-backup2/trunk/CedarBackup2/peer.py
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-19 03:35:49 UTC (rev 822)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-19 04:00:31 UTC (rev 823)
@@ -227,6 +227,7 @@
configPath = options.config
executeLocal = True
+ executeManaged = False
if options.managedOnly:
executeLocal = False
executeManaged = True
@@ -456,8 +457,8 @@
@raise Exception: If there is a problem executing the action.
"""
- for peer in remotePeer:
- log.debug("Executing managed action [%s] on peer [%s]." % (self.name, peer.name))
+ for peer in self.remotePeers:
+ logger.debug("Executing managed action [%s] on peer [%s]." % (self.name, peer.name))
peer.executeManagedAction(self.name, options.full)
@@ -823,7 +824,7 @@
@raise Exception: If there is a problem executing the actions.
"""
- log.debug("Executing local actions.")
+ logger.debug("Executing local actions.")
for actionItem in self.actionSet:
actionItem.executeAction(configPath, options, config)
Modified: cedar-backup2/trunk/CedarBackup2/peer.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-19 03:35:49 UTC (rev 822)
+++ cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-19 04:00:31 UTC (rev 823)
@@ -857,7 +857,6 @@
@raise IOError: If there is an error executing the action on the remote peer.
"""
- log.debug("Executing managed action [%s] on peer [%s]." % (action, self.name))
command = RemotePeer._buildCbackCommand(self.cbackCommand, action, fullBackup)
self.executeRemoteCommand(command)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-19 03:35:53
|
Revision: 822
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=822&view=rev
Author: pronovic
Date: 2007-12-18 19:35:49 -0800 (Tue, 18 Dec 2007)
Log Message:
-----------
Unit tests for managed peer actions
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
cedar-backup2/trunk/test/clitests.py
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-18 03:10:02 UTC (rev 821)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-19 03:35:49 UTC (rev 822)
@@ -88,8 +88,10 @@
# Cedar Backup modules
from CedarBackup2.release import AUTHOR, EMAIL, VERSION, DATE, COPYRIGHT
from CedarBackup2.util import RestrictedContentList, DirectedGraph, PathResolverSingleton
-from CedarBackup2.util import sortDict, splitCommandLine, executeCommand, getFunctionReference, getUidGid, encodePath
+from CedarBackup2.util import sortDict, splitCommandLine, executeCommand, getFunctionReference
+from CedarBackup2.util import getUidGid, encodePath
from CedarBackup2.config import Config
+from CedarBackup2.peer import RemotePeer
from CedarBackup2.actions.collect import executeCollect
from CedarBackup2.actions.stage import executeStage
from CedarBackup2.actions.store import executeStore
@@ -327,16 +329,17 @@
"""
if other is None:
return 1
- if self.SORT_ORDER != other.SORT_ORDER:
- if self.SORT_ORDER < other.SORT_ORDER:
- return -1
- else:
- return 1
if self.index != other.index:
if self.index < other.index:
return -1
else:
return 1
+ else:
+ if self.SORT_ORDER != other.SORT_ORDER:
+ if self.SORT_ORDER < other.SORT_ORDER:
+ return -1
+ else:
+ return 1
return 0
def executeAction(self, configPath, options, config):
@@ -427,16 +430,17 @@
"""
if other is None:
return 1
- if self.SORT_ORDER != other.SORT_ORDER:
- if self.SORT_ORDER < other.SORT_ORDER:
- return -1
- else:
- return 1
if self.index != other.index:
if self.index < other.index:
return -1
else:
return 1
+ else:
+ if self.SORT_ORDER != other.SORT_ORDER:
+ if self.SORT_ORDER < other.SORT_ORDER:
+ return -1
+ else:
+ return 1
return 0
def executeAction(self, configPath, options, config):
@@ -725,11 +729,11 @@
if peers.remotePeers is not None:
for peer in peers.remotePeers:
if peer.managed:
- remoteUser = _ActionSet._getRemoteUser(config, peer)
- localUser = _ActionSet._getRemoteUser(config, peer)
- rshCommand = _ActionSet._getRshCommand(config, peer)
- cbackCommand = _ActionSet._getCbackCommand(config, peer)
- managedActions = _ActionSet._getManagedActions(config, peer)
+ remoteUser = _ActionSet._getRemoteUser(options, peer)
+ localUser = _ActionSet._getRemoteUser(options, peer)
+ rshCommand = _ActionSet._getRshCommand(options, peer)
+ cbackCommand = _ActionSet._getCbackCommand(options, peer)
+ managedActions = _ActionSet._getManagedActions(options, peer)
remotePeer = RemotePeer(peer.name, None, options.workingDir, remoteUser, None,
options.backupUser, rshCommand, cbackCommand)
if managedActions is not None:
@@ -823,55 +827,55 @@
for actionItem in self.actionSet:
actionItem.executeAction(configPath, options, config)
- def _getRemoteUser(config, remotePeer):
+ def _getRemoteUser(options, remotePeer):
"""
Gets the remote user associated with a remote peer.
Use peer's if possible, otherwise take from options section.
- @param config: Config object.
+ @param options: OptionsConfig object, as from config.options
@param remotePeer: Configuration-style remote peer object.
@return: Name of remote user associated with remote peer.
"""
if remotePeer.remoteUser is None:
- return config.options.backupUser
+ return options.backupUser
return remotePeer.remoteUser
_getRemoteUser = staticmethod(_getRemoteUser)
- def _getRshCommand(config, remotePeer):
+ def _getRshCommand(options, remotePeer):
"""
Gets the RSH command associated with a remote peer.
Use peer's if possible, otherwise take from options section.
- @param config: Config object.
+ @param options: OptionsConfig object, as from config.options
@param remotePeer: Configuration-style remote peer object.
@return: RSH command associated with remote peer.
"""
if remotePeer.rshCommand is None:
- return config.options.rshCommand
+ return options.rshCommand
return remotePeer.rshCommand
_getRshCommand = staticmethod(_getRshCommand)
- def _getCbackCommand(config, remotePeer):
+ def _getCbackCommand(options, remotePeer):
"""
Gets the cback command associated with a remote peer.
Use peer's if possible, otherwise take from options section.
- @param config: Config object.
+ @param options: OptionsConfig object, as from config.options
@param remotePeer: Configuration-style remote peer object.
@return: cback command associated with remote peer.
"""
if remotePeer.cbackCommand is None:
- return config.options.cbackCommand
+ return options.cbackCommand
return remotePeer.cbackCommand
_getCbackCommand = staticmethod(_getCbackCommand)
- def _getManagedActions(config, remotePeer):
+ def _getManagedActions(options, remotePeer):
"""
Gets the managed actions list associated with a remote peer.
Use peer's if possible, otherwise take from options section.
- @param config: Config object.
+ @param options: OptionsConfig object, as from config.options
@param remotePeer: Configuration-style remote peer object.
@return: Set of managed actions associated with remote peer.
"""
if remotePeer.managedActions is None:
- return config.options.managedActions
+ return options.managedActions
return remotePeer.managedActions
_getManagedActions = staticmethod(_getManagedActions)
Modified: cedar-backup2/trunk/test/clitests.py
===================================================================
--- cedar-backup2/trunk/test/clitests.py 2007-12-18 03:10:02 UTC (rev 821)
+++ cedar-backup2/trunk/test/clitests.py 2007-12-19 03:35:49 UTC (rev 822)
@@ -81,7 +81,8 @@
from os.path import isdir, isfile, islink, isabs, exists
from getopt import GetoptError
from CedarBackup2.testutil import failUnlessAssignRaises, captureOutput
-from CedarBackup2.config import OptionsConfig, ExtensionsConfig
+from CedarBackup2.config import OptionsConfig, PeersConfig, ExtensionsConfig
+from CedarBackup2.config import LocalPeer, RemotePeer
from CedarBackup2.config import ExtendedAction, ActionDependencies, PreActionHook, PostActionHook
from CedarBackup2.cli import _usage, _version
from CedarBackup2.cli import Options
@@ -8595,6 +8596,4262 @@
self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
+ #########################################
+ # Test constructor, with managed peers
+ #########################################
+
+ def testManagedPeer_001(self):
+ """
+ Test with actions=[ collect ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+
+ def testManagedPeer_002(self):
+ """
+ Test with actions=[ stage ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+
+ def testManagedPeer_003(self):
+ """
+ Test with actions=[ store ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(300, actionSet.actionSet[0].index)
+ self.failUnlessEqual("store", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[0].function)
+
+ def testManagedPeer_004(self):
+ """
+ Test with actions=[ purge ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(400, actionSet.actionSet[0].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[0].function)
+
+ def testManagedPeer_005(self):
+ """
+ Test with actions=[ all ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "all", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 4)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+ self.failUnlessEqual(300, actionSet.actionSet[2].index)
+ self.failUnlessEqual("store", actionSet.actionSet[2].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[2].function)
+ self.failUnlessEqual(400, actionSet.actionSet[3].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[3].function)
+
+ def testManagedPeer_006(self):
+ """
+ Test with actions=[ rebuild ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "rebuild", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(0, actionSet.actionSet[0].index)
+ self.failUnlessEqual("rebuild", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeRebuild, actionSet.actionSet[0].function)
+
+ def testManagedPeer_007(self):
+ """
+ Test with actions=[ validate ], extensions=[], peers=None, managed=True,
+ local=True
+ """
+ actions = [ "validate", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(0, actionSet.actionSet[0].index)
+ self.failUnlessEqual("validate", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeValidate, actionSet.actionSet[0].function)
+
+ def testManagedPeer_008(self):
+ """
+ Test with actions=[ collect, stage ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "collect", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_009(self):
+ """
+ Test with actions=[ collect, store ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "collect", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_010(self):
+ """
+ Test with actions=[ collect, purge ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "collect", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(400, actionSet.actionSet[1].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[1].function)
+
+ def testManagedPeer_011(self):
+ """
+ Test with actions=[ stage, collect ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "stage", "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_012(self):
+ """
+ Test with actions=[ stage, stage ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "stage", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_013(self):
+ """
+ Test with actions=[ stage, store ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "stage", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_014(self):
+ """
+ Test with actions=[ stage, purge ], extensions=[], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "stage", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(400, actionSet.actionSet[1].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[1].function)
+
+ def testManagedPeer_015(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 50) ],
+ peers=None, managed=True, local=True
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(100, actionSet.actionSet[1].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[1].function)
+
+ def testManagedPeer_016(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 50) ],
+ peers=None, managed=True, local=True
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_017(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 150) ],
+ peers=None, managed=True, local=True
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(150, actionSet.actionSet[1].index)
+ self.failUnlessEqual("one", actionSet.actionSet[1].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[1].function)
+
+ def testManagedPeer_018(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 150) ],
+ peers=None, managed=True, local=True
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(150, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_019(self):
+ """
+ Test with actions=[ collect, stage, store, purge ], extensions=[],
+ peers=None, managed=True, local=True
+ """
+ actions = [ "collect", "stage", "store", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 4)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+ self.failUnlessEqual(300, actionSet.actionSet[2].index)
+ self.failUnlessEqual("store", actionSet.actionSet[2].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[2].function)
+ self.failUnlessEqual(400, actionSet.actionSet[3].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[3].function)
+
+ def testManagedPeer_020(self):
+ """
+ Test with actions=[ collect, stage, store, purge, one, two, three, four,
+ five ], extensions=[ (index 50, 150, 250, 350, 450)], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "collect", "stage", "store", "purge", "one", "two", "three", "four", "five", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ExtendedAction("two", "os.path", "isfile", 150),
+ ExtendedAction("three", "os.path", "islink", 250), ExtendedAction("four", "os.path", "isabs", 350),
+ ExtendedAction("five", "os.path", "exists", 450), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 9)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(100, actionSet.actionSet[1].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[1].function)
+ self.failUnlessEqual(150, actionSet.actionSet[2].index)
+ self.failUnlessEqual("two", actionSet.actionSet[2].name)
+ self.failUnlessEqual(isfile, actionSet.actionSet[2].function)
+ self.failUnlessEqual(200, actionSet.actionSet[3].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[3].function)
+ self.failUnlessEqual(250, actionSet.actionSet[4].index)
+ self.failUnlessEqual("three", actionSet.actionSet[4].name)
+ self.failUnlessEqual(islink, actionSet.actionSet[4].function)
+ self.failUnlessEqual(300, actionSet.actionSet[5].index)
+ self.failUnlessEqual("store", actionSet.actionSet[5].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[5].function)
+ self.failUnlessEqual(350, actionSet.actionSet[6].index)
+ self.failUnlessEqual("four", actionSet.actionSet[6].name)
+ self.failUnlessEqual(isabs, actionSet.actionSet[6].function)
+ self.failUnlessEqual(400, actionSet.actionSet[7].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[7].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[7].function)
+ self.failUnlessEqual(450, actionSet.actionSet[8].index)
+ self.failUnlessEqual("five", actionSet.actionSet[8].name)
+ self.failUnlessEqual(exists, actionSet.actionSet[8].function)
+
+ def testManagedPeer_021(self):
+ """
+ Test with actions=[ one ], extensions=[ (one, index 50) ], peers=None,
+ managed=True, local=True
+ """
+ actions = [ "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+
+ def testManagedPeer_022(self):
+ """
+ Test with actions=[ collect ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+
+ def testManagedPeer_023(self):
+ """
+ Test with actions=[ stage ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+
+ def testManagedPeer_024(self):
+ """
+ Test with actions=[ store ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(300, actionSet.actionSet[0].index)
+ self.failUnlessEqual("store", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[0].function)
+
+ def testManagedPeer_025(self):
+ """
+ Test with actions=[ purge ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(400, actionSet.actionSet[0].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[0].function)
+
+ def testManagedPeer_026(self):
+ """
+ Test with actions=[ all ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "all", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 4)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+ self.failUnlessEqual(300, actionSet.actionSet[2].index)
+ self.failUnlessEqual("store", actionSet.actionSet[2].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[2].function)
+ self.failUnlessEqual(400, actionSet.actionSet[3].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[3].function)
+
+ def testManagedPeer_027(self):
+ """
+ Test with actions=[ rebuild ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "rebuild", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(0, actionSet.actionSet[0].index)
+ self.failUnlessEqual("rebuild", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeRebuild, actionSet.actionSet[0].function)
+
+ def testManagedPeer_028(self):
+ """
+ Test with actions=[ validate ], extensions=[], no peers, managed=True,
+ local=True
+ """
+ actions = [ "validate", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(0, actionSet.actionSet[0].index)
+ self.failUnlessEqual("validate", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeValidate, actionSet.actionSet[0].function)
+
+ def testManagedPeer_029(self):
+ """
+ Test with actions=[ collect, stage ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "collect", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_030(self):
+ """
+ Test with actions=[ collect, store ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "collect", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_031(self):
+ """
+ Test with actions=[ collect, purge ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "collect", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(400, actionSet.actionSet[1].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[1].function)
+
+ def testManagedPeer_032(self):
+ """
+ Test with actions=[ stage, collect ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "stage", "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_033(self):
+ """
+ Test with actions=[ stage, stage ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "stage", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+
+ def testManagedPeer_034(self):
+ """
+ Test with actions=[ stage, store ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "stage", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_035(self):
+ """
+ Test with actions=[ stage, purge ], extensions=[], no peers,
+ managed=True, local=True
+ """
+ actions = [ "stage", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(200, actionSet.actionSet[0].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[0].function)
+ self.failUnlessEqual(400, actionSet.actionSet[1].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[1].function)
+
+ def testManagedPeer_036(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 50) ],
+ no peers, managed=True, local=True
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(100, actionSet.actionSet[1].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[1].function)
+
+ def testManagedPeer_037(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 50) ],
+ no peers, managed=True, local=True
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_038(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 150) ],
+ no peers, managed=True, local=True
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(150, actionSet.actionSet[1].index)
+ self.failUnlessEqual("one", actionSet.actionSet[1].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[1].function)
+
+ def testManagedPeer_039(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 150) ],
+ no peers, managed=True, local=True
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 2)
+ self.failUnlessEqual(150, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(300, actionSet.actionSet[1].index)
+ self.failUnlessEqual("store", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[1].function)
+
+ def testManagedPeer_040(self):
+ """
+ Test with actions=[ collect, stage, store, purge ], extensions=[],
+ no peers, managed=True, local=True
+ """
+ actions = [ "collect", "stage", "store", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 4)
+ self.failUnlessEqual(100, actionSet.actionSet[0].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[0].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[0].function)
+ self.failUnlessEqual(200, actionSet.actionSet[1].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[1].function)
+ self.failUnlessEqual(300, actionSet.actionSet[2].index)
+ self.failUnlessEqual("store", actionSet.actionSet[2].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[2].function)
+ self.failUnlessEqual(400, actionSet.actionSet[3].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[3].function)
+
+ def testManagedPeer_041(self):
+ """
+ Test with actions=[ collect, stage, store, purge, one, two, three, four,
+ five ], extensions=[ (index 50, 150, 250, 350, 450)], no peers,
+ managed=True, local=True
+ """
+ actions = [ "collect", "stage", "store", "purge", "one", "two", "three", "four", "five", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ExtendedAction("two", "os.path", "isfile", 150),
+ ExtendedAction("three", "os.path", "islink", 250), ExtendedAction("four", "os.path", "isabs", 350),
+ ExtendedAction("five", "os.path", "exists", 450), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 9)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+ self.failUnlessEqual(100, actionSet.actionSet[1].index)
+ self.failUnlessEqual("collect", actionSet.actionSet[1].name)
+ self.failUnlessEqual(executeCollect, actionSet.actionSet[1].function)
+ self.failUnlessEqual(150, actionSet.actionSet[2].index)
+ self.failUnlessEqual("two", actionSet.actionSet[2].name)
+ self.failUnlessEqual(isfile, actionSet.actionSet[2].function)
+ self.failUnlessEqual(200, actionSet.actionSet[3].index)
+ self.failUnlessEqual("stage", actionSet.actionSet[3].name)
+ self.failUnlessEqual(executeStage, actionSet.actionSet[3].function)
+ self.failUnlessEqual(250, actionSet.actionSet[4].index)
+ self.failUnlessEqual("three", actionSet.actionSet[4].name)
+ self.failUnlessEqual(islink, actionSet.actionSet[4].function)
+ self.failUnlessEqual(300, actionSet.actionSet[5].index)
+ self.failUnlessEqual("store", actionSet.actionSet[5].name)
+ self.failUnlessEqual(executeStore, actionSet.actionSet[5].function)
+ self.failUnlessEqual(350, actionSet.actionSet[6].index)
+ self.failUnlessEqual("four", actionSet.actionSet[6].name)
+ self.failUnlessEqual(isabs, actionSet.actionSet[6].function)
+ self.failUnlessEqual(400, actionSet.actionSet[7].index)
+ self.failUnlessEqual("purge", actionSet.actionSet[7].name)
+ self.failUnlessEqual(executePurge, actionSet.actionSet[7].function)
+ self.failUnlessEqual(450, actionSet.actionSet[8].index)
+ self.failUnlessEqual("five", actionSet.actionSet[8].name)
+ self.failUnlessEqual(exists, actionSet.actionSet[8].function)
+
+ def testManagedPeer_042(self):
+ """
+ Test with actions=[ one ], extensions=[ (one, index 50) ], no peers,
+ managed=True, local=True
+ """
+ actions = [ "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, True)
+ self.failUnless(len(actionSet.actionSet) == 1)
+ self.failUnlessEqual(50, actionSet.actionSet[0].index)
+ self.failUnlessEqual("one", actionSet.actionSet[0].name)
+ self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
+
+ def testManagedPeer_043(self):
+ """
+ Test with actions=[ collect ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_044(self):
+ """
+ Test with actions=[ stage ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_045(self):
+ """
+ Test with actions=[ store ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_046(self):
+ """
+ Test with actions=[ purge ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_047(self):
+ """
+ Test with actions=[ all ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "all", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failIf(actionSet.actionSet is None)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_048(self):
+ """
+ Test with actions=[ rebuild ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "rebuild", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_049(self):
+ """
+ Test with actions=[ validate ], extensions=[], no peers, managed=True,
+ local=False
+ """
+ actions = [ "validate", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_050(self):
+ """
+ Test with actions=[ collect, stage ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "collect", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_051(self):
+ """
+ Test with actions=[ collect, store ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "collect", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_052(self):
+ """
+ Test with actions=[ collect, purge ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "collect", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_053(self):
+ """
+ Test with actions=[ stage, collect ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "stage", "collect", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_054(self):
+ """
+ Test with actions=[ stage, stage ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "stage", "stage", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_055(self):
+ """
+ Test with actions=[ stage, store ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "stage", "store", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_056(self):
+ """
+ Test with actions=[ stage, purge ], extensions=[], no peers,
+ managed=True, local=False
+ """
+ actions = [ "stage", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_057(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 50) ],
+ no peers, managed=True, local=False
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_058(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 50) ],
+ no peers, managed=True, local=False
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_059(self):
+ """
+ Test with actions=[ collect, one ], extensions=[ (one, index 150) ],
+ no peers, managed=True, local=False
+ """
+ actions = [ "collect", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_060(self):
+ """
+ Test with actions=[ store, one ], extensions=[ (one, index 150) ],
+ no peers, managed=True, local=False
+ """
+ actions = [ "store", "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_061(self):
+ """
+ Test with actions=[ collect, stage, store, purge ], extensions=[],
+ no peers, managed=True, local=False
+ """
+ actions = [ "collect", "stage", "store", "purge", ]
+ extensions = ExtensionsConfig([], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_062(self):
+ """
+ Test with actions=[ collect, stage, store, purge, one, two, three, four,
+ five ], extensions=[ (index 50, 150, 250, 350, 450)], no peers,
+ managed=True, local=False
+ """
+ actions = [ "collect", "stage", "store", "purge", "one", "two", "three", "four", "five", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ExtendedAction("two", "os.path", "isfile", 150),
+ ExtendedAction("three", "os.path", "islink", 250), ExtendedAction("four", "os.path", "isabs", 350),
+ ExtendedAction("five", "os.path", "exists", 450), ], None)
+ options = OptionsConfig()
+ options.managedActions = [ "collect", "purge", "one", ]
+ peers = PeersConfig()
+ actionSet = _ActionSet(actions, extensions, options, peers, True, False)
+ self.failUnless(len(actionSet.actionSet) == 0)
+
+ def testManagedPeer_063(self):
+ """
+ Test with actions=[ one ], extensions=[ (one, index 50) ], no peers,
+ managed=True, local=False
+ """
+ actions = [ "one", ]
+ extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
+ options = Op...
[truncated message content] |
|
From: <pro...@us...> - 2007-12-18 03:10:05
|
Revision: 821
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=821&view=rev
Author: pronovic
Date: 2007-12-17 19:10:02 -0800 (Mon, 17 Dec 2007)
Log Message:
-----------
Update _ActionSet tests to work with new interface
Modified Paths:
--------------
cedar-backup2/trunk/test/clitests.py
Modified: cedar-backup2/trunk/test/clitests.py
===================================================================
--- cedar-backup2/trunk/test/clitests.py 2007-12-18 03:09:43 UTC (rev 820)
+++ cedar-backup2/trunk/test/clitests.py 2007-12-18 03:10:02 UTC (rev 821)
@@ -81,7 +81,8 @@
from os.path import isdir, isfile, islink, isabs, exists
from getopt import GetoptError
from CedarBackup2.testutil import failUnlessAssignRaises, captureOutput
-from CedarBackup2.config import ExtensionsConfig, ExtendedAction, ActionDependencies, PreActionHook, PostActionHook
+from CedarBackup2.config import OptionsConfig, ExtensionsConfig
+from CedarBackup2.config import ExtendedAction, ActionDependencies, PreActionHook, PostActionHook
from CedarBackup2.cli import _usage, _version
from CedarBackup2.cli import Options
from CedarBackup2.cli import _ActionSet
@@ -4448,7 +4449,8 @@
"""
actions = None
extensions = ExtensionsConfig(None, None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_002(self):
"""
@@ -4456,7 +4458,8 @@
"""
actions = []
extensions = ExtensionsConfig(None, None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_003(self):
"""
@@ -4464,7 +4467,8 @@
"""
actions = []
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_004(self):
"""
@@ -4472,7 +4476,8 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -4487,7 +4492,8 @@
"""
actions = [ "stage", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
@@ -4502,7 +4508,8 @@
"""
actions = [ "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
@@ -4517,7 +4524,8 @@
"""
actions = [ "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(400, actionSet.actionSet[0].index)
@@ -4532,7 +4540,8 @@
"""
actions = [ "all", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 4)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -4562,7 +4571,8 @@
"""
actions = [ "rebuild", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(0, actionSet.actionSet[0].index)
self.failUnlessEqual("rebuild", actionSet.actionSet[0].name)
@@ -4576,7 +4586,8 @@
"""
actions = [ "validate", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(0, actionSet.actionSet[0].index)
self.failUnlessEqual("validate", actionSet.actionSet[0].name)
@@ -4590,7 +4601,8 @@
"""
actions = [ "collect", "collect", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4609,7 +4621,8 @@
"""
actions = [ "collect", "stage", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4628,7 +4641,8 @@
"""
actions = [ "collect", "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4647,7 +4661,8 @@
"""
actions = [ "collect", "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4666,7 +4681,8 @@
"""
actions = [ "collect", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_016(self):
"""
@@ -4674,7 +4690,8 @@
"""
actions = [ "collect", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_017(self):
"""
@@ -4682,7 +4699,8 @@
"""
actions = [ "collect", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_018(self):
"""
@@ -4690,7 +4708,8 @@
"""
actions = [ "stage", "collect", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4709,7 +4728,8 @@
"""
actions = [ "stage", "stage", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -4728,7 +4748,8 @@
"""
actions = [ "stage", "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -4747,7 +4768,8 @@
"""
actions = [ "stage", "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -4766,7 +4788,8 @@
"""
actions = [ "stage", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_023(self):
"""
@@ -4774,7 +4797,8 @@
"""
actions = [ "stage", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_024(self):
"""
@@ -4782,7 +4806,8 @@
"""
actions = [ "stage", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_025(self):
"""
@@ -4790,7 +4815,8 @@
"""
actions = [ "store", "collect", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4809,7 +4835,8 @@
"""
actions = [ "store", "stage", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -4828,7 +4855,8 @@
"""
actions = [ "store", "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
self.failUnlessEqual("store", actionSet.actionSet[0].name)
@@ -4847,7 +4875,8 @@
"""
actions = [ "store", "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
self.failUnlessEqual("store", actionSet.actionSet[0].name)
@@ -4866,7 +4895,8 @@
"""
actions = [ "store", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_030(self):
"""
@@ -4874,7 +4904,8 @@
"""
actions = [ "store", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_031(self):
"""
@@ -4882,7 +4913,8 @@
"""
actions = [ "store", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_032(self):
"""
@@ -4890,7 +4922,8 @@
"""
actions = [ "purge", "collect", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -4909,7 +4942,8 @@
"""
actions = [ "purge", "stage", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -4928,7 +4962,8 @@
"""
actions = [ "purge", "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
self.failUnlessEqual("store", actionSet.actionSet[0].name)
@@ -4947,7 +4982,8 @@
"""
actions = [ "purge", "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(400, actionSet.actionSet[0].index)
self.failUnlessEqual("purge", actionSet.actionSet[0].name)
@@ -4966,7 +5002,8 @@
"""
actions = [ "purge", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_037(self):
"""
@@ -4974,7 +5011,8 @@
"""
actions = [ "purge", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_038(self):
"""
@@ -4982,7 +5020,8 @@
"""
actions = [ "purge", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_039(self):
"""
@@ -4990,7 +5029,8 @@
"""
actions = [ "all", "collect", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_040(self):
"""
@@ -4998,7 +5038,8 @@
"""
actions = [ "all", "stage", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_041(self):
"""
@@ -5006,7 +5047,8 @@
"""
actions = [ "all", "store", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_042(self):
"""
@@ -5014,7 +5056,8 @@
"""
actions = [ "all", "purge", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_043(self):
"""
@@ -5022,7 +5065,8 @@
"""
actions = [ "all", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_044(self):
"""
@@ -5030,7 +5074,8 @@
"""
actions = [ "all", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_045(self):
"""
@@ -5038,7 +5083,8 @@
"""
actions = [ "all", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_046(self):
"""
@@ -5046,7 +5092,8 @@
"""
actions = [ "rebuild", "collect", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_047(self):
"""
@@ -5054,7 +5101,8 @@
"""
actions = [ "rebuild", "stage", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_048(self):
"""
@@ -5062,7 +5110,8 @@
"""
actions = [ "rebuild", "store", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_049(self):
"""
@@ -5070,7 +5119,8 @@
"""
actions = [ "rebuild", "purge", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_050(self):
"""
@@ -5078,7 +5128,8 @@
"""
actions = [ "rebuild", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_051(self):
"""
@@ -5086,7 +5137,8 @@
"""
actions = [ "rebuild", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_052(self):
"""
@@ -5094,7 +5146,8 @@
"""
actions = [ "rebuild", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_053(self):
"""
@@ -5102,7 +5155,8 @@
"""
actions = [ "validate", "collect", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_054(self):
"""
@@ -5110,7 +5164,8 @@
"""
actions = [ "validate", "stage", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_055(self):
"""
@@ -5118,7 +5173,8 @@
"""
actions = [ "validate", "store", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_056(self):
"""
@@ -5126,7 +5182,8 @@
"""
actions = [ "validate", "purge", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_057(self):
"""
@@ -5134,7 +5191,8 @@
"""
actions = [ "validate", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_058(self):
"""
@@ -5142,7 +5200,8 @@
"""
actions = [ "validate", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_059(self):
"""
@@ -5150,7 +5209,8 @@
"""
actions = [ "validate", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_060(self):
"""
@@ -5158,7 +5218,8 @@
"""
actions = [ "bogus", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_061(self):
"""
@@ -5166,7 +5227,8 @@
"""
actions = [ "bogus", "collect", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_062(self):
"""
@@ -5174,7 +5236,8 @@
"""
actions = [ "bogus", "stage", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_063(self):
"""
@@ -5182,7 +5245,8 @@
"""
actions = [ "bogus", "store", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_064(self):
"""
@@ -5190,7 +5254,8 @@
"""
actions = [ "bogus", "purge", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_065(self):
"""
@@ -5198,7 +5263,8 @@
"""
actions = [ "bogus", "all", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_066(self):
"""
@@ -5206,7 +5272,8 @@
"""
actions = [ "bogus", "rebuild", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_067(self):
"""
@@ -5214,7 +5281,8 @@
"""
actions = [ "bogus", "validate", ]
extensions = ExtensionsConfig([], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_068(self):
"""
@@ -5222,7 +5290,8 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5241,7 +5310,8 @@
"""
actions = [ "stage", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual(isdir, actionSet.actionSet[0].function)
@@ -5260,7 +5330,8 @@
"""
actions = [ "store", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5279,7 +5350,8 @@
"""
actions = [ "purge", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5298,7 +5370,8 @@
"""
actions = [ "all", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_073(self):
"""
@@ -5306,7 +5379,8 @@
"""
actions = [ "rebuild", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_074(self):
"""
@@ -5314,7 +5388,8 @@
"""
actions = [ "validate", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_075(self):
"""
@@ -5322,7 +5397,8 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5341,7 +5417,8 @@
"""
actions = [ "stage", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(150, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5360,7 +5437,8 @@
"""
actions = [ "store", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(150, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5379,7 +5457,8 @@
"""
actions = [ "purge", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(150, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5398,7 +5477,8 @@
"""
actions = [ "all", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_080(self):
"""
@@ -5406,7 +5486,8 @@
"""
actions = [ "rebuild", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_081(self):
"""
@@ -5414,7 +5495,8 @@
"""
actions = [ "validate", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 150), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_082(self):
"""
@@ -5422,7 +5504,8 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5441,7 +5524,8 @@
"""
actions = [ "stage", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -5460,7 +5544,8 @@
"""
actions = [ "store", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(250, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5479,7 +5564,8 @@
"""
actions = [ "purge", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(250, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5498,7 +5584,8 @@
"""
actions = [ "all", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_087(self):
"""
@@ -5506,7 +5593,8 @@
"""
actions = [ "rebuild", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_088(self):
"""
@@ -5514,7 +5602,8 @@
"""
actions = [ "validate", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 250), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_089(self):
"""
@@ -5522,7 +5611,8 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5541,7 +5631,8 @@
"""
actions = [ "stage", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -5560,7 +5651,8 @@
"""
actions = [ "store", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
self.failUnlessEqual("store", actionSet.actionSet[0].name)
@@ -5579,7 +5671,8 @@
"""
actions = [ "purge", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(350, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5598,7 +5691,8 @@
"""
actions = [ "all", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_094(self):
"""
@@ -5606,7 +5700,8 @@
"""
actions = [ "rebuild", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_095(self):
"""
@@ -5614,7 +5709,8 @@
"""
actions = [ "validate", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 350), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_096(self):
"""
@@ -5622,7 +5718,8 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5641,7 +5738,8 @@
"""
actions = [ "stage", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(200, actionSet.actionSet[0].index)
self.failUnlessEqual("stage", actionSet.actionSet[0].name)
@@ -5660,7 +5758,8 @@
"""
actions = [ "store", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(300, actionSet.actionSet[0].index)
self.failUnlessEqual("store", actionSet.actionSet[0].name)
@@ -5679,7 +5778,8 @@
"""
actions = [ "purge", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(400, actionSet.actionSet[0].index)
self.failUnlessEqual("purge", actionSet.actionSet[0].name)
@@ -5698,7 +5798,8 @@
"""
actions = [ "all", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_101(self):
"""
@@ -5706,7 +5807,8 @@
"""
actions = [ "rebuild", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_102(self):
"""
@@ -5714,7 +5816,8 @@
"""
actions = [ "validate", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, None)
+ options = OptionsConfig()
+ self.failUnlessRaises(ValueError, _ActionSet, actions, extensions, options, None, False, True)
def testActionSet_103(self):
"""
@@ -5722,7 +5825,8 @@
"""
actions = [ "one", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(450, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5741,7 +5845,8 @@
"""
actions = [ "collect", "stage", "store", "purge", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 4)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5770,7 +5875,8 @@
"""
actions = [ "stage", "purge", "collect", "store", ]
extensions = ExtensionsConfig([], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 4)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
self.failUnlessEqual("collect", actionSet.actionSet[0].name)
@@ -5801,7 +5907,8 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ExtendedAction("two", "os.path", "isfile", 150),
ExtendedAction("three", "os.path", "islink", 250), ExtendedAction("four", "os.path", "isabs", 350),
ExtendedAction("five", "os.path", "exists", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 9)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5857,7 +5964,8 @@
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ExtendedAction("two", "os.path", "isfile", 150),
ExtendedAction("three", "os.path", "islink", 250), ExtendedAction("four", "os.path", "isabs", 350),
ExtendedAction("five", "os.path", "exists", 450), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 9)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5911,7 +6019,8 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- actionSet = _ActionSet(actions, extensions, None)
+ options = OptionsConfig()
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -5925,8 +6034,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = []
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = []
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -5941,8 +6051,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = [ PreActionHook("stage", "something") ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("stage", "something") ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -5957,8 +6068,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = [ PostActionHook("stage", "something") ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("stage", "something") ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -5973,8 +6085,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = [ PreActionHook("collect", "something") ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("collect", "something") ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -5989,8 +6102,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = [ PostActionHook("collect", "something") ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("collect", "something") ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -6005,8 +6119,9 @@
"""
actions = [ "collect", ]
extensions = ExtensionsConfig([], None)
- hooks = [ PreActionHook("collect", "something1"), PostActionHook("collect", "something2") ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("collect", "something1"), PostActionHook("collect", "something2") ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failIf(actionSet.actionSet is None)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(100, actionSet.actionSet[0].index)
@@ -6021,8 +6136,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = []
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = []
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6036,8 +6152,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PreActionHook("store", "whatever"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("store", "whatever"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6051,8 +6168,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("store", "whatever"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("store", "whatever"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6066,8 +6184,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PreActionHook("one", "extension"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("one", "extension"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6081,8 +6200,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("one", "extension"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("one", "extension"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6096,8 +6216,9 @@
"""
actions = [ "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("one", "extension2"), PreActionHook("one", "extension1"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("one", "extension2"), PreActionHook("one", "extension1"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 1)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6111,8 +6232,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = []
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = []
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6131,8 +6253,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PreActionHook("purge", "rm -f"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("purge", "rm -f"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6151,8 +6274,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("purge", "rm -f"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("purge", "rm -f"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6171,8 +6295,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PreActionHook("collect", "something"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("collect", "something"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6191,8 +6316,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("collect", "something"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("collect", "something"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6211,8 +6337,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PreActionHook("one", "extension"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PreActionHook("one", "extension"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6231,8 +6358,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("one", "extension"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options = OptionsConfig()
+ options.hooks = [ PostActionHook("one", "extension"), ]
+ actionSet = _ActionSet(actions, extensions, options, None, False, True)
self.failUnless(len(actionSet.actionSet) == 2)
self.failUnlessEqual(50, actionSet.actionSet[0].index)
self.failUnlessEqual("one", actionSet.actionSet[0].name)
@@ -6251,8 +6379,9 @@
"""
actions = [ "collect", "one", ]
extensions = ExtensionsConfig([ ExtendedAction("one", "os.path", "isdir", 50), ], None)
- hooks = [ PostActionHook("one", "extension"), PreActionHook("collect", "something"), PostActionHook("stage", "whatever"), ]
- actionSet = _ActionSet(actions, extensions, hooks)
+ options =...
[truncated message content] |
|
From: <pro...@us...> - 2007-12-18 03:09:44
|
Revision: 820
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=820&view=rev
Author: pronovic
Date: 2007-12-17 19:09:43 -0800 (Mon, 17 Dec 2007)
Log Message:
-----------
First pass at enhancing _ActionSet to support managed actions
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-18 02:42:22 UTC (rev 819)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-18 03:09:43 UTC (rev 820)
@@ -224,11 +224,21 @@
logger.debug("Using user-supplied configuration file.")
configPath = options.config
+ executeLocal = True
+ if options.managedOnly:
+ executeLocal = False
+ executeManaged = True
+ if options.managed:
+ executeManaged = True
+ logger.debug("Execute local actions: %s" % executeLocal)
+ logger.debug("Execute managed actions: %s" % executeManaged)
+
try:
logger.info("Configuration path is [%s]" % configPath)
config = Config(xmlPath=configPath)
setupPathResolver(config)
- actionSet = _ActionSet(options.actions, config.extensions, config.options.hooks)
+ actionSet = _ActionSet(options.actions, config.extensions, config.options,
+ config.peers, executeManaged, executeLocal)
except Exception, e:
logger.error("Error reading or handling configuration: %s" % e)
logger.info("Cedar Backup run completed with status 4.")
@@ -278,11 +288,16 @@
(if set).
@note: The comparison operators for this class have been implemented to only
- compare based on the index value, and ignore all other values. This is so
- that the action set list can be easily sorted by index.
+ compare based on the index and SORT_ORDER value, and ignore all other
+ values. This is so that the action set list can be easily sorted first by
+ type (_ActionItem before _ManagedActionItem) and then by index within type.
+ @cvar SORT_ORDER: Defines a sort order to order properly between types.
+
@sort: __init__, index, module, function
"""
+
+ SORT_ORDER = 0
def __init__(self, index, name, preHook, postHook, function):
"""
@@ -312,6 +327,11 @@
"""
if other is None:
return 1
+ if self.SORT_ORDER != other.SORT_ORDER:
+ if self.SORT_ORDER < other.SORT_ORDER:
+ return -1
+ else:
+ return 1
if self.index != other.index:
if self.index < other.index:
return -1
@@ -360,6 +380,83 @@
executeCommand(command=fields[0:1], args=fields[1:])
+###########################
+# _ManagedActionItem class
+###########################
+
+class _ManagedActionItem(object):
+
+ """
+ Class representing a single action to be executed on a managed peer.
+
+ This class represents a single named action to be executed, and understands
+ how to execute that action.
+
+ Actions to be executed on a managed peer rely on peer configuration and
+ on the full-backup flag. All other configuration takes place on the remote
+ peer itself.
+
+ @note: The comparison operators for this class have been implemented to only
+ compare based on the index and SORT_ORDER value, and ignore all other
+ values. This is so that the action set list can be easily sorted first by
+ type (_ActionItem before _ManagedActionItem) and then by index within type.
+
+ @cvar SORT_ORDER: Defines a sort order to order properly between types.
+ """
+
+ SORT_ORDER = 1
+
+ def __init__(self, index, name, remotePeers):
+ """
+ Default constructor.
+
+ @param index: Index of the item (or C{None}).
+ @param name: Name of the action that is being executed.
+ @param remotePeers: List of remote peers on which to execute the action.
+ """
+ self.index = index
+ self.name = name
+ self.remotePeers = remotePeers
+
+ def __cmp__(self, other):
+ """
+ Definition of equals operator for this class.
+ The only thing we compare is the item's index.
+ @param other: Other object to compare to.
+ @return: -1/0/1 depending on whether self is C{<}, C{=} or C{>} other.
+ """
+ if other is None:
+ return 1
+ if self.SORT_ORDER != other.SORT_ORDER:
+ if self.SORT_ORDER < other.SORT_ORDER:
+ return -1
+ else:
+ return 1
+ if self.index != other.index:
+ if self.index < other.index:
+ return -1
+ else:
+ return 1
+ return 0
+
+ def executeAction(self, configPath, options, config):
+ """
+ Executes the managed action associated with an item.
+
+ @note: Only options.full is actually used. The rest of
+ the arguments exist to satisfy the ActionItem iterface.
+
+ @param configPath: Path to configuration file on disk.
+ @param options: Command-line options to be passed to action.
+ @param config: Parsed configuration to be passed to action.
+
+ @raise Exception: If there is a problem executing the action.
+ """
+ for peer in remotePeer:
+ log.debug("Executing managed action [%s] on peer [%s]." % (self.name, peer.name))
+ peer.executeManagedAction(self.name, options.full)
+
+
###################
# _ActionSet class
###################
@@ -367,9 +464,9 @@
class _ActionSet(object):
"""
- Class representing a set of actions to be executed.
+ Class representing a set of local actions to be executed.
- This class does three different things. First, it ensures that the actions
+ This class does four different things. First, it ensures that the actions
specified on the command-line are sensible. The command-line can only list
either built-in actions or extended actions specified in configuration.
Also, certain actions (in L{NONCOMBINE_ACTIONS}) cannot be combined with
@@ -385,10 +482,13 @@
are executed immediately before their associated action, and post-action
hooks are executed immediately after their associated action.
+ Finally, the class properly interleaves local and managed actions so that
+ the same action gets executed first locally and then on managed peers.
+
@sort: __init__, executeActions
"""
- def __init__(self, actions, extensions, hooks):
+ def __init__(self, actions, extensions, options, peers, managed, local):
"""
Constructor for the C{_ActionSet} class.
@@ -401,25 +501,31 @@
- C{preHookMap}: Mapping from action name to post C{ActionHook}
- C{functionMap}: Mapping from action name to Python function
- C{indexMap}: Mapping from action name to execution index
+ - C{peerMap}: Mapping from action name to set of C{RemotePeer}
- C{actionMap}: Mapping from action name to C{_ActionItem}
Once these data structures are set up, the command line is validated to
make sure only valid actions have been requested, and in a sensible
combination. Then, all of the data is used to build C{self.actionSet},
- the set of C{_ActionItem} object to be executed by C{executeActions()}.
+ the set action items to be executed by C{executeActions()}. This list
+ might contain either C{_ActionItem} or C{_ManagedActionItem}.
@param actions: Names of actions specified on the command-line.
@param extensions: Extended action configuration (i.e. config.extensions)
- @param hooks: List of pre- and post-action hooks (i.e. config.options.hooks)
+ @param options: Options configuration (i.e. config.options)
+ @param peers: Peers configuration (i.e. config.peers)
+ @param managed: Whether to include managed actions in the set
+ @param local: Whether to include local actions in the set
@raise ValueError: If one of the specified actions is invalid.
- @raise ValueError:
"""
extensionNames = _ActionSet._deriveExtensionNames(extensions)
- (preHookMap, postHookMap) = _ActionSet._buildHookMaps(hooks)
+ (preHookMap, postHookMap) = _ActionSet._buildHookMaps(options.hooks)
functionMap = _ActionSet._buildFunctionMap(extensions)
indexMap = _ActionSet._buildIndexMap(extensions)
- actionMap = _ActionSet._buildActionMap(extensionNames, functionMap, indexMap, preHookMap, postHookMap)
+ peerMap = _ActionSet._buildPeerMap(options, peers)
+ actionMap = _ActionSet._buildActionMap(managed, local, extensionNames, functionMap,
+ indexMap, preHookMap, postHookMap, peerMap)
_ActionSet._validateActions(actions, extensionNames)
self.actionSet = _ActionSet._buildActionSet(actions, actionMap)
@@ -560,22 +666,30 @@
return indexMap
_buildIndexMap = staticmethod(_buildIndexMap)
- def _buildActionMap(extensionNames, functionMap, indexMap, preHookMap, postHookMap):
+ def _buildActionMap(managed, local, extensionNames, functionMap, indexMap, preHookMap, postHookMap, peerMap):
"""
- Builds a mapping from action name to list of C{_ActionItem} objects.
+ Builds a mapping from action name to list of action items.
- In most cases, the mapping from action name to C{_ActionItem} is 1:1. The exception
- is the "all" action, which is a special case. However, a list is returned in all
- cases, just for consistency later.
+ We build either C{_ActionItem} or C{_ManagedActionItem} objects here.
- Each C{_ActionItem} will be created with a proper function reference and
- index value for execution ordering.
+ In most cases, the mapping from action name to C{_ActionItem} is 1:1.
+ The exception is the "all" action, which is a special case. However, a
+ list is returned in all cases, just for consistency later. Each
+ C{_ActionItem} will be created with a proper function reference and index
+ value for execution ordering.
+ The mapping from action name to C{_ManagedActionItem} is always 1:1.
+ Each managed action item contains a list of peers which the action should
+ be executed.
+
+ @param managed: Whether to include managed actions in the set
+ @param local: Whether to include local actions in the set
@param extensionNames: List of valid extended action names
@param functionMap: Dictionary mapping action name to Python function
@param indexMap: Dictionary mapping action name to integer execution index
@param preHookMap: Dictionary mapping action name to pre hooks (if any) for the action
@param postHookMap: Dictionary mapping action name to post hooks (if any) for the action
+ @param peerMap: Dictionary mapping action name to list of remote peers on which to execute the action
@return: Dictionary mapping action name to list of C{_ActionItem} objects.
"""
@@ -584,12 +698,50 @@
if name != 'all': # do this one later
function = functionMap[name]
index = indexMap[name]
- (preHook, postHook) = _ActionSet._deriveHooks(name, preHookMap, postHookMap)
- actionMap[name] = [ _ActionItem(index, name, preHook, postHook, function), ]
+ actionMap[name] = []
+ if local:
+ (preHook, postHook) = _ActionSet._deriveHooks(name, preHookMap, postHookMap)
+ actionMap[name].append(_ActionItem(index, name, preHook, postHook, function))
+ if managed:
+ if name in peerMap:
+ actionMap[name].append(_ManagedActionItem(index, name, peerMap[name]))
actionMap['all'] = actionMap['collect'] + actionMap['stage'] + actionMap['store'] + actionMap['purge']
return actionMap
_buildActionMap = staticmethod(_buildActionMap)
+ def _buildPeerMap(options, peers):
+ """
+ Build a mapping from action name to list of remote peers.
+
+ There will be one entry in the mapping for each managed action. If there
+ are no managed peers, the mapping will be empty. Only managed actions
+ will be listed in the mapping.
+
+ @param options: Option configuration (i.e. config.options)
+ @param peers: Peers configuration (i.e. config.peers)
+ """
+ peerMap = {}
+ if peers is not None:
+ if peers.remotePeers is not None:
+ for peer in peers.remotePeers:
+ if peer.managed:
+ remoteUser = _ActionSet._getRemoteUser(config, peer)
+ localUser = _ActionSet._getRemoteUser(config, peer)
+ rshCommand = _ActionSet._getRshCommand(config, peer)
+ cbackCommand = _ActionSet._getCbackCommand(config, peer)
+ managedActions = _ActionSet._getManagedActions(config, peer)
+ remotePeer = RemotePeer(peer.name, None, options.workingDir, remoteUser, None,
+ options.backupUser, rshCommand, cbackCommand)
+ if managedActions is not None:
+ for managedAction in managedActions:
+ if managedAction in peerMap:
+ if remotePeer not in peerMap[managedAction]:
+ peerMap[managedAction].append(remotePeer)
+ else:
+ peerMap[managedAction] = [ remotePeer, ]
+ return peerMap
+ _buildPeerMap = staticmethod(_buildPeerMap)
+
def _deriveHooks(action, preHookDict, postHookDict):
"""
Derive pre- and post-action hooks, if any, associated with named action.
@@ -667,10 +819,63 @@
@raise Exception: If there is a problem executing the actions.
"""
+ log.debug("Executing local actions.")
for actionItem in self.actionSet:
actionItem.executeAction(configPath, options, config)
+ def _getRemoteUser(config, remotePeer):
+ """
+ Gets the remote user associated with a remote peer.
+ Use peer's if possible, otherwise take from options section.
+ @param config: Config object.
+ @param remotePeer: Configuration-style remote peer object.
+ @return: Name of remote user associated with remote peer.
+ """
+ if remotePeer.remoteUser is None:
+ return config.options.backupUser
+ return remotePeer.remoteUser
+ _getRemoteUser = staticmethod(_getRemoteUser)
+ def _getRshCommand(config, remotePeer):
+ """
+ Gets the RSH command associated with a remote peer.
+ Use peer's if possible, otherwise take from options section.
+ @param config: Config object.
+ @param remotePeer: Configuration-style remote peer object.
+ @return: RSH command associated with remote peer.
+ """
+ if remotePeer.rshCommand is None:
+ return config.options.rshCommand
+ return remotePeer.rshCommand
+ _getRshCommand = staticmethod(_getRshCommand)
+
+ def _getCbackCommand(config, remotePeer):
+ """
+ Gets the cback command associated with a remote peer.
+ Use peer's if possible, otherwise take from options section.
+ @param config: Config object.
+ @param remotePeer: Configuration-style remote peer object.
+ @return: cback command associated with remote peer.
+ """
+ if remotePeer.cbackCommand is None:
+ return config.options.cbackCommand
+ return remotePeer.cbackCommand
+ _getCbackCommand = staticmethod(_getCbackCommand)
+
+ def _getManagedActions(config, remotePeer):
+ """
+ Gets the managed actions list associated with a remote peer.
+ Use peer's if possible, otherwise take from options section.
+ @param config: Config object.
+ @param remotePeer: Configuration-style remote peer object.
+ @return: Set of managed actions associated with remote peer.
+ """
+ if remotePeer.managedActions is None:
+ return config.options.managedActions
+ return remotePeer.managedActions
+ _getManagedActions = staticmethod(_getManagedActions)
+
+
#######################################################################
# Utility functions
#######################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-18 02:42:24
|
Revision: 819
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=819&view=rev
Author: pronovic
Date: 2007-12-17 18:42:22 -0800 (Mon, 17 Dec 2007)
Log Message:
-----------
Implement executeRemoteCommand() and executeManagedAction
Modified Paths:
--------------
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2007-12-18 02:42:07 UTC (rev 818)
+++ cedar-backup2/trunk/Changelog 2007-12-18 02:42:22 UTC (rev 819)
@@ -7,6 +7,7 @@
- Modify stage process to take peers list from peers section (if available)
- Add new configuration in options and remote peers to support remote shells
- Updated user manual to discuss managed backup concept and configuration
+ - Add executeRemoteCommand() and executeManagedAction() on peer.RemotePeer
Version 2.14.0 19 Sep 2007
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-18 02:42:11
|
Revision: 818
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=818&view=rev
Author: pronovic
Date: 2007-12-17 18:42:07 -0800 (Mon, 17 Dec 2007)
Log Message:
-----------
Implement executeRemoteCommand() and executeManagedAction
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/peer.py
cedar-backup2/trunk/test/peertests.py
Modified: cedar-backup2/trunk/CedarBackup2/peer.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-16 18:43:47 UTC (rev 817)
+++ cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-18 02:42:07 UTC (rev 818)
@@ -8,7 +8,7 @@
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
-# Copyright (c) 2004-2006 Kenneth J. Pronovici.
+# Copyright (c) 2004-2007 Kenneth J. Pronovici.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or
@@ -72,6 +72,9 @@
logger = logging.getLogger("CedarBackup2.log.peer")
DEF_RCP_COMMAND = [ "/usr/bin/scp", "-B", "-q", "-C" ]
+DEF_RSH_COMMAND = [ "/usr/bin/ssh", ]
+DEF_CBACK_COMMAND = "/usr/bin/cback"
+
DEF_COLLECT_INDICATOR = "cback.collect"
DEF_STAGE_INDICATOR = "cback.stage"
@@ -424,23 +427,25 @@
interface shared with the C{LocalPeer} class.
@sort: __init__, stagePeer, checkCollectIndicator, writeStageIndicator,
- _getDirContents, _copyRemoteDir, _copyRemoteFile, _pushLocalFile,
- name, collectDir, remoteUser, rcpCommand
+ executeRemoteCommand, executeManagedAction, _getDirContents,
+ _copyRemoteDir, _copyRemoteFile, _pushLocalFile, name, collectDir,
+ remoteUser, rcpCommand, rshCommand, cbackCommand
"""
##############
# Constructor
##############
- def __init__(self, name, collectDir, workingDir, remoteUser, rcpCommand=None, localUser=None):
+ def __init__(self, name, collectDir=None, workingDir=None, remoteUser=None,
+ rcpCommand=None, localUser=None, rshCommand=None, cbackCommand=None):
"""
Initializes a remote backup peer.
- @note: If provided, the rcp command will eventually be parsed into a list
- of strings suitable for passing to C{util.executeCommand} in order to
- avoid security holes related to shell interpolation. This parsing will
- be done by the L{util.splitCommandLine} function. See the documentation
- for that function for some important notes about its limitations.
+ @note: If provided, each command will eventually be parsed into a list of
+ strings suitable for passing to C{util.executeCommand} in order to avoid
+ security holes related to shell interpolation. This parsing will be
+ done by the L{util.splitCommandLine} function. See the documentation for
+ that function for some important notes about its limitations.
@param name: Name of the backup peer
@type name: String, must be a valid DNS hostname
@@ -452,14 +457,20 @@
@type workingDir: String representing an absolute path on the current host.
@param remoteUser: Name of the Cedar Backup user on the remote peer
- @type remoteUser: String representing a username, valid via the copy command
+ @type remoteUser: String representing a username, valid via remote shell to the peer
+ @param localUser: Name of the Cedar Backup user on the current host
+ @type localUser: String representing a username, valid on the current host
+
@param rcpCommand: An rcp-compatible copy command to use for copying files from the peer
@type rcpCommand: String representing a system command including required arguments
- @param localUser: Name of the Cedar Backup user on the current host
- @type localUser: String representing a username, valid on the current host
+ @param rshCommand: An rsh-compatible copy command to use for remote shells to the peer
+ @type rshCommand: String representing a system command including required arguments
+ @param cbackCommand: A chack-compatible command to use for executing managed actions
+ @type cbackCommand: String representing a system command including required arguments
+
@raise ValueError: If collect directory is not an absolute path
"""
self._name = None
@@ -469,12 +480,17 @@
self._localUser = None
self._rcpCommand = None
self._rcpCommandList = None
+ self._rshCommand = None
+ self._rshCommandList = None
+ self._cbackCommand = None
self.name = name
self.collectDir = collectDir
self.workingDir = workingDir
self.remoteUser = remoteUser
self.localUser = localUser
self.rcpCommand = rcpCommand
+ self.rshCommand = rshCommand
+ self.cbackCommand = cbackCommand
#############
@@ -505,8 +521,9 @@
@raise ValueError: If the value is C{None} or is not an absolute path.
@raise ValueError: If the value cannot be encoded properly.
"""
- if value is None or not os.path.isabs(value):
- raise ValueError("Collect directory must be an absolute path.")
+ if value is not None:
+ if not os.path.isabs(value):
+ raise ValueError("Collect directory must be an absolute path.")
self._collectDir = encodePath(value)
def _getCollectDir(self):
@@ -522,8 +539,9 @@
@raise ValueError: If the value is C{None} or is not an absolute path.
@raise ValueError: If the value cannot be encoded properly.
"""
- if value is None or not os.path.isabs(value):
- raise ValueError("Working directory must be an absolute path.")
+ if value is not None:
+ if not os.path.isabs(value):
+ raise ValueError("Working directory must be an absolute path.")
self._workingDir = encodePath(value)
def _getWorkingDir(self):
@@ -597,12 +615,70 @@
"""
return self._rcpCommand
+ def _setRshCommand(self, value):
+ """
+ Property target to set the rsh command.
+
+ The value must be a non-empty string or C{None}. Its value is stored in
+ the two forms: "raw" as provided by the client, and "parsed" into a list
+ suitable for being passed to L{util.executeCommand} via
+ L{util.splitCommandLine}.
+
+ However, all the caller will ever see via the property is the actual
+ value they set (which includes seeing C{None}, even if we translate that
+ internally to C{DEF_RSH_COMMAND}). Internally, we should always use
+ C{self._rshCommandList} if we want the actual command list.
+
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is None:
+ self._rshCommand = None
+ self._rshCommandList = DEF_RSH_COMMAND
+ else:
+ if len(value) >= 1:
+ self._rshCommand = value
+ self._rshCommandList = splitCommandLine(self._rshCommand)
+ else:
+ raise ValueError("The rsh command must be a non-empty string.")
+
+ def _getRshCommand(self):
+ """
+ Property target used to get the rsh command.
+ """
+ return self._rshCommand
+
+ def _setCbackCommand(self, value):
+ """
+ Property target to set the cback command.
+
+ The value must be a non-empty string or C{None}. Unlike the other
+ command, this value is only stored in the "raw" form provided by the
+ client.
+
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is None:
+ self._cbackCommand = None
+ else:
+ if len(value) >= 1:
+ self._cbackCommand = value
+ else:
+ raise ValueError("The cback command must be a non-empty string.")
+
+ def _getCbackCommand(self):
+ """
+ Property target used to get the cback command.
+ """
+ return self._cbackCommand
+
name = property(_getName, _setName, None, "Name of the peer (a valid DNS hostname).")
collectDir = property(_getCollectDir, _setCollectDir, None, "Path to the peer's collect directory (an absolute local path).")
workingDir = property(_getWorkingDir, _setWorkingDir, None, "Path to the peer's working directory (an absolute local path).")
remoteUser = property(_getRemoteUser, _setRemoteUser, None, "Name of the Cedar Backup user on the remote peer.")
localUser = property(_getLocalUser, _setLocalUser, None, "Name of the Cedar Backup user on the current host.")
rcpCommand = property(_getRcpCommand, _setRcpCommand, None, "An rcp-compatible copy command to use for copying files.")
+ rshCommand = property(_getRshCommand, _setRshCommand, None, "An rsh-compatible command to use for remote shells to the peer.")
+ cbackCommand = property(_getCbackCommand, _setCbackCommand, None, "A chack-compatible command to use for executing managed actions.")
#################
@@ -663,7 +739,6 @@
if count == 0:
raise IOError("Did not copy any files from local peer.")
return count
-
def checkCollectIndicator(self, collectIndicator=None):
"""
@@ -760,7 +835,33 @@
os.remove(sourceFile)
except: pass
+ def executeRemoteCommand(self, command):
+ """
+ Executes a command on the peer via remote shell.
+ @param command: Command to execute
+ @type command: String command-line suitable for use with rsh.
+
+ @raise IOError: If there is an error executing the command on the remote peer.
+ """
+ RemotePeer._executeRemoteCommand(self.remoteUser, self.localUser,
+ self.name, self._rshCommand,
+ self._rshCommandList, command)
+
+ def executeManagedAction(self, action, fullBackup):
+ """
+ Executes a managed action on this peer.
+
+ @param action: Name of the action to execute.
+ @param fullBackup: Whether a full backup should be executed.
+
+ @raise IOError: If there is an error executing the action on the remote peer.
+ """
+ log.debug("Executing managed action [%s] on peer [%s]." % (action, self.name))
+ command = RemotePeer._buildCbackCommand(self.cbackCommand, action, fullBackup)
+ self.executeRemoteCommand(command)
+
+
##################
# Private methods
##################
@@ -1036,3 +1137,67 @@
raise IOError("Error (%d) copying [%s] to remote host (using no local user)." % (result, sourceFile))
_pushLocalFile = staticmethod(_pushLocalFile)
+ def _executeRemoteCommand(remoteUser, localUser, remoteHost, rshCommand, rshCommandList, remoteCommand):
+ """
+ Executes a command on the peer via remote shell.
+
+ @param remoteUser: Name of the Cedar Backup user on the remote peer
+ @type remoteUser: String representing a username, valid on the remote host
+
+ @param localUser: Name of the Cedar Backup user on the current host
+ @type localUser: String representing a username, valid on the current host
+
+ @param remoteHost: Hostname of the remote peer
+ @type remoteHost: String representing a hostname, accessible via the copy command
+
+ @param rshCommand: An rsh-compatible copy command to use for remote shells to the peer
+ @type rshCommand: String representing a system command including required arguments
+
+ @param rshCommandList: An rsh-compatible copy command to use for remote shells to the peer
+ @type rshCommandList: Command as a list to be passed to L{util.executeCommand}
+
+ @param remoteCommand: The command to be executed on the remote host
+ @type remoteCommand: String command-line, with no special shell characters ($, <, etc.)
+
+ @raise IOError: If there is an error executing the remote command
+ """
+ if localUser is not None:
+ try:
+ if os.getuid() != 0:
+ raise IOError("Only root can remote shell as another user.")
+ except AttributeError: pass
+ command = resolveCommand(SU_COMMAND)
+ actualCommand = "%s %s@%s '%s'" % (rshCommand, remoteUser, remoteHost, remoteCommand)
+ result = executeCommand(command, [localUser, "-c", actualCommand])[0]
+ if result != 0:
+ raise IOError("Error (%d) executing command on remote host as local user [%s]." % (result, localUser))
+ else:
+ command = resolveCommand(rshCommandList)
+ result = executeCommand(command, ["%s@%s" % (remoteUser, remoteHost), "%s" % remoteCommand])[0]
+ if result != 0:
+ raise IOError("Error (%d) executing command on remote host (using no local user)." % result)
+ _executeRemoteCommand = staticmethod(_executeRemoteCommand)
+
+ def _buildCbackCommand(cbackCommand, action, fullBackup):
+ """
+ Builds a Cedar Backup command line for the named action.
+
+ @note: If the cback command is None, then DEF_CBACK_COMMAND is used.
+
+ @param cbackCommand: cback command to execute, including required options
+ @param action: Name of the action to execute.
+ @param fullBackup: Whether a full backup should be executed.
+
+ @return: String suitable for passing to L{_executeRemoteCommand} as remoteCommand.
+ @raise ValueError: If action is None.
+ """
+ if action is None:
+ raise ValueError("Action cannot be None.")
+ if cbackCommand is None:
+ cbackCommand = DEF_CBACK_COMMAND
+ if fullBackup:
+ return "%s --full %s" % (cbackCommand, action)
+ else:
+ return "%s %s" % (cbackCommand, action)
+ _buildCbackCommand = staticmethod(_buildCbackCommand)
+
Modified: cedar-backup2/trunk/test/peertests.py
===================================================================
--- cedar-backup2/trunk/test/peertests.py 2007-12-16 18:43:47 UTC (rev 817)
+++ cedar-backup2/trunk/test/peertests.py 2007-12-18 02:42:07 UTC (rev 818)
@@ -9,7 +9,7 @@
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
-# Copyright (c) 2004-2006 Kenneth J. Pronovici.
+# Copyright (c) 2004-2007 Kenneth J. Pronovici.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or
@@ -102,7 +102,8 @@
from CedarBackup2.testutil import getMaskAsMode, getLogin, runningAsRoot
from CedarBackup2.testutil import platformSupportsPermissions, platformWindows
from CedarBackup2.peer import LocalPeer, RemotePeer
-from CedarBackup2.peer import DEF_RCP_COMMAND, DEF_COLLECT_INDICATOR, DEF_STAGE_INDICATOR
+from CedarBackup2.peer import DEF_RCP_COMMAND, DEF_RSH_COMMAND
+from CedarBackup2.peer import DEF_COLLECT_INDICATOR, DEF_STAGE_INDICATOR
#######################################################################
@@ -729,7 +730,10 @@
self.failUnlessEqual(remoteUser, peer.remoteUser)
self.failUnlessEqual(None, peer.localUser)
self.failUnlessEqual(None, peer.rcpCommand)
+ self.failUnlessEqual(None, peer.rshCommand)
+ self.failUnlessEqual(None, peer.cbackCommand)
self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
+ self.failUnlessEqual(DEF_RSH_COMMAND, peer._rshCommandList)
def testBasic_003(self):
"""
@@ -747,7 +751,10 @@
self.failUnlessEqual(remoteUser, peer.remoteUser)
self.failUnlessEqual(None, peer.localUser)
self.failUnlessEqual(None, peer.rcpCommand)
+ self.failUnlessEqual(None, peer.rshCommand)
+ self.failUnlessEqual(None, peer.cbackCommand)
self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
+ self.failUnlessEqual(DEF_RSH_COMMAND, peer._rshCommandList)
def testBasic_004(self):
"""
@@ -765,7 +772,10 @@
self.failUnlessEqual(remoteUser, peer.remoteUser)
self.failUnlessEqual(None, peer.localUser)
self.failUnlessEqual(rcpCommand, peer.rcpCommand)
+ self.failUnlessEqual(None, peer.rshCommand)
+ self.failUnlessEqual(None, peer.cbackCommand)
self.failUnlessEqual(["rcp", "-one", "--two", "three", "four five", "'six", "seven'", "eight", ], peer._rcpCommandList)
+ self.failUnlessEqual(DEF_RSH_COMMAND, peer._rshCommandList)
def testBasic_005(self):
"""
@@ -784,8 +794,46 @@
self.failUnlessEqual(localUser, peer.localUser)
self.failUnlessEqual(None, peer.rcpCommand)
self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
+ self.failUnlessEqual(DEF_RSH_COMMAND, peer._rshCommandList)
+ def testBasic_006(self):
+ """
+ Make sure attributes are set properly for valid constructor input, custom rsh command.
+ """
+ name = REMOTE_HOST
+ remoteUser = getLogin()
+ rshCommand = "rsh --whatever -something \"a b\" else"
+ peer = RemotePeer(name, remoteUser=remoteUser, rshCommand=rshCommand)
+ self.failUnlessEqual(name, peer.name)
+ self.failUnlessEqual(None, peer.collectDir)
+ self.failUnlessEqual(None, peer.workingDir)
+ self.failUnlessEqual(remoteUser, peer.remoteUser)
+ self.failUnlessEqual(None, peer.localUser)
+ self.failUnlessEqual(None, peer.rcpCommand)
+ self.failUnlessEqual(rshCommand, peer.rshCommand)
+ self.failUnlessEqual(None, peer.cbackCommand)
+ self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
+ self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
+ self.failUnlessEqual(["rsh", "--whatever", "-something", "a b", "else", ], peer._rshCommandList)
+ def testBasic_007(self):
+ """
+ Make sure attributes are set properly for valid constructor input, custom cback command.
+ """
+ name = REMOTE_HOST
+ remoteUser = getLogin()
+ cbackCommand = "cback --config=whatever --logfile=whatever --mode=064"
+ peer = RemotePeer(name, remoteUser=remoteUser, cbackCommand=cbackCommand)
+ self.failUnlessEqual(name, peer.name)
+ self.failUnlessEqual(None, peer.collectDir)
+ self.failUnlessEqual(None, peer.workingDir)
+ self.failUnlessEqual(remoteUser, peer.remoteUser)
+ self.failUnlessEqual(None, peer.localUser)
+ self.failUnlessEqual(None, peer.rcpCommand)
+ self.failUnlessEqual(None, peer.rshCommand)
+ self.failUnlessEqual(cbackCommand, peer.cbackCommand)
+
+
###############################
# Test checkCollectIndicator()
###############################
@@ -1429,6 +1477,56 @@
self.failUnlessEqual(permissions, self.getFileMode(["target", "file007", ]))
+ ##############################
+ # Test executeRemoteCommand()
+ ##############################
+
+ def testExecuteRemoteCommand(self):
+ """
+ Test that a simple remote command succeeds.
+ """
+ target = self.buildPath(["test.txt", ])
+ name = REMOTE_HOST
+ remoteUser = getLogin()
+ command = "touch %s" % target;
+ self.failIf(os.path.exists(target))
+ peer = RemotePeer(name=name, remoteUser=remoteUser)
+ peer.executeRemoteCommand(command)
+ self.failUnless(os.path.exists(target))
+
+
+ ############################
+ # Test _buildCbackCommand()
+ ############################
+
+ def testBuildCbackCommand_001(self):
+ """
+ Test with None for cbackCommand and action, False for fullBackup.
+ """
+ self.failUnlessRaises(ValueError, RemotePeer._buildCbackCommand, None, None, False)
+
+ def testBuildCbackCommand_002(self):
+ """
+ Test with None for cbackCommand, "collect" for action, False for fullBackup.
+ """
+ result = RemotePeer._buildCbackCommand(None, "collect", False)
+ self.failUnlessEqual("/usr/bin/cback collect", result)
+
+ def testBuildCbackCommand_003(self):
+ """
+ Test with "cback" for cbackCommand, "collect" for action, False for fullBackup.
+ """
+ result = RemotePeer._buildCbackCommand("cback", "collect", False)
+ self.failUnlessEqual("cback collect", result)
+
+ def testBuildCbackCommand_004(self):
+ """
+ Test with "cback" for cbackCommand, "collect" for action, True for fullBackup.
+ """
+ result = RemotePeer._buildCbackCommand("cback", "collect", True)
+ self.failUnlessEqual("cback --full collect", result)
+
+
#######################################################################
# Suite definition
#######################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 18:43:49
|
Revision: 817
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=817&view=rev
Author: pronovic
Date: 2007-12-16 10:43:47 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Document managed backup
Modified Paths:
--------------
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2007-12-16 18:42:06 UTC (rev 816)
+++ cedar-backup2/trunk/Changelog 2007-12-16 18:43:47 UTC (rev 817)
@@ -1,11 +1,12 @@
Version 2.15.0 unreleased
* Minor documentation tweaks discovered during 3.0 development.
- * Add support for managed peers, where the mater kicks off remote actions.
+ * Add support for a new managed backup feature.
- Add a new <peers> configuration section (PeersConfig)
- Change peers configuration in <stage> to just override <peers>
- Modify stage process to take peers list from peers section (if available)
- - Updated user manual to discuss new peers configuration section
+ - Add new configuration in options and remote peers to support remote shells
+ - Updated user manual to discuss managed backup concept and configuration
Version 2.14.0 19 Sep 2007
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 18:42:10
|
Revision: 816
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=816&view=rev
Author: pronovic
Date: 2007-12-16 10:42:06 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Document managed backup in basic concepts
Modified Paths:
--------------
cedar-backup2/trunk/manual/src/basic.xml
Modified: cedar-backup2/trunk/manual/src/basic.xml
===================================================================
--- cedar-backup2/trunk/manual/src/basic.xml 2007-12-16 17:50:51 UTC (rev 815)
+++ cedar-backup2/trunk/manual/src/basic.xml 2007-12-16 18:42:06 UTC (rev 816)
@@ -593,22 +593,53 @@
data before it is purged.
</para>
+ </sect1>
+
+ <!-- ################################################################# -->
+
+ <sect1 id="cedar-basic-managedbackups">
+
+ <title>Managed Backups</title>
+
<para>
- I decided to do it this way because this coordination step usually
- doesn't take a lot of effort, and is only imposed on the user at
- configuration time. If instead, I wanted to to accomplish the same
- thing <emphasis>dynamically</emphasis> in code, this would add quite a
- bit of complexity to Cedar Backup. This code would be difficult to
- test and would initially be somewhat error-prone, at least until I
- worked out all of the kinks. Given that the current architecture has
- been proven to work well, I don't think that it is worth adding
- complexity to the code just to simplify the initial set-up process.
- <footnote><para>Feel free to write me or the user mailing list if you
- disagree <emphasis>and</emphasis> can come up with a straightforward
- implementation which can be easily verified and
- maintained.</para></footnote>
+ Cedar Backup also supports an optional feature called the
+ <quote>managed backup</quote>. This feature is intended for use with
+ remote clients where cron is not available (for instance, SourceForge
+ shell accounts).
</para>
+ <para>
+ When managed backups are enabled, managed clients must still be
+ configured as usual. However, rather than using a cron job on the
+ client to execute the collect and purge actions, the master executes
+ these actions on the client via a remote shell.
+ </para>
+
+ <para>
+ To make this happen, first set up one or more managed clients in Cedar
+ Backup configuration. Then, invoke Cedar Backup with the
+ <command>--managed</command> command-line option. Whenever Cedar
+ Backup invokes an action locally, it will invoke the same action on
+ each of the managed clients.
+ </para>
+
+ <para>
+ Technically, this feature works for any client, not just clients that
+ don't have cron available. Used this way, it can simplify the setup
+ process, because cron only has to be configured on the master. For
+ some users, that may be motivation enough to use this feature all of
+ the time.
+ </para>
+
+ <para>
+ However, please keep in mind that this feature depends on a stable
+ network. If your network connection drops, your backup will be
+ interrupted and will not be complete. It is even possible that some
+ of the Cedar Backup metadata (like incremental backup state) will be
+ corrupted. The risk is not high, but it is something you need to be
+ aware of if you choose to use this optional feature.
+ </para>
+
</sect1>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 17:50:52
|
Revision: 815
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=815&view=rev
Author: pronovic
Date: 2007-12-16 09:50:51 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Document the new managed client configuration
Modified Paths:
--------------
cedar-backup2/trunk/manual/src/config.xml
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2007-12-16 17:50:28 UTC (rev 814)
+++ cedar-backup2/trunk/manual/src/config.xml 2007-12-16 17:50:51 UTC (rev 815)
@@ -335,6 +335,8 @@
<backup_group>backup</backup_group>
<rcp_command>/usr/bin/scp -B</rcp_command>
<rsh_command>/usr/bin/ssh</rsh_command>
+ <cback_command>/usr/bin/cback</cback_command>
+ <managed_actions>collect, purge</managed_actions>
<override>
<command>cdrecord</command>
<abs_path>/opt/local/bin/cdrecord</abs_path>
@@ -468,17 +470,72 @@
remote shells, including any required options.
</para>
<para>
- This value is used as the default value for all remote
- peers. It is optional, because it is only used for
- managed peers.
+ This value is used as the default value for all managed
+ clients. It is optional, because it is only used when
+ executing actions on managed clients. However, each
+ managed client must either be able to read the value from
+ options configuration or must set the value explicitly.
</para>
<para>
- <emphasis>Restrictions:</emphasis> If provided, must be non-empty
+ <emphasis>Restrictions:</emphasis> Must be non-empty
</para>
</listitem>
</varlistentry>
<varlistentry>
+ <term><literal>cback_command</literal></term>
+ <listitem>
+ <para>Default cback-compatible command to use on managed remote clients.</para>
+ <para>
+ The cback command should be the exact command used for for
+ executing <command>cback</command> on a remote managed
+ client, including any required command-line options. Do
+ <emphasis>not</emphasis> list any actions in the command
+ line, and do <emphasis>not</emphasis> include the
+ <command>--full</command> command-line option.
+ </para>
+ <para>
+ This value is used as the default value for all managed
+ clients. It is optional, because it is only used when
+ executing actions on managed clients. However, each
+ managed client must either be able to read the value from
+ options configuration or must set the value explicitly.
+ </para>
+ <para>
+ Note: if this command-line is complicated, it is often
+ better to create a simple shell script on the remote host
+ to encapsulate all of the options. Then, just reference
+ the shell script in configuration.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>managed_actions</literal></term>
+ <listitem>
+ <para>Default set of actions that are managed on remote clients.</para>
+ <para>
+ This is a comma-separated list of actions that the master
+ will manage on behalf of remote clients. Typically, it
+ would include only collect-like actions and purge.
+ </para>
+ <para>
+ This value is used as the default value for all managed
+ clients. It is optional, because it is only used when
+ executing actions on managed clients. However, each
+ managed client must either be able to read the value from
+ options configuration or must set the value explicitly.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>override</literal></term>
<listitem>
<para>Command to override with a customized path.</para>
@@ -719,6 +776,17 @@
<backup_user>backup</backup_user>
<collect_dir>/opt/backup/collect</collect_dir>
</peer>
+ <peer>
+ <name>machine3</name>
+ <type>remote</type>
+ <managed>Y</managed>
+ <backup_user>backup</backup_user>
+ <collect_dir>/opt/backup/collect</collect_dir>
+ <rcp_command>/usr/bin/scp</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
+ <cback_command>/usr/bin/cback</cback_command>
+ <managed_actions>collect, purge</managed_actions>
+ </peer>
</peers>
</programlisting>
@@ -778,6 +846,7 @@
</listitem>
</varlistentry>
+
<varlistentry>
<term><literal>collect_dir</literal></term>
<listitem>
@@ -852,6 +921,25 @@
</varlistentry>
<varlistentry>
+ <term><literal>managed</literal></term>
+ <listitem>
+ <para>Indicates whether this peer is managed.</para>
+ <para>
+ A managed peer (or managed client) is a peer for
+ which the master manages all of the backup
+ activites via a remote shell.
+ </para>
+ <para>
+ This field is optional. If it doesn't exist, then
+ <literal>N</literal> will be assumed.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be a boolean (<literal>Y</literal> or <literal>N</literal>).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>collect_dir</literal></term>
<listitem>
<para>Collect directory to stage from for this peer.</para>
@@ -912,6 +1000,86 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><literal>rsh_command</literal></term>
+ <listitem>
+ <para>The rsh-compatible command for this peer.</para>
+ <para>
+ The rsh command should be the exact command used for
+ remote shells, including any required options.
+ </para>
+ <para>
+ This value only applies if the peer is managed.
+ </para>
+ <para>
+ This field is optional. if it doesn't exist, the
+ backup will use the default rsh command from the
+ options section.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>cback_command</literal></term>
+ <listitem>
+ <para>The cback-compatible command for this peer.</para>
+ <para>
+ The cback command should be the exact command
+ used for for executing cback on the peer as part
+ of a managed backup. This value must include any
+ required command-line options. Do
+ <emphasis>not</emphasis> list any actions in the
+ command line, and do <emphasis>not</emphasis>
+ include the <command>--full</command>
+ command-line option.
+ </para>
+ <para>
+ This value only applies if the peer is managed.
+ </para>
+ <para>
+ This field is optional. if it doesn't exist, the
+ backup will use the default cback command from the
+ options section.
+ </para>
+ <para>
+ Note: if this command-line is complicated, it is often
+ better to create a simple shell script on the remote host
+ to encapsulate all of the options. Then, just reference
+ the shell script in configuration.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>managed_actions</literal></term>
+ <listitem>
+ <para>Set of actions that are managed for this peer.</para>
+ <para>
+ This is a comma-separated list of actions that
+ the master will manage on behalf this peer.
+ Typically, it would include only collect-like
+ actions and purge.
+ </para>
+ <para>
+ This value only applies if the peer is managed.
+ </para>
+ <para>
+ This field is optional. if it doesn't exist, the
+ backup will use the default list of managed
+ actions from the options section.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</listitem>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 17:50:30
|
Revision: 814
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=814&view=rev
Author: pronovic
Date: 2007-12-16 09:50:28 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Document new --managed and --managed-only command-line options
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
cedar-backup2/trunk/doc/cback.1
cedar-backup2/trunk/manual/src/commandline.xml
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-16 16:55:27 UTC (rev 813)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-16 17:50:28 UTC (rev 814)
@@ -696,8 +696,8 @@
fd.write(" -q, --quiet Run quietly (display no output to the screen)\n")
fd.write(" -c, --config Path to config file (default: %s)\n" % DEFAULT_CONFIG)
fd.write(" -f, --full Perform a full backup, regardless of configuration\n")
- fd.write(" -M, --managed Include managed peers when executing actions\n")
- fd.write(" -N, --managed-only Include ONLY managed peers when executing actions\n")
+ fd.write(" -M, --managed Include managed clients when executing actions\n")
+ fd.write(" -N, --managed-only Include ONLY managed clients when executing actions\n")
fd.write(" -l, --logfile Path to logfile (default: %s)\n" % DEFAULT_LOGFILE)
fd.write(" -o, --owner Logfile ownership, user:group (default: %s:%s)\n" % (DEFAULT_OWNERSHIP[0], DEFAULT_OWNERSHIP[1]))
fd.write(" -m, --mode Octal logfile permissions mode (default: %o)\n" % DEFAULT_MODE)
Modified: cedar-backup2/trunk/doc/cback.1
===================================================================
--- cedar-backup2/trunk/doc/cback.1 2007-12-16 16:55:27 UTC (rev 813)
+++ cedar-backup2/trunk/doc/cback.1 2007-12-16 17:50:28 UTC (rev 814)
@@ -15,9 +15,9 @@
.\" #
.\" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
.\"
-.TH cback "1" "July 2005" "Cedar Backup" "Kenneth J. Pronovici"
+.TH cback "1" "December 2007" "Cedar Backup" "Kenneth J. Pronovici"
.SH NAME
-cback \- Local and remote backups to CD-R/CD-RW media under Linux
+cback \- Local and remote backups to CD-R/CD-RW media
.SH SYNOPSIS
.B cback
[\fIswitches\fR]
@@ -47,6 +47,12 @@
actions, but only the master executes the stage and store actions. The
configuration file \fI/etc/cback.conf\fR controls the actions taken during
collect, stage, store and purge actions.
+.PP
+Cedar Backup also supports the concept of \fImanaged clients\fR. Managed
+clients have their entire backup process managed by the master via a remote
+shell. The same actions are run as part of the backup process, but the master
+controls when the actions are executed on the clients rather than the clients
+controlling it for themselves.
.SH SWITCHES
.TP
\fB\-h\fR, \fB\-\-help\fR
@@ -73,6 +79,16 @@
ignored and rewritten; for the store action, this means that a new disc will be
started.
.TP
+\fB\-M\fR, \fB\-\-managed\fR
+Include managed clients when executing actions. If the action being executed
+is listed as a managed action for a managed client, execute the action on that
+client after executing the action locally.
+.TP
+\fB\-N\fR, \fB\-\-managed-only\fR
+Include only managed clients when executing actions. If the action being
+executed is listed as a managed action for a managed client, execute the action
+on that client -- but do not execute the action locally.
+.TP
\fB\-l\fR, \fB\-\-logfile\fR
Specify the path to an alternate logfile. The default logfile file is
/var/log/cback.log.
@@ -164,10 +180,9 @@
Error executing specified backup actions.
.SH NOTES
.PP
-The script is designed to run as root, since otherwise it's difficult to
-back up system directories or write the CD or DVD device. However, pains
-are taken to use a backup user's effective user id (specified in
-configuration) when appropriate.
+The script is designed to run as root, since otherwise it's difficult to back
+up system directories or write the CD or DVD device. However, pains are taken
+to switch to a backup user (specified in configuration) when appropriate.
.PP
To use the script, you must specify at least one action to take. More than one
of the "collect", "stage", "store" or "purge" actions may be specified, in any
@@ -184,12 +199,13 @@
.PP
Note that there is no facility for restoring backups. It is assumed that the
user can deal with copying tarfiles off disc and using them to restore missing
-files as needed.
+files as needed. The user manual provides detailed intructions in Appendix C.
.PP
Finally, you should be aware that backups to CD or DVD can probably be read
by any user which has permissions to mount the CD or DVD drive. If you
intend to leave the backup disc in the drive at all times, you may want to
-consider this when setting up device permissions on your machine.
+consider this when setting up device permissions on your machine. You might
+also want to investigate the encrypt extension.
.SH FILES
.TP
\fI/etc/cback.conf\fR - Default configuration file
Modified: cedar-backup2/trunk/manual/src/commandline.xml
===================================================================
--- cedar-backup2/trunk/manual/src/commandline.xml 2007-12-16 16:55:27 UTC (rev 813)
+++ cedar-backup2/trunk/manual/src/commandline.xml 2007-12-16 17:50:28 UTC (rev 814)
@@ -95,29 +95,31 @@
The following switches are accepted:
- -h, --help Display this usage/help listing
- -V, --version Display version information
- -b, --verbose Print verbose output as well as logging to disk
- -q, --quiet Run quietly (display no output to the screen)
- -c, --config Path to config file (default: /etc/cback.conf)
- -f, --full Perform a full backup, regardless of configuration
- -l, --logfile Path to logfile (default: /var/log/cback.log)
- -o, --owner Logfile ownership, user:group (default: root:adm)
- -m, --mode Octal logfile permissions mode (default: 640)
- -O, --output Record some sub-command (i.e. cdrecord) output to the log
- -d, --debug Write debugging information to the log (implies --output)
- -s, --stack Dump a Python stack trace instead of swallowing exceptions
+ -h, --help Display this usage/help listing
+ -V, --version Display version information
+ -b, --verbose Print verbose output as well as logging to disk
+ -q, --quiet Run quietly (display no output to the screen)
+ -c, --config Path to config file (default: /etc/cback.conf)
+ -f, --full Perform a full backup, regardless of configuration
+ -M, --managed Include managed clients when executing actions
+ -N, --managed-only Include ONLY managed clients when executing actions
+ -l, --logfile Path to logfile (default: /var/log/cback.log)
+ -o, --owner Logfile ownership, user:group (default: root:adm)
+ -m, --mode Octal logfile permissions mode (default: 640)
+ -O, --output Record some sub-command (i.e. cdrecord) output to the log
+ -d, --debug Write debugging information to the log (implies --output)
+ -s, --stack Dump a Python stack trace instead of swallowing exceptions
The following actions may be specified:
- all Take all normal actions (collect, stage, store, purge)
- collect Take the collect action
- stage Take the stage action
- store Take the store action
- purge Take the purge action
- rebuild Rebuild "this week's" disc if possible
- validate Validate configuration only
- initialize Initialize media for use with Cedar Backup
+ all Take all normal actions (collect, stage, store, purge)
+ collect Take the collect action
+ stage Take the stage action
+ store Take the store action
+ purge Take the purge action
+ rebuild Rebuild "this week's" disc if possible
+ validate Validate configuration only
+ initialize Initialize media for use with Cedar Backup
You may also specify extended actions that have been defined in
configuration.
@@ -208,6 +210,31 @@
</varlistentry>
<varlistentry>
+ <term><option>-M</option>, <option>--managed</option></term>
+ <listitem>
+ <para>
+ Include managed clients when executing actions. If the
+ action being executed is listed as a managed action for a
+ managed client, execute the action on that client after
+ executing the action locally.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-N</option>, <option>--managed-only</option></term>
+ <listitem>
+ <para>
+ Include <emphasis>only</emphasis> managed clients when
+ executing actions. If the action being executed is listed
+ as a managed action for a managed client, execute the action
+ on that client — but <emphasis>do not</emphasis>
+ execute the action locally.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-l</option>, <option>--logfile</option></term>
<listitem>
<para>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 16:55:29
|
Revision: 813
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=813&view=rev
Author: pronovic
Date: 2007-12-16 08:55:27 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Require cback command and managed action list for managed peers
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/test/configtests.py
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-16 16:12:43 UTC (rev 812)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-16 16:55:27 UTC (rev 813)
@@ -5664,13 +5664,18 @@
names.append(remotePeer.name)
if remotePeer.collectDir is None:
raise ValueError("Remote peers must set a collect directory.")
- if (self.options is None or self.options.backupUser is None) and remotePeer.remoteUser is None: # redundant
+ if (self.options is None or self.options.backupUser is None) and remotePeer.remoteUser is None:
raise ValueError("Remote user must either be set in options section or individual remote peer.")
- if (self.options is None or self.options.rcpCommand is None) and remotePeer.rcpCommand is None: # redundant
+ if (self.options is None or self.options.rcpCommand is None) and remotePeer.rcpCommand is None:
raise ValueError("Remote copy command must either be set in options section or individual remote peer.")
if remotePeer.managed:
- if (self.options is None or self.options.rshCommand is None) and remotePeer.rshCommand is None: # redundant
+ if (self.options is None or self.options.rshCommand is None) and remotePeer.rshCommand is None:
raise ValueError("Remote shell command must either be set in options section or individual remote peer.")
+ if (self.options is None or self.options.cbackCommand is None) and remotePeer.cbackCommand is None:
+ raise ValueError("Remote cback command must either be set in options section or individual remote peer.")
+ if ((self.options is None or self.options.managedActions is None or len(self.options.managedActions) < 1)
+ and (remotePeer.managedActions is None or len(remotePeer.managedActions) < 1)):
+ raise ValueError("Managed actions list must be set in options section or individual remote peer.")
Config._checkUnique("Duplicate peer names exist:", names)
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2007-12-16 16:12:43 UTC (rev 812)
+++ cedar-backup2/trunk/test/configtests.py 2007-12-16 16:55:27 UTC (rev 813)
@@ -10263,7 +10263,104 @@
config._validatePeers()
self.failUnlessRaises(ValueError, config._validateStage)
+ def testValidate_073(self):
+ """
+ Confirm that remote peer is required to have backup user if not set in options.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="rcp", rshCommand="rsh", cbackCommand="cback", managedActions=["collect"], )
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [ RemotePeer(name="remote", collectDir="/path"), ]
+ config._validatePeers()
+ config.options.backupUser = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.peers.remotePeers[0].remoteUser = "ken"
+ config._validatePeers()
+
+ def testValidate_074(self):
+ """
+ Confirm that remote peer is required to have rcp command if not set in options.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="rcp", rshCommand="rsh", cbackCommand="cback", managedActions=["collect"], )
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [ RemotePeer(name="remote", collectDir="/path"), ]
+ config._validatePeers()
+
+ config.options.rcpCommand = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.peers.remotePeers[0].rcpCommand = "rcp"
+ config._validatePeers()
+
+ def testValidate_075(self):
+ """
+ Confirm that remote managed peer is required to have rsh command if not set in options.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="rcp", rshCommand="rsh", cbackCommand="cback", managedActions=["collect"], )
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [ RemotePeer(name="remote", collectDir="/path"), ]
+ config._validatePeers()
+
+ config.options.rshCommand = None
+ config._validatePeers()
+
+ config.peers.remotePeers[0].managed = True
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.peers.remotePeers[0].rshCommand = "rsh"
+ config._validatePeers()
+
+ def testValidate_076(self):
+ """
+ Confirm that remote managed peer is required to have cback command if not set in options.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="rcp", rshCommand="rsh", cbackCommand="cback", managedActions=["collect"], )
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [ RemotePeer(name="remote", collectDir="/path"), ]
+ config._validatePeers()
+
+ config.options.cbackCommand = None
+ config._validatePeers()
+
+ config.peers.remotePeers[0].managed = True
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.peers.remotePeers[0].cbackCommand = "cback"
+ config._validatePeers()
+
+ def testValidate_077(self):
+ """
+ Confirm that remote managed peer is required to have managed actions list if not set in options.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="rcp", rshCommand="rsh", cbackCommand="cback", managedActions=["collect"], )
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [ RemotePeer(name="remote", collectDir="/path"), ]
+ config._validatePeers()
+
+ config.options.managedActions = None
+ config._validatePeers()
+
+ config.peers.remotePeers[0].managed = True
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.options.managedActions = []
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ config.peers.remotePeers[0].managedActions = ["collect", ]
+ config._validatePeers()
+
+
############################
# Test parsing of documents
############################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-16 16:12:48
|
Revision: 812
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=812&view=rev
Author: pronovic
Date: 2007-12-16 08:12:43 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Add the --managed and --managed-only options
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/cli.py
cedar-backup2/trunk/test/clitests.py
Modified: cedar-backup2/trunk/CedarBackup2/cli.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-15 23:10:39 UTC (rev 811)
+++ cedar-backup2/trunk/CedarBackup2/cli.py 2007-12-16 16:12:43 UTC (rev 812)
@@ -128,10 +128,11 @@
COMBINE_ACTIONS = [ "collect", "stage", "store", "purge", ]
NONCOMBINE_ACTIONS = [ "rebuild", "validate", "initialize", "all", ]
-SHORT_SWITCHES = "hVbqc:fl:o:m:Ods"
+SHORT_SWITCHES = "hVbqc:fMNl:o:m:Ods"
LONG_SWITCHES = [ 'help', 'version', 'verbose', 'quiet',
- 'config=', 'full', 'logfile=', 'owner=',
- 'mode=', 'output', 'debug', 'stack', ]
+ 'config=', 'full', 'managed', 'managed-only',
+ 'logfile=', 'owner=', 'mode=',
+ 'output', 'debug', 'stack', ]
#######################################################################
@@ -689,29 +690,31 @@
fd.write("\n")
fd.write(" The following switches are accepted:\n")
fd.write("\n")
- fd.write(" -h, --help Display this usage/help listing\n")
- fd.write(" -V, --version Display version information\n")
- fd.write(" -b, --verbose Print verbose output as well as logging to disk\n")
- fd.write(" -q, --quiet Run quietly (display no output to the screen)\n")
- fd.write(" -c, --config Path to config file (default: %s)\n" % DEFAULT_CONFIG)
- fd.write(" -f, --full Perform a full backup, regardless of configuration\n")
- fd.write(" -l, --logfile Path to logfile (default: %s)\n" % DEFAULT_LOGFILE)
- fd.write(" -o, --owner Logfile ownership, user:group (default: %s:%s)\n" % (DEFAULT_OWNERSHIP[0], DEFAULT_OWNERSHIP[1]))
- fd.write(" -m, --mode Octal logfile permissions mode (default: %o)\n" % DEFAULT_MODE)
- fd.write(" -O, --output Record some sub-command (i.e. cdrecord) output to the log\n")
- fd.write(" -d, --debug Write debugging information to the log (implies --output)\n")
- fd.write(" -s, --stack Dump a Python stack trace instead of swallowing exceptions\n")
+ fd.write(" -h, --help Display this usage/help listing\n")
+ fd.write(" -V, --version Display version information\n")
+ fd.write(" -b, --verbose Print verbose output as well as logging to disk\n")
+ fd.write(" -q, --quiet Run quietly (display no output to the screen)\n")
+ fd.write(" -c, --config Path to config file (default: %s)\n" % DEFAULT_CONFIG)
+ fd.write(" -f, --full Perform a full backup, regardless of configuration\n")
+ fd.write(" -M, --managed Include managed peers when executing actions\n")
+ fd.write(" -N, --managed-only Include ONLY managed peers when executing actions\n")
+ fd.write(" -l, --logfile Path to logfile (default: %s)\n" % DEFAULT_LOGFILE)
+ fd.write(" -o, --owner Logfile ownership, user:group (default: %s:%s)\n" % (DEFAULT_OWNERSHIP[0], DEFAULT_OWNERSHIP[1]))
+ fd.write(" -m, --mode Octal logfile permissions mode (default: %o)\n" % DEFAULT_MODE)
+ fd.write(" -O, --output Record some sub-command (i.e. cdrecord) output to the log\n")
+ fd.write(" -d, --debug Write debugging information to the log (implies --output)\n")
+ fd.write(" -s, --stack Dump a Python stack trace instead of swallowing exceptions\n") # exactly 80 characters in width!
fd.write("\n")
fd.write(" The following actions may be specified:\n")
fd.write("\n")
- fd.write(" all Take all normal actions (collect, stage, store, purge)\n")
- fd.write(" collect Take the collect action\n")
- fd.write(" stage Take the stage action\n")
- fd.write(" store Take the store action\n")
- fd.write(" purge Take the purge action\n")
- fd.write(" rebuild Rebuild \"this week's\" disc if possible\n")
- fd.write(" validate Validate configuration only\n")
- fd.write(" initialize Initialize media for use with Cedar Backup\n")
+ fd.write(" all Take all normal actions (collect, stage, store, purge)\n")
+ fd.write(" collect Take the collect action\n")
+ fd.write(" stage Take the stage action\n")
+ fd.write(" store Take the store action\n")
+ fd.write(" purge Take the purge action\n")
+ fd.write(" rebuild Rebuild \"this week's\" disc if possible\n")
+ fd.write(" validate Validate configuration only\n")
+ fd.write(" initialize Initialize media for use with Cedar Backup\n")
fd.write("\n")
fd.write(" You may also specify extended actions that have been defined in\n")
fd.write(" configuration.\n")
@@ -1035,6 +1038,8 @@
self._quiet = False
self._config = None
self._full = False
+ self._managed = False
+ self._managedOnly = False
self._logfile = None
self._owner = None
self._mode = None
@@ -1113,6 +1118,16 @@
return -1
else:
return 1
+ if self._managed != other._managed:
+ if self._managed < other._managed:
+ return -1
+ else:
+ return 1
+ if self._managedOnly != other._managedOnly:
+ if self._managedOnly < other._managedOnly:
+ return -1
+ else:
+ return 1
if self._logfile != other._logfile:
if self._logfile < other._logfile:
return -1
@@ -1250,6 +1265,38 @@
"""
return self._full
+ def _setManaged(self, value):
+ """
+ Property target used to set the managed flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._managed = True
+ else:
+ self._managed = False
+
+ def _getManaged(self):
+ """
+ Property target used to get the managed flag.
+ """
+ return self._managed
+
+ def _setManagedOnly(self, value):
+ """
+ Property target used to set the managedOnly flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._managedOnly = True
+ else:
+ self._managedOnly = False
+
+ def _getManagedOnly(self):
+ """
+ Property target used to get the managedOnly flag.
+ """
+ return self._managedOnly
+
def _setLogfile(self, value):
"""
Property target used to set the logfile parameter.
@@ -1393,6 +1440,8 @@
quiet = property(_getQuiet, _setQuiet, None, "Command-line quiet (C{-q,--quiet}) flag.")
config = property(_getConfig, _setConfig, None, "Command-line configuration file (C{-c,--config}) parameter.")
full = property(_getFull, _setFull, None, "Command-line full-backup (C{-f,--full}) flag.")
+ managed = property(_getManaged, _setManaged, None, "Command-line managed (C{-M,--managed}) flag.")
+ managedOnly = property(_getManagedOnly, _setManagedOnly, None, "Command-line managed-only (C{-N,--managed-only}) flag.")
logfile = property(_getLogfile, _setLogfile, None, "Command-line logfile (C{-l,--logfile}) parameter.")
owner = property(_getOwner, _setOwner, None, "Command-line owner (C{-o,--owner}) parameter, as tuple C{(user,group)}.")
mode = property(_getMode, _setMode, None, "Command-line mode (C{-m,--mode}) parameter.")
@@ -1423,6 +1472,8 @@
if not self.help and not self.version:
if self.actions is None or len(self.actions) == 0:
raise ValueError("At least one action must be specified.")
+ if self.managed and self.managedOnly:
+ raise ValueError("The --managed and --managed-only options may not be combined.")
def buildArgumentList(self, validate=True):
"""
@@ -1467,6 +1518,10 @@
argumentList.append(self.config)
if self.full:
argumentList.append("--full")
+ if self.managed:
+ argumentList.append("--managed")
+ if self.managedOnly:
+ argumentList.append("--managed-only")
if self.logfile is not None:
argumentList.append("--logfile")
argumentList.append(self.logfile)
@@ -1529,6 +1584,10 @@
argumentString += "--config \"%s\" " % self.config
if self.full:
argumentString += "--full "
+ if self.managed:
+ argumentString += "--managed "
+ if self.managedOnly:
+ argumentString += "--managed-only "
if self.logfile is not None:
argumentString += "--logfile \"%s\" " % self.logfile
if self.owner is not None:
@@ -1585,6 +1644,10 @@
self.config = switches["--config"]
if switches.has_key("-f") or switches.has_key("--full"):
self.full = True
+ if switches.has_key("-M") or switches.has_key("--managed"):
+ self.managed = True
+ if switches.has_key("-N") or switches.has_key("--managed-only"):
+ self.managedOnly = True
if switches.has_key("-l"):
self.logfile = switches["-l"]
if switches.has_key("--logfile"):
Modified: cedar-backup2/trunk/test/clitests.py
===================================================================
--- cedar-backup2/trunk/test/clitests.py 2007-12-15 23:10:39 UTC (rev 811)
+++ cedar-backup2/trunk/test/clitests.py 2007-12-16 16:12:43 UTC (rev 812)
@@ -186,6 +186,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -205,6 +207,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -224,6 +228,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -243,6 +249,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -262,6 +270,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -281,6 +291,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -300,6 +312,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -319,6 +333,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -338,6 +354,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -357,6 +375,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -376,6 +396,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -395,6 +417,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -414,6 +438,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -433,6 +459,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -452,6 +480,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -471,6 +501,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -490,6 +522,8 @@
self.failUnlessEqual(True, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -509,6 +543,8 @@
self.failUnlessEqual(True, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -528,6 +564,8 @@
self.failUnlessEqual(True, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -547,6 +585,8 @@
self.failUnlessEqual(True, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -590,6 +630,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual("something", options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -609,6 +651,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual("something", options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -628,6 +672,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual("something", options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -647,6 +693,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual("something", options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -666,6 +714,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(True, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -686,6 +736,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(True, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -705,6 +757,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(True, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -724,6 +778,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(True, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -767,6 +823,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual("something", options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -786,6 +844,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual("something", options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -805,6 +865,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual("something", options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -824,6 +886,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual("something", options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -891,6 +955,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(("a", "b"), options.owner)
self.failUnlessEqual(None, options.mode)
@@ -910,6 +976,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(("a", "b"), options.owner)
self.failUnlessEqual(None, options.mode)
@@ -929,6 +997,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(("a", "b"), options.owner)
self.failUnlessEqual(None, options.mode)
@@ -948,6 +1018,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(("a", "b"), options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1015,6 +1087,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0631, options.mode)
@@ -1034,6 +1108,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0631, options.mode)
@@ -1053,6 +1129,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0631, options.mode)
@@ -1072,6 +1150,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0631, options.mode)
@@ -1091,6 +1171,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1110,6 +1192,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1129,6 +1213,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1148,6 +1234,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1167,6 +1255,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1186,6 +1276,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1205,6 +1297,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1224,6 +1318,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1243,6 +1339,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1262,6 +1360,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1281,6 +1381,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1300,6 +1402,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1319,6 +1423,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1338,6 +1444,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1357,6 +1465,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1376,6 +1486,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1395,6 +1507,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1414,6 +1528,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1433,6 +1549,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1452,6 +1570,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1471,6 +1591,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1490,6 +1612,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1509,6 +1633,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1528,6 +1654,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1547,6 +1675,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1566,6 +1696,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1585,6 +1717,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1604,6 +1738,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1623,6 +1759,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1642,6 +1780,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1661,6 +1801,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1680,6 +1822,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1699,6 +1843,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0600, options.mode)
@@ -1718,6 +1864,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0600, options.mode)
@@ -1749,6 +1897,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1768,6 +1918,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1787,6 +1939,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1806,6 +1960,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1825,6 +1981,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1844,6 +2002,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1863,6 +2023,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -1882,6 +2044,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2285,6 +2449,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2304,6 +2470,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2323,6 +2491,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2342,6 +2512,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2361,6 +2533,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2380,6 +2554,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2399,6 +2575,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2418,6 +2596,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2437,6 +2617,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2475,6 +2657,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2494,6 +2678,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2513,6 +2699,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2532,6 +2720,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(None, options.mode)
@@ -2551,6 +2741,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0600, options.mode)
@@ -2570,6 +2762,8 @@
self.failUnlessEqual(False, options.quiet)
self.failUnlessEqual(None, options.config)
self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
self.failUnlessEqual(None, options.logfile)
self.failUnlessEqual(None, options.owner)
self.failUnlessEqual(0600, options.mode)
@@ -2578,7 +2772,225 @@
self.failUnlessEqual(False, options.stacktrace)
self.failUnlessEqual(["collect", "stage", ], options.actions)
+ def testConstructor_189(self):
+ """
+ Test constructor with argumentList=["--managed", ], validate=False.
+ """
+ options = Options(argumentList=["--managed", ], validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(True, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+ def testConstructor_190(self):
+ """
+ Test constructor with argumentString="--managed", validate=False.
+ """
+ options = Options(argumentString="--managed", validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(True, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_191(self):
+ """
+ Test constructor with argumentList=["-M", ], validate=False.
+ """
+ options = Options(argumentList=["-M", ], validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(True, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_192(self):
+ """
+ Test constructor with argumentString="-M", validate=False.
+ """
+ options = Options(argumentString="-M", validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(True, options.managed)
+ self.failUnlessEqual(False, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_193(self):
+ """
+ Test constructor with argumentList=["--managed-only", ], validate=False.
+ """
+ options = Options(argumentList=["--managed-only", ], validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(True, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_194(self):
+ """
+ Test constructor with argumentString="--managed-only", validate=False.
+ """
+ options = Options(argumentString="--managed-only", validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(True, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_195(self):
+ """
+ Test constructor with argumentList=["-N", ], validate=False.
+ """
+ options = Options(argumentList=["-N", ], validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(True, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_196(self):
+ """
+ Test constructor with argumentString="-N", validate=False.
+ """
+ options = Options(argumentString="-N", validate=False)
+ self.failUnlessEqual(False, options.help)
+ self.failUnlessEqual(False, options.version)
+ self.failUnlessEqual(False, options.verbose)
+ self.failUnlessEqual(False, options.quiet)
+ self.failUnlessEqual(None, options.config)
+ self.failUnlessEqual(False, options.full)
+ self.failUnlessEqual(False, options.managed)
+ self.failUnlessEqual(True, options.managedOnly)
+ self.failUnlessEqual(None, options.logfile)
+ self.failUnlessEqual(None, options.owner)
+ self.failUnlessEqual(None, options.mode)
+ self.failUnlessEqual(False, options.output)
+ self.failUnlessEqual(False, options.debug)
+ self.failUnlessEqual(False, options.stacktrace)
+ self.failUnlessEqual([], options.actions)
+
+ def testConstructor_197(self):
+ """
+ Test constructor with argumentList=["--managed", ], validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentList=["--managed", ], validate=True)
+
+ def testConstructor_198(self):
+ """
+ Test constructor with argumentString="--managed", validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentString="--managed", validate=True)
+
+ def testConstructor_199(self):
+ """
+ Test constructor with argumentList=["-M", ], validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentList=["-M", ], validate=True)
+
+ def testConstructor_200(self):
+ """
+ Test constructor with argumentString="-M", validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentString="-M", validate=True)
+
+ def testConstructor_201(self):
+ """
+ Test constructor with argumentList=["--managed-only", ], validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentList=["--managed-only", ], validate=True)
+
+ def testConstructor_202(self):
+ """
+ Test constructor with argumentString="--managed-only", validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentString="--managed-only", validate=True)
+
+ def testConstructor_203(self):
+ """
+ Test constructor with argumentList=["-N", ], validate=True.
+ """
+ self.failUnlessRaises(ValueError, Options, argumentList=["-N", ], validate=True)
+
+ def testConstruc...
[truncated message content] |
|
From: <pro...@us...> - 2007-12-15 23:10:41
|
Revision: 811
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=811&view=rev
Author: pronovic
Date: 2007-12-15 15:10:39 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Add configuration for managed remote peers
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/test/configtests.py
cedar-backup2/trunk/test/data/cback.conf.15
cedar-backup2/trunk/test/data/cback.conf.20
cedar-backup2/trunk/test/data/cback.conf.21
cedar-backup2/trunk/test/data/cback.conf.23
cedar-backup2/trunk/test/data/cback.conf.6
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 21:43:57 UTC (rev 810)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 23:10:39 UTC (rev 811)
@@ -1717,11 +1717,16 @@
- The collect directory must be an absolute path.
- The remote user must be a non-empty string.
- The rcp command must be a non-empty string.
+ - The rsh command must be a non-empty string.
+ - The cback command must be a non-empty string.
+ - Any managed action name must be a non-empty string matching C{ACTION_NAME_REGEX}
@sort: __init__, __repr__, __str__, __cmp__, name, collectDir, remoteUser, rcpCommand
"""
- def __init__(self, name=None, collectDir=None, remoteUser=None, rcpCommand=None):
+ def __init__(self, name=None, collectDir=None, remoteUser=None,
+ rcpCommand=None, rshCommand=None, cbackCommand=None,
+ managed=False, managedActions=None):
"""
Constructor for the C{RemotePeer} class.
@@ -1729,6 +1734,10 @@
@param collectDir: Collect directory to stage files from on peer.
@param remoteUser: Name of backup user on remote peer.
@param rcpCommand: Overridden rcp-compatible copy command for peer.
+ @param rshCommand: Overridden rsh-compatible remote shell command for peer.
+ @param cbackCommand: Overridden cback-compatible command to use on remote peer.
+ @param managed: Indicates whether this is a managed peer.
+ @param managedActions: Overridden set of actions that are managed on the peer.
@raise ValueError: If one of the values is invalid.
"""
@@ -1736,16 +1745,26 @@
self._collectDir = None
self._remoteUser = None
self._rcpCommand = None
+ self._rshCommand = None
+ self._cbackCommand = None
+ self._managed = None
+ self._managedActions = None
self.name = name
self.collectDir = collectDir
self.remoteUser = remoteUser
self.rcpCommand = rcpCommand
+ self.rshCommand = rshCommand
+ self.cbackCommand = cbackCommand
+ self.managed = managed
+ self.managedActions = managedActions
def __repr__(self):
"""
Official string representation for class instance.
"""
- return "RemotePeer(%s, %s, %s, %s)" % (self.name, self.collectDir, self.remoteUser, self.rcpCommand)
+ return "RemotePeer(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.name, self.collectDir, self.remoteUser,
+ self.rcpCommand, self.rshCommand, self.cbackCommand,
+ self.managed, self.managedActions)
def __str__(self):
"""
@@ -1781,6 +1800,26 @@
return -1
else:
return 1
+ if self._rshCommand != other._rshCommand:
+ if self._rshCommand < other._rshCommand:
+ return -1
+ else:
+ return 1
+ if self._cbackCommand != other._cbackCommand:
+ if self._cbackCommand < other._cbackCommand:
+ return -1
+ else:
+ return 1
+ if self._managed != other._managed:
+ if self._managed < other._managed:
+ return -1
+ else:
+ return 1
+ if self._managedActions != other._managedActions:
+ if self._managedActions < other._managedActions:
+ return -1
+ else:
+ return 1
return 0
def _setName(self, value):
@@ -1853,10 +1892,86 @@
"""
return self._rcpCommand
+ def _setRshCommand(self, value):
+ """
+ Property target used to set the rsh command.
+ The value must be a non-empty string if it is not C{None}.
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is not None:
+ if len(value) < 1:
+ raise ValueError("The rsh command must be a non-empty string.")
+ self._rshCommand = value
+
+ def _getRshCommand(self):
+ """
+ Property target used to get the rsh command.
+ """
+ return self._rshCommand
+
+ def _setCbackCommand(self, value):
+ """
+ Property target used to set the cback command.
+ The value must be a non-empty string if it is not C{None}.
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is not None:
+ if len(value) < 1:
+ raise ValueError("The cback command must be a non-empty string.")
+ self._cbackCommand = value
+
+ def _getCbackCommand(self):
+ """
+ Property target used to get the cback command.
+ """
+ return self._cbackCommand
+
+ def _setManaged(self, value):
+ """
+ Property target used to set the managed flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._managed = True
+ else:
+ self._managed = False
+
+ def _getManaged(self):
+ """
+ Property target used to get the managed flag.
+ """
+ return self._managed
+
+ def _setManagedActions(self, value):
+ """
+ Property target used to set the managed actions list.
+ Elements do not have to exist on disk at the time of assignment.
+ """
+ if value is None:
+ self._managedActions = None
+ else:
+ try:
+ saved = self._managedActions
+ self._managedActions = RegexMatchList(ACTION_NAME_REGEX, emptyAllowed=False, prefix="Action name")
+ self._managedActions.extend(value)
+ except Exception, e:
+ self._managedActions = saved
+ raise e
+
+ def _getManagedActions(self):
+ """
+ Property target used to get the managed actions list.
+ """
+ return self._managedActions
+
name = property(_getName, _setName, None, "Name of the peer, must be a valid hostname.")
collectDir = property(_getCollectDir, _setCollectDir, None, "Collect directory to stage files from on peer.")
remoteUser = property(_getRemoteUser, _setRemoteUser, None, "Name of backup user on remote peer.")
rcpCommand = property(_getRcpCommand, _setRcpCommand, None, "Overridden rcp-compatible copy command for peer.")
+ rshCommand = property(_getRshCommand, _setRshCommand, None, "Overridden rsh-compatible remote shell command for peer.")
+ cbackCommand = property(_getCbackCommand, _setCbackCommand, None, "Overridden cback-compatible command to use on remote peer.")
+ managed = property(_getManaged, _setManaged, None, "Indicates whether this is a managed peer.")
+ managedActions = property(_getManagedActions, _setManagedActions, None, "Overridden set of actions that are managed on the peer.")
########################################################################
@@ -2140,6 +2255,8 @@
- All of the other values must be non-empty strings if they are set to something other than C{None}.
- The overrides list must be a list of C{CommandOverride} objects.
- The hooks list must be a list of C{ActionHook} objects.
+ - The cback command must be a non-empty string.
+ - Any managed action name must be a non-empty string matching C{ACTION_NAME_REGEX}
@sort: __init__, __repr__, __str__, __cmp__, startingDay, workingDir,
backupUser, backupGroup, rcpCommand, rshCommand, overrides
@@ -2147,7 +2264,8 @@
def __init__(self, startingDay=None, workingDir=None, backupUser=None,
backupGroup=None, rcpCommand=None, overrides=None,
- hooks=None, rshCommand=None):
+ hooks=None, rshCommand=None, cbackCommand=None,
+ managedActions=None):
"""
Constructor for the C{OptionsConfig} class.
@@ -2157,8 +2275,10 @@
@param backupGroup: Effective group that backups should run as.
@param rcpCommand: Default rcp-compatible copy command for staging.
@param rshCommand: Default rsh-compatible command to use for remote shells.
+ @param cbackCommand: Default cback-compatible command to use on managed remote peers.
@param overrides: List of configured command path overrides, if any.
@param hooks: List of configured pre- and post-action hooks.
+ @parma managedActions: Default set of actions that are managed on remote peers.
@raise ValueError: If one of the values is invalid.
"""
@@ -2168,25 +2288,30 @@
self._backupGroup = None
self._rcpCommand = None
self._rshCommand = None
+ self._cbackCommand = None
self._overrides = None
self._hooks = None
+ self._managedActions = None
self.startingDay = startingDay
self.workingDir = workingDir
self.backupUser = backupUser
self.backupGroup = backupGroup
self.rcpCommand = rcpCommand
self.rshCommand = rshCommand
+ self.cbackCommand = cbackCommand
self.overrides = overrides
self.hooks = hooks
+ self.managedActions = managedActions
def __repr__(self):
"""
Official string representation for class instance.
"""
- return "OptionsConfig(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.startingDay, self.workingDir,
- self.backupUser, self.backupGroup,
- self.rcpCommand, self.overrides,
- self.hooks, self.rshCommand)
+ return "OptionsConfig(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.startingDay, self.workingDir,
+ self.backupUser, self.backupGroup,
+ self.rcpCommand, self.overrides,
+ self.hooks, self.rshCommand,
+ self.cbackCommand, self.managedActions)
def __str__(self):
"""
@@ -2232,6 +2357,11 @@
return -1
else:
return 1
+ if self._cbackCommand != other._cbackCommand:
+ if self._cbackCommand < other._cbackCommand:
+ return -1
+ else:
+ return 1
if self._overrides != other._overrides:
if self._overrides < other._overrides:
return -1
@@ -2242,6 +2372,11 @@
return -1
else:
return 1
+ if self._managedActions != other._managedActions:
+ if self._managedActions < other._managedActions:
+ return -1
+ else:
+ return 1
return 0
def _setStartingDay(self, value):
@@ -2349,6 +2484,23 @@
"""
return self._rshCommand
+ def _setCbackCommand(self, value):
+ """
+ Property target used to set the cback command.
+ The value must be a non-empty string if it is not C{None}.
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is not None:
+ if len(value) < 1:
+ raise ValueError("The cback command must be a non-empty string.")
+ self._cbackCommand = value
+
+ def _getCbackCommand(self):
+ """
+ Property target used to get the cback command.
+ """
+ return self._cbackCommand
+
def _setOverrides(self, value):
"""
Property target used to set the command path overrides list.
@@ -2395,14 +2547,38 @@
"""
return self._hooks
+ def _setManagedActions(self, value):
+ """
+ Property target used to set the managed actions list.
+ Elements do not have to exist on disk at the time of assignment.
+ """
+ if value is None:
+ self._managedActions = None
+ else:
+ try:
+ saved = self._managedActions
+ self._managedActions = RegexMatchList(ACTION_NAME_REGEX, emptyAllowed=False, prefix="Action name")
+ self._managedActions.extend(value)
+ except Exception, e:
+ self._managedActions = saved
+ raise e
+
+ def _getManagedActions(self):
+ """
+ Property target used to get the managed actions list.
+ """
+ return self._managedActions
+
startingDay = property(_getStartingDay, _setStartingDay, None, "Day that starts the week.")
workingDir = property(_getWorkingDir, _setWorkingDir, None, "Working (temporary) directory to use for backups.")
backupUser = property(_getBackupUser, _setBackupUser, None, "Effective user that backups should run as.")
backupGroup = property(_getBackupGroup, _setBackupGroup, None, "Effective group that backups should run as.")
rcpCommand = property(_getRcpCommand, _setRcpCommand, None, "Default rcp-compatible copy command for staging.")
rshCommand = property(_getRshCommand, _setRshCommand, None, "Default rsh-compatible command to use for remote shells.")
+ cbackCommand = property(_getCbackCommand, _setCbackCommand, None, "Default cback-compatible command to use on managed remote peers.")
overrides = property(_getOverrides, _setOverrides, None, "List of configured command path overrides, if any.")
hooks = property(_getHooks, _setHooks, None, "List of configured pre- and post-action hooks.")
+ managedActions = property(_getManagedActions, _setManagedActions, None, "Default set of actions that are managed on remote peers.")
########################################################################
@@ -4005,13 +4181,19 @@
backupGroup //cb_config/options/backup_group
rcpCommand //cb_config/options/rcp_command
rshCommand //cb_config/options/rsh_command
+ cbackCommand //cb_config/options/cback_command
+ managedActions //cb_config/options/managed_actions
+ The list of managed actions is a comma-separated list of action names.
+
We also read groups of the following items, one list element per
item::
overrides //cb_config/options/override
+ hooks //cb_config/options/hook
- The overrides are parsed by L{_parseOverrides}.
+ The overrides are parsed by L{_parseOverrides} and the hooks are parsed
+ by L{_parseHooks}.
@param parentNode: Parent node to search beneath.
@@ -4028,8 +4210,11 @@
options.backupGroup = readString(sectionNode, "backup_group")
options.rcpCommand = readString(sectionNode, "rcp_command")
options.rshCommand = readString(sectionNode, "rsh_command")
+ options.cbackCommand = readString(sectionNode, "cback_command")
options.overrides = Config._parseOverrides(sectionNode)
options.hooks = Config._parseHooks(sectionNode)
+ managedActions = readString(sectionNode, "managed_actions")
+ options.managedActions = Config._parseCommaSeparatedString(managedActions)
return options
_parseOptions = staticmethod(_parseOptions)
@@ -4441,8 +4626,12 @@
We also read the following individual fields for remote peers
only::
- remoteUser backup_user
- rcpCommand rcp_command
+ remoteUser backup_user
+ rcpCommand rcp_command
+ rshCommand rsh_command
+ cbackCommand cback_command
+ managed managed
+ managedActions managed_actions
Additionally, the value in the C{type} field is used to determine whether
this entry is a remote peer. If the type is C{"remote"}, it's a remote
@@ -4472,6 +4661,11 @@
remotePeer.collectDir = readString(entry, "collect_dir")
remotePeer.remoteUser = readString(entry, "backup_user")
remotePeer.rcpCommand = readString(entry, "rcp_command")
+ remotePeer.rshCommand = readString(entry, "rsh_command")
+ remotePeer.cbackCommand = readString(entry, "cback_command")
+ remotePeer.managed = readBoolean(entry, "managed")
+ managedActions = readString(entry, "managed_actions")
+ remotePeer.managedActions = Config._parseCommaSeparatedString(managedActions)
remotePeers.append(remotePeer)
if localPeers == []:
localPeers = None
@@ -4655,6 +4849,8 @@
backupGroup //cb_config/options/backup_group
rcpCommand //cb_config/options/rcp_command
rshCommand //cb_config/options/rsh_command
+ cbackCommand //cb_config/options/cback_command
+ managedActions //cb_config/options/managed_actions
We also add groups of the following items, one list element per
item::
@@ -4680,6 +4876,9 @@
addStringNode(xmlDom, sectionNode, "backup_group", optionsConfig.backupGroup)
addStringNode(xmlDom, sectionNode, "rcp_command", optionsConfig.rcpCommand)
addStringNode(xmlDom, sectionNode, "rsh_command", optionsConfig.rshCommand)
+ addStringNode(xmlDom, sectionNode, "cback_command", optionsConfig.cbackCommand)
+ managedActions = Config._buildCommaSeparatedString(optionsConfig.managedActions)
+ addStringNode(xmlDom, sectionNode, "managed_actions", managedActions)
if optionsConfig.overrides is not None:
for override in optionsConfig.overrides:
Config._addOverride(xmlDom, sectionNode, override)
@@ -5077,10 +5276,15 @@
We add the following fields to the document::
- name peer/name
- collectDir peer/collect_dir
- remoteUser peer/backup_user
- rcpCommand peer/rcp_command
+ name peer/name
+ collectDir peer/collect_dir
+ remoteUser peer/backup_user
+ rcpCommand peer/rcp_command
+ rcpCommand peer/rcp_command
+ rshCommand peer/rsh_command
+ cbackCommand peer/cback_command
+ managed peer/managed
+ managedActions peer/managed_actions
Additionally, C{peer/type} is filled in with C{"remote"}, since this is a
remote peer.
@@ -5102,6 +5306,11 @@
addStringNode(xmlDom, sectionNode, "collect_dir", remotePeer.collectDir)
addStringNode(xmlDom, sectionNode, "backup_user", remotePeer.remoteUser)
addStringNode(xmlDom, sectionNode, "rcp_command", remotePeer.rcpCommand)
+ addStringNode(xmlDom, sectionNode, "rsh_command", remotePeer.rshCommand)
+ addStringNode(xmlDom, sectionNode, "cback_command", remotePeer.cbackCommand)
+ addBooleanNode(xmlDom, sectionNode, "managed", remotePeer.managed)
+ managedActions = Config._buildCommaSeparatedString(remotePeer.managedActions)
+ addStringNode(xmlDom, sectionNode, "managed_actions", managedActions)
_addRemotePeer = staticmethod(_addRemotePeer)
def _addPurgeDir(xmlDom, parentNode, purgeDir):
@@ -5459,6 +5668,9 @@
raise ValueError("Remote user must either be set in options section or individual remote peer.")
if (self.options is None or self.options.rcpCommand is None) and remotePeer.rcpCommand is None: # redundant
raise ValueError("Remote copy command must either be set in options section or individual remote peer.")
+ if remotePeer.managed:
+ if (self.options is None or self.options.rshCommand is None) and remotePeer.rshCommand is None: # redundant
+ raise ValueError("Remote shell command must either be set in options section or individual remote peer.")
Config._checkUnique("Duplicate peer names exist:", names)
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2007-12-15 21:43:57 UTC (rev 810)
+++ cedar-backup2/trunk/test/configtests.py 2007-12-15 23:10:39 UTC (rev 811)
@@ -3313,16 +3313,24 @@
self.failUnlessEqual(None, remotePeer.collectDir)
self.failUnlessEqual(None, remotePeer.remoteUser)
self.failUnlessEqual(None, remotePeer.rcpCommand)
+ self.failUnlessEqual(None, remotePeer.rshCommand)
+ self.failUnlessEqual(None, remotePeer.cbackCommand)
+ self.failUnlessEqual(False, remotePeer.managed)
+ self.failUnlessEqual(None, remotePeer.managedActions)
def testConstructor_002(self):
"""
Test constructor with all values filled in, with valid values.
"""
- remotePeer = RemotePeer("myname", "/stuff", "backup", "scp -1 -B")
+ remotePeer = RemotePeer("myname", "/stuff", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failUnlessEqual("myname", remotePeer.name)
self.failUnlessEqual("/stuff", remotePeer.collectDir)
self.failUnlessEqual("backup", remotePeer.remoteUser)
self.failUnlessEqual("scp -1 -B", remotePeer.rcpCommand)
+ self.failUnlessEqual("ssh", remotePeer.rshCommand)
+ self.failUnlessEqual("cback", remotePeer.cbackCommand)
+ self.failUnlessEqual(True, remotePeer.managed)
+ self.failUnlessEqual(["collect", ], remotePeer.managedActions)
def testConstructor_003(self):
"""
@@ -3441,7 +3449,132 @@
self.failUnlessAssignRaises(ValueError, remotePeer, "rcpCommand", "")
self.failUnlessEqual(None, remotePeer.rcpCommand)
+ def testConstructor_016(self):
+ """
+ Test assignment of rshCommand attribute, valid value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.rshCommand)
+ remotePeer.rshCommand = "scp"
+ self.failUnlessEqual("scp", remotePeer.rshCommand)
+ def testConstructor_017(self):
+ """
+ Test assignment of rshCommand attribute, invalid value (empty).
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.rshCommand)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "rshCommand", "")
+ self.failUnlessEqual(None, remotePeer.rshCommand)
+
+ def testConstructor_018(self):
+ """
+ Test assignment of cbackCommand attribute, valid value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.cbackCommand)
+ remotePeer.cbackCommand = "scp"
+ self.failUnlessEqual("scp", remotePeer.cbackCommand)
+
+ def testConstructor_019(self):
+ """
+ Test assignment of cbackCommand attribute, invalid value (empty).
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.cbackCommand)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "cbackCommand", "")
+ self.failUnlessEqual(None, remotePeer.cbackCommand)
+
+ def testConstructor_021(self):
+ """
+ Test assignment of managed attribute, None value.
+ """
+ remotePeer = RemotePeer(managed=True)
+ self.failUnlessEqual(True, remotePeer.managed)
+ remotePeer.managed = None
+ self.failUnlessEqual(False, remotePeer.managed)
+
+ def testConstructor_022(self):
+ """
+ Test assignment of managed attribute, valid value (real boolean).
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(False, remotePeer.managed)
+ remotePeer.managed = True
+ self.failUnlessEqual(True, remotePeer.managed)
+ remotePeer.managed = False
+ self.failUnlessEqual(False, remotePeer.managed)
+
+ def testConstructor_023(self):
+ """
+ Test assignment of managed attribute, valid value (expression).
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(False, remotePeer.managed)
+ remotePeer.managed = 0
+ self.failUnlessEqual(False, remotePeer.managed)
+ remotePeer.managed = []
+ self.failUnlessEqual(False, remotePeer.managed)
+ remotePeer.managed = None
+ self.failUnlessEqual(False, remotePeer.managed)
+ remotePeer.managed = ['a']
+ self.failUnlessEqual(True, remotePeer.managed)
+ remotePeer.managed = 3
+ self.failUnlessEqual(True, remotePeer.managed)
+
+ def testConstructor_024(self):
+ """
+ Test assignment of managedActions attribute, None value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ remotePeer.managedActions = None
+ self.failUnlessEqual(None, remotePeer.managedActions)
+
+ def testConstructor_025(self):
+ """
+ Test assignment of managedActions attribute, empty list.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ remotePeer.managedActions = []
+ self.failUnlessEqual([], remotePeer.managedActions)
+
+ def testConstructor_026(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, valid values.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ remotePeer.managedActions = ['a', 'b', ]
+ self.failUnlessEqual(['a', 'b'], remotePeer.managedActions)
+
+ def testConstructor_027(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, invalid value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["KEN", ])
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["hello, world" ])
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["dash-word", ])
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["", ])
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", [None, ])
+ self.failUnlessEqual(None, remotePeer.managedActions)
+
+ def testConstructor_028(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, mixed values.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["ken", "dash-word", ])
+
+
############################
# Test comparison operators
############################
@@ -3464,8 +3597,8 @@
"""
Test comparison of two identical objects, all attributes non-None.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failUnless(remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
self.failUnless(remotePeer1 <= remotePeer2)
@@ -3491,8 +3624,8 @@
"""
Test comparison of two differing objects, name differs.
"""
- remotePeer1 = RemotePeer("name1", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
- remotePeer2 = RemotePeer("name2", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
+ remotePeer1 = RemotePeer("name1", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name2", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -3519,8 +3652,8 @@
"""
Test comparison of two differing objects, collectDir differs.
"""
- remotePeer1 = RemotePeer("name", "/etc", "backup", "scp -1 -B")
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
+ remotePeer1 = RemotePeer("name", "/etc", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -3547,8 +3680,8 @@
"""
Test comparison of two differing objects, remoteUser differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "spot", "scp -1 -B")
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "spot", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -3575,8 +3708,8 @@
"""
Test comparison of two differing objects, rcpCommand differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -2 -B")
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B")
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -2 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -3585,7 +3718,151 @@
self.failUnless(remotePeer1 >= remotePeer2)
self.failUnless(remotePeer1 != remotePeer2)
+ def testComparison_011(self):
+ """
+ Test comparison of two differing objects, rshCommand differs (one None).
+ """
+ remotePeer1 = RemotePeer()
+ remotePeer2 = RemotePeer(rshCommand="ssh")
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+ def testComparison_012(self):
+ """
+ Test comparison of two differing objects, rshCommand differs.
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh2", "cback", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh1", "cback", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(not remotePeer1 < remotePeer2)
+ self.failUnless(not remotePeer1 <= remotePeer2)
+ self.failUnless(remotePeer1 > remotePeer2)
+ self.failUnless(remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_013(self):
+ """
+ Test comparison of two differing objects, cbackCommand differs (one None).
+ """
+ remotePeer1 = RemotePeer()
+ remotePeer2 = RemotePeer(cbackCommand="cback")
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_014(self):
+ """
+ Test comparison of two differing objects, cbackCommand differs.
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback2", True, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback1", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(not remotePeer1 < remotePeer2)
+ self.failUnless(not remotePeer1 <= remotePeer2)
+ self.failUnless(remotePeer1 > remotePeer2)
+ self.failUnless(remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_015(self):
+ """
+ Test comparison of two differing objects, managed differs (one None).
+ """
+ remotePeer1 = RemotePeer()
+ remotePeer2 = RemotePeer(managed=True)
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_016(self):
+ """
+ Test comparison of two differing objects, managed differs.
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", False, [ "collect", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_017(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ None, one empty).
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None)
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_018(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ None, one not empty).
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None)
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_019(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ empty, one not empty).
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [] )
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+ def testComparison_020(self):
+ """
+ Test comparison of two differing objects, managedActions differs (both
+ not empty).
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "purge", ])
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(not remotePeer1 < remotePeer2)
+ self.failUnless(not remotePeer1 <= remotePeer2)
+ self.failUnless(remotePeer1 > remotePeer2)
+ self.failUnless(remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+
############################
# TestReferenceConfig class
############################
@@ -4300,21 +4577,26 @@
self.failUnlessEqual(None, options.backupGroup)
self.failUnlessEqual(None, options.rcpCommand)
self.failUnlessEqual(None, options.rshCommand)
+ self.failUnlessEqual(None, options.cbackCommand)
self.failUnlessEqual(None, options.overrides)
+ self.failUnlessEqual(None, options.hooks)
+ self.failUnlessEqual(None, options.managedActions)
def testConstructor_002(self):
"""
Test constructor with all values filled in, with valid values (lists empty).
"""
- options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", [], [], "ssh")
+ options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", [], [], "ssh", "cback", [])
self.failUnlessEqual("monday", options.startingDay)
self.failUnlessEqual("/tmp", options.workingDir)
self.failUnlessEqual("user", options.backupUser)
self.failUnlessEqual("group", options.backupGroup)
self.failUnlessEqual("scp -1 -B", options.rcpCommand)
self.failUnlessEqual("ssh", options.rshCommand)
+ self.failUnlessEqual("cback", options.cbackCommand)
self.failUnlessEqual([], options.overrides)
self.failUnlessEqual([], options.hooks)
+ self.failUnlessEqual([], options.managedActions)
def testConstructor_003(self):
"""
@@ -4487,15 +4769,18 @@
"""
overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), ]
hooks = [ PreActionHook("collect", "ls -l"), ]
- options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failUnlessEqual("monday", options.startingDay)
self.failUnlessEqual("/tmp", options.workingDir)
self.failUnlessEqual("user", options.backupUser)
self.failUnlessEqual("group", options.backupGroup)
self.failUnlessEqual("scp -1 -B", options.rcpCommand)
self.failUnlessEqual("ssh", options.rshCommand)
+ self.failUnlessEqual("cback", options.cbackCommand)
self.failUnlessEqual(overrides, options.overrides)
self.failUnlessEqual(hooks, options.hooks)
+ self.failUnlessEqual(managedActions, options.managedActions)
def testConstructor_021(self):
"""
@@ -4658,7 +4943,86 @@
self.failUnlessAssignRaises(ValueError, options, "rshCommand", "")
self.failUnlessEqual(None, options.rshCommand)
+ def testConstructor_038(self):
+ """
+ Test assignment of cbackCommand attribute, None value.
+ """
+ options = OptionsConfig(cbackCommand="command")
+ self.failUnlessEqual("command", options.cbackCommand)
+ options.cbackCommand = None
+ self.failUnlessEqual(None, options.cbackCommand)
+ def testConstructor_039(self):
+ """
+ Test assignment of cbackCommand attribute, valid value.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.cbackCommand)
+ options.cbackCommand = "command"
+ self.failUnlessEqual("command", options.cbackCommand)
+
+ def testConstructor_040(self):
+ """
+ Test assignment of cbackCommand attribute, invalid value (empty).
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.cbackCommand)
+ self.failUnlessAssignRaises(ValueError, options, "cbackCommand", "")
+ self.failUnlessEqual(None, options.cbackCommand)
+
+ def testConstructor_041(self):
+ """
+ Test assignment of managedActions attribute, None value.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.managedActions)
+ options.managedActions = None
+ self.failUnlessEqual(None, options.managedActions)
+
+ def testConstructor_042(self):
+ """
+ Test assignment of managedActions attribute, empty list.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.managedActions)
+ options.managedActions = []
+ self.failUnlessEqual([], options.managedActions)
+
+ def testConstructor_043(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, valid values.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.managedActions)
+ options.managedActions = ['a', 'b', ]
+ self.failUnlessEqual(['a', 'b'], options.managedActions)
+
+ def testConstructor_044(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, invalid value.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", ["KEN", ])
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", ["hello, world" ])
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", ["dash-word", ])
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", ["", ])
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", [None, ])
+ self.failUnlessEqual(None, options.managedActions)
+
+ def testConstructor_045(self):
+ """
+ Test assignment of managedActions attribute, non-empty list, mixed values.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.managedActions)
+ self.failUnlessAssignRaises(ValueError, options, "managedActions", ["ken", "dash-word", ])
+
+
############################
# Test comparison operators
############################
@@ -4683,8 +5047,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failUnlessEqual(options1, options2)
self.failUnless(options1 == options2)
self.failUnless(not options1 < options2)
@@ -4713,8 +5078,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("tuesday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("tuesday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4743,8 +5109,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp/whatever", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp/whatever", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4773,8 +5140,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user2", "group", "scp -1 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user1", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user2", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user1", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4803,8 +5171,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group1", "scp -1 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group2", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group1", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group2", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4833,8 +5202,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -2 -B", overrides, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -2 -B", overrides, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4851,8 +5221,9 @@
overrides1 = None
overrides2 = []
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4869,8 +5240,9 @@
overrides1 = None
overrides2 = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2, "ssh")
self.failUnless(options1 < options2)
@@ -4887,8 +5259,9 @@
overrides1 = [ CommandOverride("one", "/one"), ]
overrides2 = []
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4905,8 +5278,9 @@
overrides1 = [ CommandOverride("one", "/one"), ]
overrides2 = [ CommandOverride(), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4923,8 +5297,9 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = None
hooks2 = []
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4941,8 +5316,9 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
hooks2 = [ PostActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 > options2)
@@ -4959,8 +5335,9 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
hooks2 = [ PreActionHook("stage", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 > options2)
@@ -4977,8 +5354,9 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
hooks2 = [ PostActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -5007,8 +5385,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh2")
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh1")
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh2", "cback", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh1", "cback", managedActions)
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -5017,7 +5396,114 @@
self.failUnless(options1 >= options2)
self.failUnless(options1 != options2)
+ def testComparison_023(self):
+ """
+ Test comparison of two differing objects, cbackCommand differs (one None).
+ """
+ options1 = OptionsConfig()
+ options2 = OptionsConfig(rshCommand="command")
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 != options2)
+ def testComparison_024(self):
+ """
+ Test comparison of two differing objects, cbackCommand differs.
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ managedActions = [ "collect", "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback1", managedActions)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback2", managedActions)
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 != options2)
+
+ def testComparison_025(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ None, one empty).
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ managedActions1 = None
+ managedActions2 = []
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions1)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions2)
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 != options2)
+
+ def testComparison_026(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ None, one not empty).
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ managedActions1 = None
+ managedActions2 = [ "collect", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions1)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions2)
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(options1 != options2)
+
+ def testComparison_027(self):
+ """
+ Test comparison of two differing objects, managedActions differs (one
+ empty, one not empty).
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ managedActions1 = []
+ managedActions2 = [ "collect", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions1)
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh", "cback", managedActions2)
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(options1 != options2)
+
+ def testComparison_028(self):
+ """
+ Test comparison of two differing objects, managedActions differs (both
+ not empty).
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ managedActions1 = [ "collect", ]
+ managedActions2 = [ "purge", ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, ...
[truncated message content] |
|
From: <pro...@us...> - 2007-12-15 21:44:07
|
Revision: 810
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=810&view=rev
Author: pronovic
Date: 2007-12-15 13:43:57 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Document rsh_command option
Modified Paths:
--------------
cedar-backup2/trunk/manual/src/config.xml
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2007-12-15 21:40:44 UTC (rev 809)
+++ cedar-backup2/trunk/manual/src/config.xml 2007-12-15 21:43:57 UTC (rev 810)
@@ -334,6 +334,7 @@
<backup_user>backup</backup_user>
<backup_group>backup</backup_group>
<rcp_command>/usr/bin/scp -B</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
<override>
<command>cdrecord</command>
<abs_path>/opt/local/bin/cdrecord</abs_path>
@@ -459,6 +460,25 @@
</varlistentry>
<varlistentry>
+ <term><literal>rsh_command</literal></term>
+ <listitem>
+ <para>Default rsh-compatible command to use for remote shells.</para>
+ <para>
+ The rsh command should be the exact command used for
+ remote shells, including any required options.
+ </para>
+ <para>
+ This value is used as the default value for all remote
+ peers. It is optional, because it is only used for
+ managed peers.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> If provided, must be non-empty
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>override</literal></term>
<listitem>
<para>Command to override with a customized path.</para>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 21:40:56
|
Revision: 809
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=809&view=rev
Author: pronovic
Date: 2007-12-15 13:40:44 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Add rshCommand to OptionsConfig (and fix some unit test)
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/test/configtests.py
cedar-backup2/trunk/test/data/cback.conf.15
cedar-backup2/trunk/test/data/cback.conf.20
cedar-backup2/trunk/test/data/cback.conf.21
cedar-backup2/trunk/test/data/cback.conf.6
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 21:40:44 UTC (rev 809)
@@ -159,9 +159,9 @@
I{Options Validations}
- All fields must be filled in. The rcp command is used as a default value
- for all remote peers in the staging section. Remote peers can also rely on
- the backup user as the default remote user name if they choose.
+ All fields must be filled in except the rsh command. The rcp and rsh
+ commands are used as default values for all remote peers. Remote peers can
+ also rely on the backup user as the default remote user name if they choose.
I{Peers Validations}
@@ -2142,11 +2142,12 @@
- The hooks list must be a list of C{ActionHook} objects.
@sort: __init__, __repr__, __str__, __cmp__, startingDay, workingDir,
- backupUser, backupGroup, rcpCommand, overrides
+ backupUser, backupGroup, rcpCommand, rshCommand, overrides
"""
def __init__(self, startingDay=None, workingDir=None, backupUser=None,
- backupGroup=None, rcpCommand=None, overrides=None, hooks=None):
+ backupGroup=None, rcpCommand=None, overrides=None,
+ hooks=None, rshCommand=None):
"""
Constructor for the C{OptionsConfig} class.
@@ -2155,6 +2156,7 @@
@param backupUser: Effective user that backups should run as.
@param backupGroup: Effective group that backups should run as.
@param rcpCommand: Default rcp-compatible copy command for staging.
+ @param rshCommand: Default rsh-compatible command to use for remote shells.
@param overrides: List of configured command path overrides, if any.
@param hooks: List of configured pre- and post-action hooks.
@@ -2165,6 +2167,7 @@
self._backupUser = None
self._backupGroup = None
self._rcpCommand = None
+ self._rshCommand = None
self._overrides = None
self._hooks = None
self.startingDay = startingDay
@@ -2172,6 +2175,7 @@
self.backupUser = backupUser
self.backupGroup = backupGroup
self.rcpCommand = rcpCommand
+ self.rshCommand = rshCommand
self.overrides = overrides
self.hooks = hooks
@@ -2179,10 +2183,10 @@
"""
Official string representation for class instance.
"""
- return "OptionsConfig(%s, %s, %s, %s, %s, %s, %s)" % (self.startingDay, self.workingDir,
- self.backupUser, self.backupGroup,
- self.rcpCommand, self.overrides,
- self.hooks)
+ return "OptionsConfig(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.startingDay, self.workingDir,
+ self.backupUser, self.backupGroup,
+ self.rcpCommand, self.overrides,
+ self.hooks, self.rshCommand)
def __str__(self):
"""
@@ -2223,6 +2227,11 @@
return -1
else:
return 1
+ if self._rshCommand != other._rshCommand:
+ if self._rshCommand < other._rshCommand:
+ return -1
+ else:
+ return 1
if self._overrides != other._overrides:
if self._overrides < other._overrides:
return -1
@@ -2323,6 +2332,23 @@
"""
return self._rcpCommand
+ def _setRshCommand(self, value):
+ """
+ Property target used to set the rsh command.
+ The value must be a non-empty string if it is not C{None}.
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is not None:
+ if len(value) < 1:
+ raise ValueError("The rsh command must be a non-empty string.")
+ self._rshCommand = value
+
+ def _getRshCommand(self):
+ """
+ Property target used to get the rsh command.
+ """
+ return self._rshCommand
+
def _setOverrides(self, value):
"""
Property target used to set the command path overrides list.
@@ -2374,6 +2400,7 @@
backupUser = property(_getBackupUser, _setBackupUser, None, "Effective user that backups should run as.")
backupGroup = property(_getBackupGroup, _setBackupGroup, None, "Effective group that backups should run as.")
rcpCommand = property(_getRcpCommand, _setRcpCommand, None, "Default rcp-compatible copy command for staging.")
+ rshCommand = property(_getRshCommand, _setRshCommand, None, "Default rsh-compatible command to use for remote shells.")
overrides = property(_getOverrides, _setOverrides, None, "List of configured command path overrides, if any.")
hooks = property(_getHooks, _setHooks, None, "List of configured pre- and post-action hooks.")
@@ -3977,6 +4004,7 @@
backupUser //cb_config/options/backup_user
backupGroup //cb_config/options/backup_group
rcpCommand //cb_config/options/rcp_command
+ rshCommand //cb_config/options/rsh_command
We also read groups of the following items, one list element per
item::
@@ -3999,6 +4027,7 @@
options.backupUser = readString(sectionNode, "backup_user")
options.backupGroup = readString(sectionNode, "backup_group")
options.rcpCommand = readString(sectionNode, "rcp_command")
+ options.rshCommand = readString(sectionNode, "rsh_command")
options.overrides = Config._parseOverrides(sectionNode)
options.hooks = Config._parseHooks(sectionNode)
return options
@@ -4625,6 +4654,7 @@
backupUser //cb_config/options/backup_user
backupGroup //cb_config/options/backup_group
rcpCommand //cb_config/options/rcp_command
+ rshCommand //cb_config/options/rsh_command
We also add groups of the following items, one list element per
item::
@@ -4649,6 +4679,7 @@
addStringNode(xmlDom, sectionNode, "backup_user", optionsConfig.backupUser)
addStringNode(xmlDom, sectionNode, "backup_group", optionsConfig.backupGroup)
addStringNode(xmlDom, sectionNode, "rcp_command", optionsConfig.rcpCommand)
+ addStringNode(xmlDom, sectionNode, "rsh_command", optionsConfig.rshCommand)
if optionsConfig.overrides is not None:
for override in optionsConfig.overrides:
Config._addOverride(xmlDom, sectionNode, override)
@@ -5231,9 +5262,10 @@
"""
Validates options configuration.
- All fields must be filled in. The rcp command is used as a default value
- for all remote peers in the staging section. Remote peers can also rely
- on the backup user as the default remote user name if they choose.
+ All fields must be filled in except the rsh command. The rcp and rsh
+ commands are used as default values for all remote peers. Remote peers
+ can also rely on the backup user as the default remote user name if they
+ choose.
@raise ValueError: If reference configuration is invalid.
"""
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/test/configtests.py 2007-12-15 21:40:44 UTC (rev 809)
@@ -4299,19 +4299,22 @@
self.failUnlessEqual(None, options.backupUser)
self.failUnlessEqual(None, options.backupGroup)
self.failUnlessEqual(None, options.rcpCommand)
+ self.failUnlessEqual(None, options.rshCommand)
self.failUnlessEqual(None, options.overrides)
def testConstructor_002(self):
"""
Test constructor with all values filled in, with valid values (lists empty).
"""
- options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", [])
+ options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", [], [], "ssh")
self.failUnlessEqual("monday", options.startingDay)
self.failUnlessEqual("/tmp", options.workingDir)
self.failUnlessEqual("user", options.backupUser)
self.failUnlessEqual("group", options.backupGroup)
self.failUnlessEqual("scp -1 -B", options.rcpCommand)
+ self.failUnlessEqual("ssh", options.rshCommand)
self.failUnlessEqual([], options.overrides)
+ self.failUnlessEqual([], options.hooks)
def testConstructor_003(self):
"""
@@ -4483,13 +4486,14 @@
Test constructor with all values filled in, with valid values (lists not empty).
"""
overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), ]
- hooks = [ ActionHook("collect", "ls -l"), ]
- options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
+ hooks = [ PreActionHook("collect", "ls -l"), ]
+ options = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failUnlessEqual("monday", options.startingDay)
self.failUnlessEqual("/tmp", options.workingDir)
self.failUnlessEqual("user", options.backupUser)
self.failUnlessEqual("group", options.backupGroup)
self.failUnlessEqual("scp -1 -B", options.rcpCommand)
+ self.failUnlessEqual("ssh", options.rshCommand)
self.failUnlessEqual(overrides, options.overrides)
self.failUnlessEqual(hooks, options.hooks)
@@ -4584,8 +4588,8 @@
"""
collect = OptionsConfig()
self.failUnlessEqual(None, collect.hooks)
- collect.hooks = [ActionHook("stage", "df -k"), ]
- self.failUnlessEqual([ActionHook("stage", "df -k"), ], collect.hooks)
+ collect.hooks = [PreActionHook("stage", "df -k"), ]
+ self.failUnlessEqual([PreActionHook("stage", "df -k"), ], collect.hooks)
def testConstructor_031(self):
"""
@@ -4594,8 +4598,8 @@
"""
collect = OptionsConfig()
self.failUnlessEqual(None, collect.hooks)
- collect.hooks = [ ActionHook("stage", "df -k"), ActionHook("collect", "ls -l"), ]
- self.failUnlessEqual([ActionHook("stage", "df -k"), ActionHook("collect", "ls -l"), ], collect.hooks)
+ collect.hooks = [ PreActionHook("stage", "df -k"), PostActionHook("collect", "ls -l"), ]
+ self.failUnlessEqual([PreActionHook("stage", "df -k"), PostActionHook("collect", "ls -l"), ], collect.hooks)
def testConstructor_032(self):
"""
@@ -4624,10 +4628,37 @@
"""
collect = OptionsConfig()
self.failUnlessEqual(None, collect.hooks)
- self.failUnlessAssignRaises(ValueError, collect, "hooks", [ "hello", ActionHook("stage", "df -k"), ])
+ self.failUnlessAssignRaises(ValueError, collect, "hooks", [ "hello", PreActionHook("stage", "df -k"), ])
self.failUnlessEqual(None, collect.hooks)
+ def testConstructor_035(self):
+ """
+ Test assignment of rshCommand attribute, None value.
+ """
+ options = OptionsConfig(rshCommand="command")
+ self.failUnlessEqual("command", options.rshCommand)
+ options.rshCommand = None
+ self.failUnlessEqual(None, options.rshCommand)
+ def testConstructor_036(self):
+ """
+ Test assignment of rshCommand attribute, valid value.
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.rshCommand)
+ options.rshCommand = "command"
+ self.failUnlessEqual("command", options.rshCommand)
+
+ def testConstructor_037(self):
+ """
+ Test assignment of rshCommand attribute, invalid value (empty).
+ """
+ options = OptionsConfig()
+ self.failUnlessEqual(None, options.rshCommand)
+ self.failUnlessAssignRaises(ValueError, options, "rshCommand", "")
+ self.failUnlessEqual(None, options.rshCommand)
+
+
############################
# Test comparison operators
############################
@@ -4652,8 +4683,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failUnlessEqual(options1, options2)
self.failUnless(options1 == options2)
self.failUnless(not options1 < options2)
@@ -4682,8 +4713,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
- options2 = OptionsConfig("tuesday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("tuesday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4712,8 +4743,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp/whatever", "user", "group", "scp -1 -B", overrides, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp/whatever", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4742,8 +4773,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user2", "group", "scp -1 -B", overrides, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user1", "group", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user2", "group", "scp -1 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user1", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4772,8 +4803,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group1", "scp -1 -B", overrides, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group2", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group1", "scp -1 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group2", "scp -1 -B", overrides, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4802,8 +4833,8 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -2 -B", overrides, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -2 -B", overrides, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4820,8 +4851,8 @@
overrides1 = None
overrides2 = []
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4838,10 +4869,10 @@
overrides1 = None
overrides2 = [ CommandOverride("one", "/one"), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
self.failIfEqual(options1, options2)
- self.failUnless(not options1 == options2)
+ self.failUnless(not options1 == options2, "ssh")
self.failUnless(options1 < options2)
self.failUnless(options1 <= options2)
self.failUnless(not options1 > options2)
@@ -4856,8 +4887,8 @@
overrides1 = [ CommandOverride("one", "/one"), ]
overrides2 = []
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4874,8 +4905,8 @@
overrides1 = [ CommandOverride("one", "/one"), ]
overrides2 = [ CommandOverride(), ]
hooks = [ PreActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides1, hooks, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides2, hooks, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4892,8 +4923,8 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = None
hooks2 = []
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 < options2)
@@ -4910,8 +4941,8 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
hooks2 = [ PostActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(options1 > options2)
@@ -4928,8 +4959,8 @@
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
hooks2 = [ PreActionHook("stage", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2)
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 > options2)
@@ -4945,9 +4976,9 @@
"""
overrides = [ CommandOverride("one", "/one"), ]
hooks1 = [ PreActionHook("collect", "ls -l ") ]
- hooks2 = [ ActionHook("collect", "ls -l ") ]
- options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1)
- options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2)
+ hooks2 = [ PostActionHook("collect", "ls -l ") ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks1, "ssh")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks2, "ssh")
self.failIfEqual(options1, options2)
self.failUnless(not options1 == options2)
self.failUnless(not options1 < options2)
@@ -4956,7 +4987,37 @@
self.failUnless(options1 >= options2)
self.failUnless(options1 != options2)
+ def testComparison_021(self):
+ """
+ Test comparison of two differing objects, rshCommand differs (one None).
+ """
+ options1 = OptionsConfig()
+ options2 = OptionsConfig(rshCommand="command")
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(options1 < options2)
+ self.failUnless(options1 <= options2)
+ self.failUnless(not options1 > options2)
+ self.failUnless(not options1 >= options2)
+ self.failUnless(options1 != options2)
+ def testComparison_022(self):
+ """
+ Test comparison of two differing objects, rshCommand differs.
+ """
+ overrides = [ CommandOverride("one", "/one"), ]
+ hooks = [ PreActionHook("collect", "ls -l ") ]
+ options1 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh2")
+ options2 = OptionsConfig("monday", "/tmp", "user", "group", "scp -1 -B", overrides, hooks, "ssh1")
+ self.failIfEqual(options1, options2)
+ self.failUnless(not options1 == options2)
+ self.failUnless(not options1 < options2)
+ self.failUnless(not options1 <= options2)
+ self.failUnless(options1 > options2)
+ self.failUnless(options1 >= options2)
+ self.failUnless(options1 != options2)
+
+
########################
# TestPeersConfig class
########################
@@ -7653,6 +7714,7 @@
self.failUnlessEqual(None, config.reference)
self.failUnlessEqual(None, config.extensions)
self.failUnlessEqual(None, config.options)
+ self.failUnlessEqual(None, config.peers)
self.failUnlessEqual(None, config.collect)
self.failUnlessEqual(None, config.stage)
self.failUnlessEqual(None, config.store)
@@ -7666,6 +7728,7 @@
self.failUnlessEqual(None, config.reference)
self.failUnlessEqual(None, config.extensions)
self.failUnlessEqual(None, config.options)
+ self.failUnlessEqual(None, config.peers)
self.failUnlessEqual(None, config.collect)
self.failUnlessEqual(None, config.stage)
self.failUnlessEqual(None, config.store)
@@ -7689,6 +7752,7 @@
self.failUnlessEqual(None, config.reference)
self.failUnlessEqual(None, config.extensions)
self.failUnlessEqual(None, config.options)
+ self.failUnlessEqual(None, config.peers)
self.failUnlessEqual(None, config.collect)
self.failUnlessEqual(None, config.stage)
self.failUnlessEqual(None, config.store)
@@ -7703,6 +7767,7 @@
self.failUnlessEqual(None, config.reference)
self.failUnlessEqual(None, config.extensions)
self.failUnlessEqual(None, config.options)
+ self.failUnlessEqual(None, config.peers)
self.failUnlessEqual(None, config.collect)
self.failUnlessEqual(None, config.stage)
self.failUnlessEqual(None, config.store)
@@ -7869,7 +7934,30 @@
config = Config()
self.failUnlessAssignRaises(ValueError, config, "purge", CollectDir())
+ def testConstructor_027(self):
+ """
+ Test assignment of peers attribute, None value.
+ """
+ config = Config()
+ config.peers = None
+ self.failUnlessEqual(None, config.peers)
+ def testConstructor_028(self):
+ """
+ Test assignment of peers attribute, valid value.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ self.failUnlessEqual(PeersConfig(), config.peers)
+
+ def testConstructor_029(self):
+ """
+ Test assignment of peers attribute, invalid value (not PeersConfig).
+ """
+ config = Config()
+ self.failUnlessAssignRaises(ValueError, config, "peers", CollectDir())
+
+
############################
# Test comparison operators
############################
@@ -9860,7 +9948,7 @@
path = self.resources["cback.conf.6"]
config = Config(xmlPath=path, validate=False)
expected = Config()
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PostActionHook("stage", "df -k"), ]
self.failUnlessEqual(expected, config)
@@ -10103,7 +10191,7 @@
expected.extensions.actions = []
expected.extensions.actions.append(ExtendedAction("example", "something.whatever", "example", 102))
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", 350))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.collect = CollectConfig("/opt/backup/collect", "daily", "targz", ".cbignore")
@@ -10168,7 +10256,7 @@
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", index=None,
dependencies=ActionDependencies(beforeList=["a", "b", "c",],
afterList=["one",])))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.collect = CollectConfig("/opt/backup/collect", "daily", "targz", ".cbignore")
@@ -10230,7 +10318,7 @@
expected.extensions.actions = []
expected.extensions.actions.append(ExtendedAction("example", "something.whatever", "example", 102))
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", 350))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.collect = CollectConfig("/opt/backup/collect", "daily", "targz", ".cbignore")
@@ -10295,7 +10383,7 @@
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", index=None,
dependencies=ActionDependencies(beforeList=["a", "b", "c",],
afterList=["one",])))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.collect = CollectConfig("/opt/backup/collect", "daily", "targz", ".cbignore")
@@ -10439,7 +10527,7 @@
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", index=None,
dependencies=ActionDependencies(beforeList=["a", "b", "c",],
afterList=["one",])))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.peers = PeersConfig()
@@ -10506,7 +10594,7 @@
expected.extensions.actions.append(ExtendedAction("bogus", "module", "something", index=None,
dependencies=ActionDependencies(beforeList=["a", "b", "c",],
afterList=["one",])))
- expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B")
+ expected.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "group", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
expected.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
expected.options.hooks = [ PreActionHook("collect", "ls -l"), PreActionHook("subversion", "mailx -S \"hello\""), PostActionHook("stage", "df -k"), ]
expected.peers = PeersConfig()
@@ -10734,8 +10822,9 @@
Extract document containing only a valid options section, validate=True.
"""
before = Config()
- before.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "backup", "/usr/bin/scp -1 -B")
+ before.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "backup", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
before.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
+ before.options.hooks = [ PostActionHook("collect", "ls -l"), ]
self.failUnlessRaises(ValueError, before.extractXml, validate=True)
def testExtractXml_012(self):
@@ -10743,8 +10832,9 @@
Extract document containing only a valid options section, validate=False.
"""
before = Config()
- before.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "backup", "/usr/bin/scp -1 -B")
+ before.options = OptionsConfig("tuesday", "/opt/backup/tmp", "backup", "backup", "/usr/bin/scp -1 -B", [], [], "/usr/bin/ssh")
before.options.overrides = [ CommandOverride("mkisofs", "/usr/bin/mkisofs"), CommandOverride("svnlook", "/svnlook"), ]
+ before.options.hooks = [ PostActionHook("collect", "ls -l"), ]
beforeXml = before.extractXml(validate=False)
after = Config(xmlData=beforeXml, validate=False)
self.failUnlessEqual(before, after)
@@ -11168,7 +11258,18 @@
after = Config(xmlData=beforeXml, validate=True)
self.failUnlessEqual(before, after)
+ def testExtractXml_041(self):
+ """
+ Extract complete document containing all required and optional fields,
+ using a peers configuration section, validate=True.
+ """
+ path = self.resources["cback.conf.21"]
+ before = Config(xmlPath=path, validate=True)
+ beforeXml = before.extractXml(validate=True)
+ after = Config(xmlData=beforeXml, validate=True)
+ self.failUnlessEqual(before, after)
+
#######################################################################
# Suite definition
#######################################################################
Modified: cedar-backup2/trunk/test/data/cback.conf.15
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.15 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/test/data/cback.conf.15 2007-12-15 21:40:44 UTC (rev 809)
@@ -28,6 +28,7 @@
<backup_user>backup</backup_user>
<backup_group>group</backup_group>
<rcp_command>/usr/bin/scp -1 -B</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
<override>
<command>mkisofs</command>
<abs_path>/usr/bin/mkisofs</abs_path>
Modified: cedar-backup2/trunk/test/data/cback.conf.20
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.20 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/test/data/cback.conf.20 2007-12-15 21:40:44 UTC (rev 809)
@@ -31,6 +31,7 @@
<backup_user>backup</backup_user>
<backup_group>group</backup_group>
<rcp_command>/usr/bin/scp -1 -B</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
<override>
<command>mkisofs</command>
<abs_path>/usr/bin/mkisofs</abs_path>
Modified: cedar-backup2/trunk/test/data/cback.conf.21
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.21 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/test/data/cback.conf.21 2007-12-15 21:40:44 UTC (rev 809)
@@ -31,6 +31,7 @@
<backup_user>backup</backup_user>
<backup_group>group</backup_group>
<rcp_command>/usr/bin/scp -1 -B</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
<override>
<command>mkisofs</command>
<abs_path>/usr/bin/mkisofs</abs_path>
Modified: cedar-backup2/trunk/test/data/cback.conf.6
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.6 2007-12-15 21:12:36 UTC (rev 808)
+++ cedar-backup2/trunk/test/data/cback.conf.6 2007-12-15 21:40:44 UTC (rev 809)
@@ -7,6 +7,7 @@
<backup_user>backup</backup_user>
<backup_group>group</backup_group>
<rcp_command>/usr/bin/scp -1 -B</rcp_command>
+ <rsh_command>/usr/bin/ssh</rsh_command>
<override>
<command>mkisofs</command>
<abs_path>/usr/bin/mkisofs</abs_path>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 21:12:42
|
Revision: 808
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=808&view=rev
Author: pronovic
Date: 2007-12-15 13:12:36 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Update manual to discuss new peers configuration
Modified Paths:
--------------
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/manual/src/config.xml
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2007-12-15 20:59:51 UTC (rev 807)
+++ cedar-backup2/trunk/Changelog 2007-12-15 21:12:36 UTC (rev 808)
@@ -5,6 +5,7 @@
- Add a new <peers> configuration section (PeersConfig)
- Change peers configuration in <stage> to just override <peers>
- Modify stage process to take peers list from peers section (if available)
+ - Updated user manual to discuss new peers configuration section
Version 2.14.0 19 Sep 2007
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2007-12-15 20:59:51 UTC (rev 807)
+++ cedar-backup2/trunk/manual/src/config.xml 2007-12-15 21:12:36 UTC (rev 808)
@@ -187,6 +187,13 @@
<backup_group>group</backup_group>
<rcp_command>/usr/bin/scp -B</rcp_command>
</options>
+ <peers>
+ <peer>
+ <name>debian</name>
+ <type>local</type>
+ <collect_dir>/opt/backup/collect</collect_dir>
+ </peer>
+ </peers>
<collect>
<collect_dir>/opt/backup/collect</collect_dir>
<collect_mode>daily</collect_mode>
@@ -203,11 +210,6 @@
</collect>
<stage>
<staging_dir>/opt/backup/staging</staging_dir>
- <peer>
- <name>debian</name>
- <type>local</type>
- <collect_dir>/opt/backup/collect</collect_dir>
- </peer>
</stage>
<store>
<source_dir>/opt/backup/staging</source_dir>
@@ -408,7 +410,7 @@
</para>
<para>
This value is also used as the default remote backup user
- for remote peers in the staging section.
+ for remote peers.
</para>
<para>
<emphasis>Restrictions:</emphasis> Must be non-empty
@@ -447,9 +449,8 @@
</para>
<para>
This value is used as the default value for all remote
- peers in the staging section. Technically, this value is
- not needed by clients, but we require it for all config
- files anyway.
+ peers. Technically, this value is not needed by clients,
+ but we require it for all config files anyway.
</para>
<para>
<emphasis>Restrictions:</emphasis> Must be non-empty
@@ -672,6 +673,236 @@
<!-- ################################################################# -->
+ <sect2 id="cedar-config-configfile-peers">
+
+ <title>Peers Configuration</title>
+
+ <para>
+ The peers configuration section contains a list of the peers
+ managed by a master. This section is only required on a master.
+ </para>
+
+ <para>
+ This is an example peers configuration section:
+ </para>
+
+ <programlisting>
+<peers>
+ <peer>
+ <name>machine1</name>
+ <type>local</type>
+ <collect_dir>/opt/backup/collect</collect_dir>
+ </peer>
+ <peer>
+ <name>machine2</name>
+ <type>remote</type>
+ <backup_user>backup</backup_user>
+ <collect_dir>/opt/backup/collect</collect_dir>
+ </peer>
+</peers>
+ </programlisting>
+
+ <para>
+ The following elements are part of the peers configuration section:
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><literal>peer</literal> (local version)</term>
+ <listitem>
+ <para>Local client peer in a backup pool.</para>
+ <para>
+ This is a subsection which contains information about a
+ specific local client peer managed by a master.
+ </para>
+ <para>
+ This section can be repeated as many times as is
+ necessary. At least one remote or local peer must be
+ configured.
+ </para>
+ <para>
+ The local peer subsection must contain the following fields:
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><literal>name</literal></term>
+ <listitem>
+ <para>Name of the peer, typically a valid hostname.</para>
+ <para>
+ For local peers, this value is only used for
+ reference. However, it is good practice to list
+ the peer's hostname here, for consistency with
+ remote peers.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty,
+ and unique among all peers.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>type</literal></term>
+ <listitem>
+ <para>Type of this peer.</para>
+ <para>
+ This value identifies the type of the peer. For
+ a local peer, it must always be <literal>local</literal>.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be <literal>local</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>collect_dir</literal></term>
+ <listitem>
+ <para>Collect directory to stage from for this peer.</para>
+ <para>
+ The master will copy all files in this directory
+ into the appropriate staging directory. Since
+ this is a local peer, the directory is assumed to
+ be reachable via normal filesystem operations
+ (i.e. <command>cp</command>).
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be an absolute path.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>peer</literal> (remote version)</term>
+ <listitem>
+ <para>Remote client peer in a backup pool.</para>
+ <para>
+ This is a subsection which contains information about a
+ specific remote client peer managed by a master. A remote
+ peer is one which can be reached via an rsh-based network
+ call.
+ </para>
+ <para>
+ This section can be repeated as many times as is
+ necessary. At least one remote or local peer must be
+ configured.
+ </para>
+ <para>
+ The remote peer subsection must contain the following fields:
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term><literal>name</literal></term>
+ <listitem>
+ <para>Hostname of the peer.</para>
+ <para>
+ For remote peers, this must be a valid DNS
+ hostname or IP address which can be resolved
+ during an rsh-based network call.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty,
+ and unique among all peers.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>type</literal></term>
+ <listitem>
+ <para>Type of this peer.</para>
+ <para>
+ This value identifies the type of the peer. For
+ a remote peer, it must always be <literal>remote</literal>.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be <literal>remote</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>collect_dir</literal></term>
+ <listitem>
+ <para>Collect directory to stage from for this peer.</para>
+ <para>
+ The master will copy all files in this directory
+ into the appropriate staging directory. Since
+ this is a remote peer, the directory is assumed to
+ be reachable via rsh-based network operations
+ (i.e. <command>scp</command> or the configured
+ rcp command).
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be an absolute path.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>backup_user</literal></term>
+ <listitem>
+ <para>Name of backup user on the remote peer.</para>
+ <para>
+ This username will be used when copying files from
+ the remote peer via an rsh-based network connection.
+ </para>
+ <para>
+ This field is optional. if it doesn't exist, the
+ backup will use the default backup user from the
+ options section.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>rcp_command</literal></term>
+ <listitem>
+ <para>The rcp-compatible copy command for this peer.</para>
+ <para>
+ The rcp command should be the exact command used for
+ remote copies, including any required options. If you are
+ using <command>scp</command>, you should pass it the
+ <option>-B</option> option, so <command>scp</command> will
+ not ask for any user input (which could hang the backup).
+ A common example is something like <command>/usr/bin/scp
+ -B</command>.
+ </para>
+ <para>
+ This field is optional. if it doesn't exist, the
+ backup will use the default rcp command from the
+ options section.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be non-empty.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </sect2>
+
+ <!-- ################################################################# -->
+
<sect2 id="cedar-config-configfile-collect">
<title>Collect Configuration</title>
@@ -1311,18 +1542,37 @@
<para>
The stage configuration section contains configuration options
- related the the stage action. The section defines the set of peers
- in a backup pool, and then also indicates where data from those
- peers should be staged to.
+ related the the stage action. The section indicates where date
+ from peers can be staged to.
</para>
+
+ <para>
+ This section can also (optionally) override the list of peers so
+ that not all peers are staged. If you provide
+ <emphasis>any</emphasis> peers in this section, then the list of
+ peers here completely replaces the list of peers in the peers
+ configuration section for the purposes of staging.
+ </para>
<para>
- This is an example stage configuration section:
+ This is an example stage configuration section for the simple case
+ where the list of peers is taken from peers configuration:
</para>
<programlisting>
<stage>
<staging_dir>/opt/backup/stage</staging_dir>
+</stage>
+ </programlisting>
+
+ <para>
+ This is an example stage configuration section that overrides the
+ default list of peers:
+ </para>
+
+ <programlisting>
+<stage>
+ <staging_dir>/opt/backup/stage</staging_dir>
<peer>
<name>machine1</name>
<type>local</type>
@@ -1387,6 +1637,12 @@
configured.
</para>
<para>
+ <emphasis>Remember</emphasis>, if you provide
+ <emphasis>any</emphasis> local or remote peer in staging
+ configuration, the global peer configuration is completely
+ replaced by the staging peer configuration.
+ </para>
+ <para>
The local peer subsection must contain the following fields:
</para>
@@ -1461,6 +1717,12 @@
configured.
</para>
<para>
+ <emphasis>Remember</emphasis>, if you provide
+ <emphasis>any</emphasis> local or remote peer in staging
+ configuration, the global peer configuration is completely
+ replaced by the staging peer configuration.
+ </para>
+ <para>
The remote peer subsection must contain the following fields:
</para>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 20:59:53
|
Revision: 807
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=807&view=rev
Author: pronovic
Date: 2007-12-15 12:59:51 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Fix typo in _getRemotePeers()
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/stage.py
Modified: cedar-backup2/trunk/CedarBackup2/actions/stage.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/stage.py 2007-12-15 20:54:37 UTC (rev 806)
+++ cedar-backup2/trunk/CedarBackup2/actions/stage.py 2007-12-15 20:59:51 UTC (rev 807)
@@ -246,7 +246,7 @@
logger.debug("Using list of remote peers from peers configuration.")
configPeers = config.peers.remotePeers
if configPeers is not None:
- for peer in config.peers.remotePeers:
+ for peer in configPeers:
remoteUser = _getRemoteUser(config, peer)
rcpCommand = _getRcpCommand(config, peer)
remotePeer = RemotePeer(peer.name, peer.collectDir, config.options.workingDir,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 20:54:47
|
Revision: 806
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=806&view=rev
Author: pronovic
Date: 2007-12-15 12:54:37 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Use /usr/bin/python as interpreter
Modified Paths:
--------------
cedar-backup2/trunk/cback
Modified: cedar-backup2/trunk/cback
===================================================================
--- cedar-backup2/trunk/cback 2007-12-15 20:52:14 UTC (rev 805)
+++ cedar-backup2/trunk/cback 2007-12-15 20:54:37 UTC (rev 806)
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.3
+#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# vim: set ft=python ts=3 sw=3 expandtab:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 20:52:15
|
Revision: 805
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=805&view=rev
Author: pronovic
Date: 2007-12-15 12:52:14 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
First pass at implementing managed peers
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/stage.py
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/configtests.py
Added Paths:
-----------
cedar-backup2/trunk/test/data/cback.conf.21
cedar-backup2/trunk/test/data/cback.conf.22
cedar-backup2/trunk/test/data/cback.conf.23
Modified: cedar-backup2/trunk/CedarBackup2/actions/stage.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/stage.py 2007-12-15 19:20:09 UTC (rev 804)
+++ cedar-backup2/trunk/CedarBackup2/actions/stage.py 2007-12-15 20:52:14 UTC (rev 805)
@@ -212,8 +212,15 @@
@return: List of L{LocalPeer} objects.
"""
localPeers = []
- if config.stage.localPeers is not None:
- for peer in config.stage.localPeers:
+ configPeers = None
+ if config.stage.hasPeers():
+ logger.debug("Using list of local peers from stage configuration.")
+ configPeers = config.stage.localPeers
+ elif config.peers is not None and config.peers.hasPeers():
+ logger.debug("Using list of local peers from peers configuration.")
+ configPeers = config.peers.localPeers
+ if configPeers is not None:
+ for peer in configPeers:
localPeer = LocalPeer(peer.name, peer.collectDir)
localPeers.append(localPeer)
logger.debug("Found local peer: [%s]" % localPeer.name)
@@ -231,8 +238,15 @@
@return: List of L{RemotePeer} objects.
"""
remotePeers = []
- if config.stage.remotePeers is not None:
- for peer in config.stage.remotePeers:
+ configPeers = None
+ if config.stage.hasPeers():
+ logger.debug("Using list of remote peers from stage configuration.")
+ configPeers = config.stage.remotePeers
+ elif config.peers is not None and config.peers.hasPeers():
+ logger.debug("Using list of remote peers from peers configuration.")
+ configPeers = config.peers.remotePeers
+ if configPeers is not None:
+ for peer in config.peers.remotePeers:
remoteUser = _getRemoteUser(config, peer)
rcpCommand = _getRcpCommand(config, peer)
remotePeer = RemotePeer(peer.name, peer.collectDir, config.options.workingDir,
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 19:20:09 UTC (rev 804)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 20:52:14 UTC (rev 805)
@@ -65,8 +65,8 @@
The configuration file format has changed between Cedar Backup 1.x and Cedar
Backup 2.x. Any Cedar Backup 1.x configuration file is also a valid Cedar
Backup 2.x configuration file. However, it doesn't work to go the other
- direction, as the 2.x configuration files may contain additional fields that
- are not accepted by older versions of the software.
+ direction, as the 2.x configuration files contains additional configuration
+ is not accepted by older versions of the software.
XML Configuration Structure
===========================
@@ -81,6 +81,7 @@
- I{reference}: specifies reference information about the file (author, revision, etc)
- I{extensions}: specifies mappings to Cedar Backup extensions (external code)
- I{options}: specifies global configuration options
+ - I{peers}: specifies the set of peers in a master's backup pool
- I{collect}: specifies configuration related to the collect action
- I{stage}: specifies configuration related to the stage action
- I{store}: specifies configuration related to the store action
@@ -162,6 +163,14 @@
for all remote peers in the staging section. Remote peers can also rely on
the backup user as the default remote user name if they choose.
+ I{Peers Validations}
+
+ Local peers must be completely filled in, including both name and collect
+ directory. Remote peers must also fill in the name and collect directory,
+ but can leave the remote user and rcp command unset. In this case, the
+ remote user is assumed to match the backup user from the options section and
+ rcp command is taken directly from the options section.
+
I{Collect Validations}
The target directory must be filled in. The collect mode, archive mode and
@@ -183,11 +192,9 @@
(remote or local) between the two lists of peers. A list with no entries
can be either C{None} or an empty list C{[]} if desired.
- Local peers must be completely filled in, including both name and collect
- directory. Remote peers must also fill in the name and collect directory,
- but can leave the remote user and rcp command unset. In this case, the
- remote user is assumed to match the backup user from the options section and
- rcp command is taken directly from the options section.
+ If a set of peers is provided, this configuration completely overrides
+ configuration in the peers configuration section, and the same validations
+ apply.
I{Store Validations}
@@ -207,7 +214,7 @@
@sort: ActionDependencies, ActionHook, PreActionHook, PostActionHook,
ExtendedAction, CommandOverride, CollectFile, CollectDir, PurgeDir, LocalPeer,
- RemotePeer, ReferenceConfig, ExtensionsConfig, OptionsConfig,
+ RemotePeer, ReferenceConfig, ExtensionsConfig, OptionsConfig, PeersConfig,
CollectConfig, StageConfig, StoreConfig, PurgeConfig, Config,
DEFAULT_DEVICE_TYPE, DEFAULT_MEDIA_TYPE,
VALID_DEVICE_TYPES, VALID_MEDIA_TYPES,
@@ -2372,6 +2379,141 @@
########################################################################
+# PeersConfig class definition
+########################################################################
+
+class PeersConfig(object):
+
+ """
+ Class representing Cedar Backup global peer configuration.
+
+ This section contains a list of local and remote peers in a master's backup
+ pool. The section is optional. If a master does not define this section,
+ then all peers are unmanaged, and the stage configuration section must
+ explicitly list any peer that is to be staged. If this section is
+ configured, then peers may be managed or unmanaged, and the stage section
+ peer configuration (if any) completely overrides this configuration.
+
+ As with all of the other classes that represent configuration sections, all
+ of these values are optional. It is up to some higher-level construct to
+ decide whether everything they need is filled in.
+
+ The following restrictions exist on data in this class:
+
+ - The list of local peers must contain only C{LocalPeer} objects
+ - The list of remote peers must contain only C{RemotePeer} objects
+
+ @note: Lists within this class are "unordered" for equality comparisons.
+
+ @sort: __init__, __repr__, __str__, __cmp__, localPeers, remotePeers
+ """
+
+ def __init__(self, localPeers=None, remotePeers=None):
+ """
+ Constructor for the C{PeersConfig} class.
+
+ @param localPeers: List of local peers.
+ @param remotePeers: List of remote peers.
+
+ @raise ValueError: If one of the values is invalid.
+ """
+ self._localPeers = None
+ self._remotePeers = None
+ self.localPeers = localPeers
+ self.remotePeers = remotePeers
+
+ def __repr__(self):
+ """
+ Official string representation for class instance.
+ """
+ return "PeersConfig(%s, %s)" % (self.localPeers, self.remotePeers)
+
+ def __str__(self):
+ """
+ Informal string representation for class instance.
+ """
+ return self.__repr__()
+
+ def __cmp__(self, other):
+ """
+ Definition of equals operator for this class.
+ Lists within this class are "unordered" for equality comparisons.
+ @param other: Other object to compare to.
+ @return: -1/0/1 depending on whether self is C{<}, C{=} or C{>} other.
+ """
+ if other is None:
+ return 1
+ if self._localPeers != other._localPeers:
+ if self._localPeers < other._localPeers:
+ return -1
+ else:
+ return 1
+ if self._remotePeers != other._remotePeers:
+ if self._remotePeers < other._remotePeers:
+ return -1
+ else:
+ return 1
+ return 0
+
+ def hasPeers(self):
+ """
+ Indicates whether any peers are filled into this object.
+ @return: Boolean true if any local or remote peers are filled in, false otherwise.
+ """
+ return ((self.localPeers is not None and len(self.localPeers) > 0) or
+ (self.remotePeers is not None and len(self.remotePeers) > 0))
+
+ def _setLocalPeers(self, value):
+ """
+ Property target used to set the local peers list.
+ Either the value must be C{None} or each element must be a C{LocalPeer}.
+ @raise ValueError: If the value is not an absolute path.
+ """
+ if value is None:
+ self._localPeers = None
+ else:
+ try:
+ saved = self._localPeers
+ self._localPeers = ObjectTypeList(LocalPeer, "LocalPeer")
+ self._localPeers.extend(value)
+ except Exception, e:
+ self._localPeers = saved
+ raise e
+
+ def _getLocalPeers(self):
+ """
+ Property target used to get the local peers list.
+ """
+ return self._localPeers
+
+ def _setRemotePeers(self, value):
+ """
+ Property target used to set the remote peers list.
+ Either the value must be C{None} or each element must be a C{RemotePeer}.
+ @raise ValueError: If the value is not a C{RemotePeer}
+ """
+ if value is None:
+ self._remotePeers = None
+ else:
+ try:
+ saved = self._remotePeers
+ self._remotePeers = ObjectTypeList(RemotePeer, "RemotePeer")
+ self._remotePeers.extend(value)
+ except Exception, e:
+ self._remotePeers = saved
+ raise e
+
+ def _getRemotePeers(self):
+ """
+ Property target used to get the remote peers list.
+ """
+ return self._remotePeers
+
+ localPeers = property(_getLocalPeers, _setLocalPeers, None, "List of local peers.")
+ remotePeers = property(_getRemotePeers, _setRemotePeers, None, "List of remote peers.")
+
+
+########################################################################
# CollectConfig class definition
########################################################################
@@ -2763,6 +2905,14 @@
return 1
return 0
+ def hasPeers(self):
+ """
+ Indicates whether any peers are filled into this object.
+ @return: Boolean true if any local or remote peers are filled in, false otherwise.
+ """
+ return ((self.localPeers is not None and len(self.localPeers) > 0) or
+ (self.remotePeers is not None and len(self.remotePeers) > 0))
+
def _setTargetDir(self, value):
"""
Property target used to set the target directory.
@@ -3324,8 +3474,9 @@
@sort: __init__, __repr__, __str__, __cmp__, extractXml, validate,
reference, extensions, options, collect, stage, store, purge,
_getReference, _setReference, _getExtensions, _setExtensions,
- _getOptions, _setOptions, _getCollect, _setCollect, _getStage,
- _setStage, _getStore, _setStore, _getPurge, _setPurge
+ _getOptions, _setOptions, _getPeers, _setPeers, _getCollect,
+ _setCollect, _getStage, _setStage, _getStore, _setStore,
+ _getPurge, _setPurge
"""
##############
@@ -3370,6 +3521,7 @@
self._reference = None
self._extensions = None
self._options = None
+ self._peers = None
self._collect = None
self._stage = None
self._store = None
@@ -3377,6 +3529,7 @@
self.reference = None
self.extensions = None
self.options = None
+ self.peers = None
self.collect = None
self.stage = None
self.store = None
@@ -3402,8 +3555,9 @@
"""
Official string representation for class instance.
"""
- return "Config(%s, %s, %s, %s, %s, %s, %s)" % (self.reference, self.extensions, self.options,
- self.collect, self.stage, self.store, self.purge)
+ return "Config(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.reference, self.extensions, self.options,
+ self.peers, self.collect, self.stage, self.store,
+ self.purge)
def __str__(self):
"""
@@ -3440,6 +3594,11 @@
return -1
else:
return 1
+ if self._peers != other._peers:
+ if self._peers < other._peers:
+ return -1
+ else:
+ return 1
if self._collect != other._collect:
if self._collect < other._collect:
return -1
@@ -3524,6 +3683,25 @@
"""
return self._options
+ def _setPeers(self, value):
+ """
+ Property target used to set the peers configuration value.
+ If not C{None}, the value must be an C{PeersConfig} object.
+ @raise ValueError: If the value is not a C{PeersConfig}
+ """
+ if value is None:
+ self._peers = None
+ else:
+ if not isinstance(value, PeersConfig):
+ raise ValueError("Value must be a C{PeersConfig} object.")
+ self._peers = value
+
+ def _getPeers(self):
+ """
+ Property target used to get the peers configuration value.
+ """
+ return self._peers
+
def _setCollect(self, value):
"""
Property target used to set the collect configuration value.
@@ -3603,6 +3781,7 @@
reference = property(_getReference, _setReference, None, "Reference configuration in terms of a C{ReferenceConfig} object.")
extensions = property(_getExtensions, _setExtensions, None, "Extensions configuration in terms of a C{ExtensionsConfig} object.")
options = property(_getOptions, _setOptions, None, "Options configuration in terms of a C{OptionsConfig} object.")
+ peers = property(_getPeers, _setPeers, None, "Peers configuration in terms of a C{PeersConfig} object.")
collect = property(_getCollect, _setCollect, None, "Collect configuration in terms of a C{CollectConfig} object.")
stage = property(_getStage, _setStage, None, "Stage configuration in terms of a C{StageConfig} object.")
store = property(_getStore, _setStore, None, "Store configuration in terms of a C{StoreConfig} object.")
@@ -3652,7 +3831,7 @@
return xmlData
def validate(self, requireOneAction=True, requireReference=False, requireExtensions=False, requireOptions=True,
- requireCollect=False, requireStage=False, requireStore=False, requirePurge=False):
+ requireCollect=False, requireStage=False, requireStore=False, requirePurge=False, requirePeers=False):
"""
Validates configuration represented by the object.
@@ -3666,6 +3845,7 @@
@param requireReference: Require the reference section.
@param requireExtensions: Require the extensions section.
@param requireOptions: Require the options section.
+ @param requirePeers: Require the peers section.
@param requireCollect: Require the collect section.
@param requireStage: Require the stage section.
@param requireStore: Require the store section.
@@ -3681,6 +3861,8 @@
raise ValueError("The extensions is section is required.")
if requireOptions and self.options is None:
raise ValueError("The options is section is required.")
+ if requirePeers and self.peers is None:
+ raise ValueError("The peers is section is required.")
if requireCollect and self.collect is None:
raise ValueError("The collect is section is required.")
if requireStage and self.stage is None:
@@ -3719,6 +3901,7 @@
self._reference = Config._parseReference(parentNode)
self._extensions = Config._parseExtensions(parentNode)
self._options = Config._parseOptions(parentNode)
+ self._peers = Config._parsePeers(parentNode)
self._collect = Config._parseCollect(parentNode)
self._stage = Config._parseStage(parentNode)
self._store = Config._parseStore(parentNode)
@@ -3821,6 +4004,31 @@
return options
_parseOptions = staticmethod(_parseOptions)
+ def _parsePeers(parentNode):
+ """
+ Parses a peers configuration section.
+
+ We read groups of the following items, one list element per
+ item::
+
+ localPeers //cb_config/stage/peer
+ remotePeers //cb_config/stage/peer
+
+ The individual peer entries are parsed by L{_parsePeerList}.
+
+ @param parentNode: Parent node to search beneath.
+
+ @return: C{StageConfig} object or C{None} if the section does not exist.
+ @raise ValueError: If some filled-in value is invalid.
+ """
+ peers = None
+ sectionNode = readFirstChild(parentNode, "peers")
+ if sectionNode is not None:
+ peers = PeersConfig()
+ (peers.localPeers, peers.remotePeers) = Config._parsePeerList(sectionNode)
+ return peers
+ _parsePeers = staticmethod(_parsePeers)
+
def _parseCollect(parentNode):
"""
Parses a collect configuration section.
@@ -3877,7 +4085,7 @@
localPeers //cb_config/stage/peer
remotePeers //cb_config/stage/peer
- The individual peer entries are parsed by L{_parsePeers}.
+ The individual peer entries are parsed by L{_parsePeerList}.
@param parentNode: Parent node to search beneath.
@@ -3889,7 +4097,7 @@
if sectionNode is not None:
stage = StageConfig()
stage.targetDir = readString(sectionNode, "staging_dir")
- (stage.localPeers, stage.remotePeers) = Config._parsePeers(sectionNode)
+ (stage.localPeers, stage.remotePeers) = Config._parsePeerList(sectionNode)
return stage
_parseStage = staticmethod(_parseStage)
@@ -4191,7 +4399,7 @@
return lst
_parsePurgeDirs = staticmethod(_parsePurgeDirs)
- def _parsePeers(parentNode):
+ def _parsePeerList(parentNode):
"""
Reads remote and local peer data from immediately beneath the parent.
@@ -4241,7 +4449,7 @@
if remotePeers == []:
remotePeers = None
return (localPeers, remotePeers)
- _parsePeers = staticmethod(_parsePeers)
+ _parsePeerList = staticmethod(_parsePeerList)
def _parseDependencies(parentNode):
"""
@@ -4344,6 +4552,7 @@
Config._addReference(xmlDom, parentNode, self.reference)
Config._addExtensions(xmlDom, parentNode, self.extensions)
Config._addOptions(xmlDom, parentNode, self.options)
+ Config._addPeers(xmlDom, parentNode, self.peers)
Config._addCollect(xmlDom, parentNode, self.collect)
Config._addStage(xmlDom, parentNode, self.stage)
Config._addStore(xmlDom, parentNode, self.store)
@@ -4448,6 +4657,35 @@
Config._addHook(xmlDom, sectionNode, hook)
_addOptions = staticmethod(_addOptions)
+ def _addPeers(xmlDom, parentNode, peersConfig):
+ """
+ Adds a <peers> configuration section as the next child of a parent.
+
+ We add groups of the following items, one list element per
+ item::
+
+ localPeers //cb_config/peers/peer
+ remotePeers //cb_config/peers/peer
+
+ The individual local and remote peer entries are added by
+ L{_addLocalPeer} and L{_addRemotePeer}, respectively.
+
+ If C{peersConfig} is C{None}, then no container will be added.
+
+ @param xmlDom: DOM tree as from L{createOutputDom}.
+ @param parentNode: Parent that the section should be appended to.
+ @param peersConfig: Peers configuration section to be added to the document.
+ """
+ if peersConfig is not None:
+ sectionNode = addContainerNode(xmlDom, parentNode, "peers")
+ if peersConfig.localPeers is not None:
+ for localPeer in peersConfig.localPeers:
+ Config._addLocalPeer(xmlDom, sectionNode, localPeer)
+ if peersConfig.remotePeers is not None:
+ for remotePeer in peersConfig.remotePeers:
+ Config._addRemotePeer(xmlDom, sectionNode, remotePeer)
+ _addPeers = staticmethod(_addPeers)
+
def _addCollect(xmlDom, parentNode, collectConfig):
"""
Adds a <collect> configuration section as the next child of a parent.
@@ -4943,6 +5181,7 @@
self._validateReference()
self._validateExtensions()
self._validateOptions()
+ self._validatePeers()
self._validateCollect()
self._validateStage()
self._validateStore()
@@ -5010,6 +5249,14 @@
if self.options.rcpCommand is None:
raise ValueError("Options section remote copy command must be filled in.")
+ def _validatePeers(self):
+ """
+ Validates peers configuration per rules in L{_validatePeerList}.
+ @raise ValueError: If peers configuration is invalid.
+ """
+ if self.peers is not None:
+ self._validatePeerList(self.peers.localPeers, self.peers.remotePeers)
+
def _validateCollect(self):
"""
Validates collect configuration.
@@ -5056,18 +5303,27 @@
"""
Validates stage configuration.
- The target directory must be filled in. There must be at least one peer
- (remote or local) between the two lists of peers. A list with no entries
- can be either C{None} or an empty list C{[]} if desired.
+ The target directory must be filled in, and the peers are
+ also validated.
- Then, peer list validation (see L{_validatePeerList}) applies as well.
+ Peers are only required in this section if the peers configuration
+ section is not filled in. However, if any peers are filled in
+ here, they override the peers configuration and must meet the
+ validation criteria in L{_validatePeerList}.
@raise ValueError: If stage configuration is invalid.
"""
if self.stage is not None:
if self.stage.targetDir is None:
raise ValueError("Stage section target directory must be filled in.")
- self._validatePeerList(self.stage.localPeers, self.stage.remotePeers)
+ if self.peers is None:
+ # In this case, stage configuration is our only configuration and must be valid.
+ self._validatePeerList(self.stage.localPeers, self.stage.remotePeers)
+ else:
+ # In this case, peers configuration is the default and stage configuration overrides.
+ # Validation is only needed if it's stage configuration is actually filled in.
+ if self.stage.hasPeers():
+ self._validatePeerList(self.stage.localPeers, self.stage.remotePeers)
def _validateStore(self):
"""
@@ -5148,10 +5404,10 @@
raise ValueError("Peer list must contain at least one backup peer.")
elif localPeers is not None and remotePeers is None:
if len(localPeers) < 1:
- raise ValueError("Peerl list must contain at least one backup peer.")
+ raise ValueError("Peer list must contain at least one backup peer.")
elif localPeers is not None and remotePeers is not None:
if len(localPeers) + len(remotePeers) < 1:
- raise ValueError("Peerl list must contain at least one backup peer.")
+ raise ValueError("Peer list must contain at least one backup peer.")
names = []
if localPeers is not None:
for localPeer in localPeers:
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2007-12-15 19:20:09 UTC (rev 804)
+++ cedar-backup2/trunk/Changelog 2007-12-15 20:52:14 UTC (rev 805)
@@ -1,6 +1,10 @@
-Version 2.14.1 unreleased
+Version 2.15.0 unreleased
* Minor documentation tweaks discovered during 3.0 development.
+ * Add support for managed peers, where the mater kicks off remote actions.
+ - Add a new <peers> configuration section (PeersConfig)
+ - Change peers configuration in <stage> to just override <peers>
+ - Modify stage process to take peers list from peers section (if available)
Version 2.14.0 19 Sep 2007
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2007-12-15 19:20:09 UTC (rev 804)
+++ cedar-backup2/trunk/test/configtests.py 2007-12-15 20:52:14 UTC (rev 805)
@@ -105,7 +105,7 @@
from CedarBackup2.config import ActionHook, PreActionHook, PostActionHook, CommandOverride
from CedarBackup2.config import ExtendedAction, ActionDependencies, BlankBehavior
from CedarBackup2.config import CollectFile, CollectDir, PurgeDir, LocalPeer, RemotePeer
-from CedarBackup2.config import ReferenceConfig, ExtensionsConfig, OptionsConfig
+from CedarBackup2.config import ReferenceConfig, ExtensionsConfig, OptionsConfig, PeersConfig
from CedarBackup2.config import CollectConfig, StageConfig, StoreConfig, PurgeConfig, Config
@@ -118,7 +118,8 @@
"cback.conf.5", "cback.conf.6", "cback.conf.7", "cback.conf.8",
"cback.conf.9", "cback.conf.10", "cback.conf.11", "cback.conf.12",
"cback.conf.13", "cback.conf.14", "cback.conf.15", "cback.conf.16",
- "cback.conf.17", "cback.conf.18", "cback.conf.19", "cback.conf.20", ]
+ "cback.conf.17", "cback.conf.18", "cback.conf.19", "cback.conf.20",
+ "cback.conf.21", "cback.conf.22", "cback.conf.23", ]
#######################################################################
@@ -4956,6 +4957,366 @@
self.failUnless(options1 != options2)
+########################
+# TestPeersConfig class
+########################
+
+class TestPeersConfig(unittest.TestCase):
+
+ """Tests for the PeersConfig class."""
+
+ ##################
+ # Utility methods
+ ##################
+
+ def failUnlessAssignRaises(self, exception, object, property, value):
+ """Equivalent of L{failUnlessRaises}, but used for property assignments instead."""
+ failUnlessAssignRaises(self, exception, object, property, value)
+
+
+ ############################
+ # Test __repr__ and __str__
+ ############################
+
+ def testStringFuncs_001(self):
+ """
+ Just make sure that the string functions don't have errors (i.e. bad variable names).
+ """
+ obj = PeersConfig()
+ obj.__repr__()
+ obj.__str__()
+
+
+ ##################################
+ # Test constructor and attributes
+ ##################################
+
+ def testConstructor_001(self):
+ """
+ Test constructor with no values filled in.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ self.failUnlessEqual(None, peers.remotePeers)
+
+ def testConstructor_002(self):
+ """
+ Test constructor with all values filled in, with valid values (empty lists).
+ """
+ peers = PeersConfig([], [])
+ self.failUnlessEqual([], peers.localPeers)
+ self.failUnlessEqual([], peers.remotePeers)
+
+ def testConstructor_003(self):
+ """
+ Test constructor with all values filled in, with valid values (non-empty lists).
+ """
+ peers = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failUnlessEqual([LocalPeer(), ], peers.localPeers)
+ self.failUnlessEqual([RemotePeer(), ], peers.remotePeers)
+
+ def testConstructor_004(self):
+ """
+ Test assignment of localPeers attribute, None value.
+ """
+ peers = PeersConfig(localPeers=[])
+ self.failUnlessEqual([], peers.localPeers)
+ peers.localPeers = None
+ self.failUnlessEqual(None, peers.localPeers)
+
+ def testConstructor_005(self):
+ """
+ Test assignment of localPeers attribute, empty list.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ peers.localPeers = []
+ self.failUnlessEqual([], peers.localPeers)
+
+ def testConstructor_006(self):
+ """
+ Test assignment of localPeers attribute, single valid entry.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ peers.localPeers = [LocalPeer(), ]
+ self.failUnlessEqual([LocalPeer(), ], peers.localPeers)
+
+ def testConstructor_007(self):
+ """
+ Test assignment of localPeers attribute, multiple valid
+ entries.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ peers.localPeers = [LocalPeer(name="one"), LocalPeer(name="two"), ]
+ self.failUnlessEqual([LocalPeer(name="one"), LocalPeer(name="two"), ], peers.localPeers)
+
+ def testConstructor_008(self):
+ """
+ Test assignment of localPeers attribute, single invalid entry
+ (None).
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ self.failUnlessAssignRaises(ValueError, peers, "localPeers", [None, ])
+ self.failUnlessEqual(None, peers.localPeers)
+
+ def testConstructor_009(self):
+ """
+ Test assignment of localPeers attribute, single invalid entry
+ (not a LocalPeer).
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ self.failUnlessAssignRaises(ValueError, peers, "localPeers", [RemotePeer(), ])
+ self.failUnlessEqual(None, peers.localPeers)
+
+ def testConstructor_010(self):
+ """
+ Test assignment of localPeers attribute, mixed valid and
+ invalid entries.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.localPeers)
+ self.failUnlessAssignRaises(ValueError, peers, "localPeers", [LocalPeer(), RemotePeer(), ])
+ self.failUnlessEqual(None, peers.localPeers)
+
+ def testConstructor_011(self):
+ """
+ Test assignment of remotePeers attribute, None value.
+ """
+ peers = PeersConfig(remotePeers=[])
+ self.failUnlessEqual([], peers.remotePeers)
+ peers.remotePeers = None
+ self.failUnlessEqual(None, peers.remotePeers)
+
+ def testConstructor_012(self):
+ """
+ Test assignment of remotePeers attribute, empty list.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ peers.remotePeers = []
+ self.failUnlessEqual([], peers.remotePeers)
+
+ def testConstructor_013(self):
+ """
+ Test assignment of remotePeers attribute, single valid entry.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ peers.remotePeers = [RemotePeer(name="one"), ]
+ self.failUnlessEqual([RemotePeer(name="one"), ], peers.remotePeers)
+
+ def testConstructor_014(self):
+ """
+ Test assignment of remotePeers attribute, multiple valid
+ entries.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ peers.remotePeers = [RemotePeer(name="one"), RemotePeer(name="two"), ]
+ self.failUnlessEqual([RemotePeer(name="one"), RemotePeer(name="two"), ], peers.remotePeers)
+
+ def testConstructor_015(self):
+ """
+ Test assignment of remotePeers attribute, single invalid entry
+ (None).
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ self.failUnlessAssignRaises(ValueError, peers, "remotePeers", [None, ])
+ self.failUnlessEqual(None, peers.remotePeers)
+
+ def testConstructor_016(self):
+ """
+ Test assignment of remotePeers attribute, single invalid entry
+ (not a RemotePeer).
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ self.failUnlessAssignRaises(ValueError, peers, "remotePeers", [LocalPeer(), ])
+ self.failUnlessEqual(None, peers.remotePeers)
+
+ def testConstructor_017(self):
+ """
+ Test assignment of remotePeers attribute, mixed valid and
+ invalid entries.
+ """
+ peers = PeersConfig()
+ self.failUnlessEqual(None, peers.remotePeers)
+ self.failUnlessAssignRaises(ValueError, peers, "remotePeers", [LocalPeer(), RemotePeer(), ])
+ self.failUnlessEqual(None, peers.remotePeers)
+
+
+ ############################
+ # Test comparison operators
+ ############################
+
+ def testComparison_001(self):
+ """
+ Test comparison of two identical objects, all attributes None.
+ """
+ peers1 = PeersConfig()
+ peers2 = PeersConfig()
+ self.failUnlessEqual(peers1, peers2)
+ self.failUnless(peers1 == peers2)
+ self.failUnless(not peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(peers1 >= peers2)
+ self.failUnless(not peers1 != peers2)
+
+ def testComparison_002(self):
+ """
+ Test comparison of two identical objects, all attributes non-None (empty lists).
+ """
+ peers1 = PeersConfig([], [])
+ peers2 = PeersConfig([], [])
+ self.failUnlessEqual(peers1, peers2)
+ self.failUnless(peers1 == peers2)
+ self.failUnless(not peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(peers1 >= peers2)
+ self.failUnless(not peers1 != peers2)
+
+ def testComparison_003(self):
+ """
+ Test comparison of two identical objects, all attributes non-None (non-empty lists).
+ """
+ peers1 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failUnlessEqual(peers1, peers2)
+ self.failUnless(peers1 == peers2)
+ self.failUnless(not peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(peers1 >= peers2)
+ self.failUnless(not peers1 != peers2)
+
+ def testComparison_004(self):
+ """
+ Test comparison of two differing objects, localPeers differs (one None,
+ one empty).
+ """
+ peers1 = PeersConfig(None, [RemotePeer(), ])
+ peers2 = PeersConfig([], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_005(self):
+ """
+ Test comparison of two differing objects, localPeers differs (one None,
+ one not empty).
+ """
+ peers1 = PeersConfig(None, [RemotePeer(), ])
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_006(self):
+ """
+ Test comparison of two differing objects, localPeers differs (one empty,
+ one not empty).
+ """
+ peers1 = PeersConfig([], [RemotePeer(), ])
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_007(self):
+ """
+ Test comparison of two differing objects, localPeers differs (both not
+ empty).
+ """
+ peers1 = PeersConfig([LocalPeer(name="one"), ], [RemotePeer(), ])
+ peers2 = PeersConfig([LocalPeer(name="two"), ], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_008(self):
+ """
+ Test comparison of two differing objects, remotePeers differs (one None,
+ one empty).
+ """
+ peers1 = PeersConfig([LocalPeer(), ], None)
+ peers2 = PeersConfig([LocalPeer(), ], [])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_009(self):
+ """
+ Test comparison of two differing objects, remotePeers differs (one None,
+ one not empty).
+ """
+ peers1 = PeersConfig([LocalPeer(), ], None)
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_010(self):
+ """
+ Test comparison of two differing objects, remotePeers differs (one empty,
+ one not empty).
+ """
+ peers1 = PeersConfig([LocalPeer(), ], [])
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(peers1 < peers2)
+ self.failUnless(peers1 <= peers2)
+ self.failUnless(not peers1 > peers2)
+ self.failUnless(not peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+ def testComparison_011(self):
+ """
+ Test comparison of two differing objects, remotePeers differs (both not
+ empty).
+ """
+ peers1 = PeersConfig([LocalPeer(), ], [RemotePeer(name="two"), ])
+ peers2 = PeersConfig([LocalPeer(), ], [RemotePeer(name="one"), ])
+ self.failIfEqual(peers1, peers2)
+ self.failUnless(not peers1 == peers2)
+ self.failUnless(not peers1 < peers2)
+ self.failUnless(not peers1 <= peers2)
+ self.failUnless(peers1 > peers2)
+ self.failUnless(peers1 >= peers2)
+ self.failUnless(peers1 != peers2)
+
+
##########################
# TestCollectConfig class
##########################
@@ -7535,6 +7896,7 @@
config1.reference = ReferenceConfig()
config1.extensions = ExtensionsConfig()
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7544,6 +7906,7 @@
config2.reference = ReferenceConfig()
config2.extensions = ExtensionsConfig()
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7579,6 +7942,7 @@
config1 = Config()
config1.reference = ReferenceConfig(author="one")
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7587,6 +7951,7 @@
config2 = Config()
config2.reference = ReferenceConfig(author="two")
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7623,6 +7988,7 @@
config1.reference = ReferenceConfig()
config1.extensions = ExtensionsConfig(None)
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7632,6 +7998,7 @@
config2.reference = ReferenceConfig()
config2.extensions = ExtensionsConfig([])
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7653,6 +8020,7 @@
config1.reference = ReferenceConfig()
config1.extensions = ExtensionsConfig([])
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7662,6 +8030,7 @@
config2.reference = ReferenceConfig()
config2.extensions = ExtensionsConfig([ExtendedAction("one", "two", "three"), ])
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7683,15 +8052,17 @@
config1.reference = ReferenceConfig()
config1.extensions = ExtensionsConfig([ExtendedAction("one", "two", "three"), ])
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
config1.purge = PurgeConfig()
config2 = Config()
- config1.reference = ReferenceConfig()
- config1.extensions = ExtensionsConfig([ExtendedAction("one", "two", "four"), ])
+ config2.reference = ReferenceConfig()
+ config2.extensions = ExtensionsConfig([ExtendedAction("one", "two", "four"), ])
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7727,6 +8098,7 @@
config1 = Config()
config1.reference = ReferenceConfig()
config1.options = OptionsConfig(startingDay="tuesday")
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7735,6 +8107,7 @@
config2 = Config()
config2.reference = ReferenceConfig()
config2.options = OptionsConfig(startingDay="monday")
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7770,6 +8143,7 @@
config1 = Config()
config1.reference = ReferenceConfig()
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig(collectMode="daily")
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7778,6 +8152,7 @@
config2 = Config()
config2.reference = ReferenceConfig()
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig(collectMode="incr")
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7813,6 +8188,7 @@
config1 = Config()
config1.reference = ReferenceConfig()
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig(targetDir="/something")
config1.store = StoreConfig()
@@ -7821,6 +8197,7 @@
config2 = Config()
config2.reference = ReferenceConfig()
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig(targetDir="/whatever")
config2.store = StoreConfig()
@@ -7856,6 +8233,7 @@
config1 = Config()
config1.reference = ReferenceConfig()
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig(deviceScsiId="ATA:0,0,0")
@@ -7864,6 +8242,7 @@
config2 = Config()
config2.reference = ReferenceConfig()
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig(deviceScsiId="0,0,0")
@@ -7899,6 +8278,7 @@
config1 = Config()
config1.reference = ReferenceConfig()
config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
config1.collect = CollectConfig()
config1.stage = StageConfig()
config1.store = StoreConfig()
@@ -7907,6 +8287,7 @@
config2 = Config()
config2.reference = ReferenceConfig()
config2.options = OptionsConfig()
+ config2.peers = PeersConfig()
config2.collect = CollectConfig()
config2.stage = StageConfig()
config2.store = StoreConfig()
@@ -7920,7 +8301,54 @@
self.failUnless(not config1 >= config2)
self.failUnless(config1 != config2)
+ def testComparison_019(self):
+ """
+ Test comparison of two differing objects, peers differs (one None).
+ """
+ config1 = Config()
+ config2 = Config()
+ config2.peers = PeersConfig()
+ self.failIfEqual(config1, config2)
+ self.failUnless(not config1 == config2)
+ self.failUnless(config1 < config2)
+ self.failUnless(config1 <= config2)
+ self.failUnless(not config1 > config2)
+ self.failUnless(not config1 >= config2)
+ self.failUnless(config1 != config2)
+ def testComparison_020(self):
+ """
+ Test comparison of two identical objects, peers differs.
+ """
+ config1 = Config()
+ config1.reference = ReferenceConfig()
+ config1.extensions = ExtensionsConfig()
+ config1.options = OptionsConfig()
+ config1.peers = PeersConfig()
+ config1.collect = CollectConfig()
+ config1.stage = StageConfig()
+ config1.store = StoreConfig()
+ config1.purge = PurgeConfig()
+
+ config2 = Config()
+ config2.reference = ReferenceConfig()
+ config2.extensions = ExtensionsConfig()
+ config2.options = OptionsConfig()
+ config2.peers = PeersConfig(localPeers=[LocalPeer(),])
+ config2.collect = CollectConfig()
+ config2.stage = StageConfig()
+ config2.store = StoreConfig()
+ config2.purge = PurgeConfig()
+
+ self.failIfEqual(config1, config2)
+ self.failUnless(not config1 == config2)
+ self.failUnless(config1 < config2)
+ self.failUnless(config1 <= config2)
+ self.failUnless(not config1 > config2)
+ self.failUnless(not config1 >= config2)
+ self.failUnless(config1 != config2)
+
+
#########################
# Test certain utilities
#########################
@@ -8897,7 +9325,7 @@
def testValidate_048(self):
"""
- Test that we catch a duplicate local peer name.
+ Test that we catch a duplicate local peer name in stage configuration.
"""
config = Config()
config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
@@ -8914,7 +9342,7 @@
def testValidate_049(self):
"""
- Test that we catch a duplicate remote peer name.
+ Test that we catch a duplicate remote peer name in stage configuration.
"""
config = Config()
config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
@@ -8931,7 +9359,8 @@
def testValidate_050(self):
"""
- Test that we catch a duplicate peer name duplicated between remote and local.
+ Test that we catch a duplicate peer name duplicated between remote and
+ local in stage configuration.
"""
config = Config()
config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
@@ -8946,7 +9375,321 @@
config.stage.remotePeers = [ RemotePeer(name="duplicate", collectDir="/some/path/to/data"), ]
self.failUnlessRaises(ValueError, config._validateStage)
+ def testValidate_051(self):
+ """
+ Test validate on a None peers section.
+ """
+ config = Config()
+ config.peers = None
+ config._validatePeers()
+ def testValidate_052(self):
+ """
+ Test validate on an empty peers section.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_053(self):
+ """
+ Test validate on peers section containing None for the lists.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = None
+ config.peers.remotePeers = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_054(self):
+ """
+ Test validate on peers section containing [] for the lists.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = []
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_055(self):
+ """
+ Test validate on peers section containing one local peer that is empty.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_056(self):
+ """
+ Test validate on peers section containing local peer with only a name.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(name="name"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_057(self):
+ """
+ Test validate on peers section containing one local peer with a name and
+ path, None for remote list.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(name="name", collectDir="/somewhere"), ]
+ config.peers.remotePeers = None
+ config._validatePeers()
+
+ def testValidate_058(self):
+ """
+ Test validate on peers section containing one local peer with a name and
+ path, [] for remote list.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(name="name", collectDir="/somewhere"), ]
+ config.peers.remotePeers = []
+ config._validatePeers()
+
+ def testValidate_059(self):
+ """
+ Test validate on peers section containing one remote peer that is empty.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.remotePeers = [RemotePeer(), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_060(self):
+ """
+ Test validate on peers section containing one remote peer with only a name.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.remotePeers = [RemotePeer(name="blech"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_061(self):
+ """
+ Test validate on peers section containing one remote peer with a name and
+ path, None for local list.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = None
+ config.peers.remotePeers = [RemotePeer(name="blech", collectDir="/some/path/to/data"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config._validatePeers()
+ config.options = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.peers.remotePeers[-1].remoteUser = "remote"
+ config.peers.remotePeers[-1].rcpCommand = "command"
+ config._validatePeers()
+
+ def testValidate_062(self):
+ """
+ Test validate on peers section containing one remote peer with a name and
+ path, [] for local list.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = []
+ config.peers.remotePeers = [RemotePeer(name="blech", collectDir="/some/path/to/data"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config._validatePeers()
+ config.options = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.peers.remotePeers[-1].remoteUser = "remote"
+ config.peers.remotePeers[-1].rcpCommand = "command"
+ config._validatePeers()
+
+ def testValidate_063(self):
+ """
+ Test validate on peers section containing one remote and one local peer.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(name="metoo", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [RemotePeer(name="blech", collectDir="/some/path/to/data"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config._validatePeers()
+ config.options = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.peers.remotePeers[-1].remoteUser = "remote"
+ config.peers.remotePeers[-1].rcpCommand = "command"
+ config._validatePeers()
+
+ def testValidate_064(self):
+ """
+ Test validate on peers section containing multiple remote and local peers.
+ """
+ config = Config()
+ config.peers = PeersConfig()
+ config.peers.localPeers = [LocalPeer(name="metoo", collectDir="/nowhere"), LocalPeer("one", "/two"), LocalPeer("a", "/b"), ]
+ config.peers.remotePeers = [RemotePeer(name="blech", collectDir="/some/path/to/data"), RemotePeer("c", "/d"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config._validatePeers()
+ config.options = None
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.peers.remotePeers[-1].remoteUser = "remote"
+ config.peers.remotePeers[-1].rcpCommand = "command"
+ self.failUnlessRaises(ValueError, config._validatePeers)
+ config.peers.remotePeers[0].remoteUser = "remote"
+ config.peers.remotePeers[0].rcpCommand = "command"
+ config._validatePeers()
+
+ def testValidate_065(self):
+ """
+ Test that we catch a duplicate local peer name in peers configuration.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"),
+ LocalPeer(name="unique2", collectDir="/nowhere"), ]
+ config._validatePeers()
+
+ config.peers.localPeers = [ LocalPeer(name="duplicate", collectDir="/nowhere"),
+ LocalPeer(name="duplicate", collectDir="/nowhere"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_066(self):
+ """
+ Test that we catch a duplicate remote peer name in peers configuration.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+
+ config.peers.remotePeers = [ RemotePeer(name="unique1", collectDir="/some/path/to/data"),
+ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+ config._validatePeers()
+
+ config.peers.remotePeers = [ RemotePeer(name="duplicate", collectDir="/some/path/to/data"),
+ RemotePeer(name="duplicate", collectDir="/some/path/to/data"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_067(self):
+ """
+ Test that we catch a duplicate peer name duplicated between remote and
+ local in peers configuration.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+ config._validatePeers()
+
+ config.peers.localPeers = [ LocalPeer(name="duplicate", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="duplicate", collectDir="/some/path/to/data"), ]
+ self.failUnlessRaises(ValueError, config._validatePeers)
+
+ def testValidate_068(self):
+ """
+ Test that stage peers can be None, if peers configuration is not None.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+ config.stage = StageConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+
+ config.stage.targetDir = "/whatever"
+ config.stage.localPeers = None
+ config.stage.remotePeers = None
+
+ config._validatePeers()
+ config._validateStage()
+
+ def testValidate_069(self):
+ """
+ Test that stage peers can be empty lists, if peers configuration is not None.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+ config.stage = StageConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+
+ config.stage.targetDir = "/whatever"
+ config.stage.localPeers = []
+ config.stage.remotePeers = []
+
+ config._validatePeers()
+ config._validateStage()
+
+ def testValidate_070(self):
+ """
+ Test that staging local peers must be valid if filled in, even if peers
+ configuration is not None.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+ config.stage = StageConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+
+ config.stage.targetDir = "/whatever"
+ config.stage.localPeers = [LocalPeer(), ] # empty local peer is invalid, so validation should catch it
+ config.stage.remotePeers = []
+
+ config._validatePeers()
+ self.failUnlessRaises(ValueError, config._validateStage)
+
+ def testValidate_071(self):
+ """
+ Test that staging remote peers must be valid if filled in, even if peers
+ configuration is not None.
+ """
+ config = Config()
+ config.options = OptionsConfig(backupUser="ken", rcpCommand="command")
+ config.peers = PeersConfig()
+ config.stage = StageConfig()
+
+ config.peers.localPeers = [ LocalPeer(name="unique1", collectDir="/nowhere"), ]
+ config.peers.remotePeers = [ RemotePeer(name="unique2", collectDir="/some/path/to/data"), ]
+
+ config.stage.targetDir = "/whatever"
+ config.stage.localPeers = []
+ config.stage.remotePeers = [RemotePeer(), ] # empty remote peer is invalid, so validation should catch it
+
+ config._validatePeers()
+ self.failUnlessRaises(ValueError, config._validateStage)
+
+ def testValidate_072(self):
+ """
+ Test that staging local and remote peers must be valid if filled in, even
+ if peers configuration is not None.
+ ""...
[truncated message content] |
|
From: <pro...@us...> - 2007-12-15 19:20:16
|
Revision: 804
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=804&view=rev
Author: pronovic
Date: 2007-12-15 11:20:09 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Refactor peer validation into _validatePeerList()
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 17:59:13 UTC (rev 803)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 19:20:09 UTC (rev 804)
@@ -5060,49 +5060,14 @@
(remote or local) between the two lists of peers. A list with no entries
can be either C{None} or an empty list C{[]} if desired.
- Local peers must be completely filled in, including both name and collect
- directory. Remote peers must also fill in the name and collect
- directory, but can leave the remote user and rcp command unset. In this
- case, the remote user is assumed to match the backup user from the
- options section and rcp command is taken directly from the options
- section.
+ Then, peer list validation (see L{_validatePeerList}) applies as well.
@raise ValueError: If stage configuration is invalid.
"""
if self.stage is not None:
if self.stage.targetDir is None:
raise ValueError("Stage section target directory must be filled in.")
- if self.stage.localPeers is None and self.stage.remotePeers is None:
- raise ValueError("Stage section must contain at least one backup peer.")
- if self.stage.localPeers is None and self.stage.remotePeers is not None:
- if len(self.stage.remotePeers) < 1:
- raise ValueError("Stage section must contain at least one backup peer.")
- elif self.stage.localPeers is not None and self.stage.remotePeers is None:
- if len(self.stage.localPeers) < 1:
- raise ValueError("Stage section must contain at least one backup peer.")
- elif self.stage.localPeers is not None and self.stage.remotePeers is not None:
- if len(self.stage.localPeers) + len(self.stage.remotePeers) < 1:
- raise ValueError("Stage section must contain at least one backup peer.")
- names = []
- if self.stage.localPeers is not None:
- for localPeer in self.stage.localPeers:
- if localPeer.name is None:
- raise ValueError("Local peers must set a name.")
- names.append(localPeer.name)
- if localPeer.collectDir is None:
- raise ValueError("Local peers must set a collect directory.")
- if self.stage.remotePeers is not None:
- for remotePeer in self.stage.remotePeers:
- if remotePeer.name is None:
- raise ValueError("Remote peers must set a name.")
- names.append(remotePeer.name)
- if remotePeer.collectDir is None:
- raise ValueError("Remote peers must set a collect directory.")
- if (self.options is None or self.options.backupUser is None) and remotePeer.remoteUser is None: # redundant
- raise ValueError("Remote user must either be set in options section or individual remote peer.")
- if (self.options is None or self.options.rcpCommand is None) and remotePeer.rcpCommand is None: # redundant
- raise ValueError("Remote copy command must either be set in options section or individual remote peer.")
- Config._checkUnique("Duplicate peer names exist:", names)
+ self._validatePeerList(self.stage.localPeers, self.stage.remotePeers)
def _validateStore(self):
"""
@@ -5160,7 +5125,55 @@
if purgeDir.retainDays is None:
raise ValueError("Each purge directory must set a retain days value.")
+ def _validatePeerList(self, localPeers, remotePeers):
+ """
+ Validates the set of local and remote peers.
+ Local peers must be completely filled in, including both name and collect
+ directory. Remote peers must also fill in the name and collect
+ directory, but can leave the remote user and rcp command unset. In this
+ case, the remote user is assumed to match the backup user from the
+ options section and rcp command is taken directly from the options
+ section.
+
+ @param localPeers: List of local peers
+ @param remotePeers: List of remote peers
+
+ @raise ValueError: If stage configuration is invalid.
+ """
+ if localPeers is None and remotePeers is None:
+ raise ValueError("Peer list must contain at least one backup peer.")
+ if localPeers is None and remotePeers is not None:
+ if len(remotePeers) < 1:
+ raise ValueError("Peer list must contain at least one backup peer.")
+ elif localPeers is not None and remotePeers is None:
+ if len(localPeers) < 1:
+ raise ValueError("Peerl list must contain at least one backup peer.")
+ elif localPeers is not None and remotePeers is not None:
+ if len(localPeers) + len(remotePeers) < 1:
+ raise ValueError("Peerl list must contain at least one backup peer.")
+ names = []
+ if localPeers is not None:
+ for localPeer in localPeers:
+ if localPeer.name is None:
+ raise ValueError("Local peers must set a name.")
+ names.append(localPeer.name)
+ if localPeer.collectDir is None:
+ raise ValueError("Local peers must set a collect directory.")
+ if remotePeers is not None:
+ for remotePeer in remotePeers:
+ if remotePeer.name is None:
+ raise ValueError("Remote peers must set a name.")
+ names.append(remotePeer.name)
+ if remotePeer.collectDir is None:
+ raise ValueError("Remote peers must set a collect directory.")
+ if (self.options is None or self.options.backupUser is None) and remotePeer.remoteUser is None: # redundant
+ raise ValueError("Remote user must either be set in options section or individual remote peer.")
+ if (self.options is None or self.options.rcpCommand is None) and remotePeer.rcpCommand is None: # redundant
+ raise ValueError("Remote copy command must either be set in options section or individual remote peer.")
+ Config._checkUnique("Duplicate peer names exist:", names)
+
+
##############################################
# Utility methods used for validating content
##############################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2007-12-15 17:59:15
|
Revision: 803
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=803&view=rev
Author: pronovic
Date: 2007-12-15 09:59:13 -0800 (Sat, 15 Dec 2007)
Log Message:
-----------
Fix typos
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/CedarBackup2/peer.py
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2007-12-02 18:26:05 UTC (rev 802)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2007-12-15 17:59:13 UTC (rev 803)
@@ -1837,7 +1837,7 @@
"""
if value is not None:
if len(value) < 1:
- raise ValueError("The remote user must be a non-empty string.")
+ raise ValueError("The rcp command must be a non-empty string.")
self._rcpCommand = value
def _getRcpCommand(self):
Modified: cedar-backup2/trunk/CedarBackup2/peer.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-02 18:26:05 UTC (rev 802)
+++ cedar-backup2/trunk/CedarBackup2/peer.py 2007-12-15 17:59:13 UTC (rev 803)
@@ -437,10 +437,10 @@
Initializes a remote backup peer.
@note: If provided, the rcp command will eventually be parsed into a list
- of strings suitable for passing to C{popen2.Popen4} in order to avoid
- security holes related to shell interpolation. This parsing will be
- done by the L{util.splitCommandLine} function. See the documentation for
- that function for some important notes about its limitations.
+ of strings suitable for passing to C{util.executeCommand} in order to
+ avoid security holes related to shell interpolation. This parsing will
+ be done by the L{util.splitCommandLine} function. See the documentation
+ for that function for some important notes about its limitations.
@param name: Name of the backup peer
@type name: String, must be a valid DNS hostname
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|