def testgetNodeFromPath(self): from comoonics.cdsl import getNodeFromPath self.assertEquals( getNodeFromPath(".cluster/cdsl/1/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "1") self.assertEquals( getNodeFromPath(".cluster/cdsl/nodename/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "nodename") self.assertEquals( getNodeFromPath(".cluster/cdsl/default/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "default") self.assertRaises(ValueError, getNodeFromPath, "/cdsl/default/hostdependent/shared", setupCDSLRepository.cdslRepository1, False)
def testgetNodeFromPath(self): from comoonics.cdsl import getNodeFromPath self.assertEquals( getNodeFromPath(".cluster/cdsl/1/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "1" ) self.assertEquals( getNodeFromPath(".cluster/cdsl/nodename/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "nodename", ) self.assertEquals( getNodeFromPath(".cluster/cdsl/default/hostdependent/shared", setupCDSLRepository.cdslRepository1, False), "default", ) self.assertRaises( ValueError, getNodeFromPath, "/cdsl/default/hostdependent/shared", setupCDSLRepository.cdslRepository1, False, )
def delete(self,recursive=True, symbolic=True, force=False): """ Deletes cdsl from filesystem and inventoryfile @param recursive: if set delete subcdsls (e.g. /host/shared/host when removing /host/shared) @type recursive: Boolean @param symbolic: If set remove only symbolic links, if not set also remove content, too. Default: True (means only symbolic) @type symbolic: Boolean @param force: Removes the cdsl independent from if all contents can be found or not. Default: False @type force: Boolean """ from comoonics.ComPath import Path from comoonics.cdsl import getNodeFromPath, isSubPath, commonpath, subpathsto if not force and not self.exists(): raise CdslDoesNotExistException("Cdsl with source " + self.src + " does not exist, cannot delete.") if not force and not self.isShared() and not self.isHostdependent(): raise CdslUnsupportedTypeException(self.type + " is not a supported cdsl type.") #verify if cdsl contains other cdsl, if true delete these first #assume completeness of inventoryfile if recursive == True: _tmp = self.getChilds() for cdsl in _tmp: cdsl.delete(recursive=recursive, force=force, symbolic=symbolic) if self.getChilds(): raise CdslHasChildren("Cdsl %s has children but no recursive option specified." %self.src) _cwd=Path() _cwd.pushd(self.getBasePath()) #delete or move cdsl from filesystem first is from second to if second=None it is removed _delpaths=list() _movepairs=dict() _delpaths2=list() for _path in self.getSourcePaths(): # This one is always a link to be removed if os.path.lexists(_path): _delpaths.append(_path) for _path in self.getDestPaths(): if not symbolic: _delpaths.append(_path) else: self.logger.debug(".delete(%s): Skipping path %s" %(self.src, _path)) if self.isShared(): _movepairs[_path]=self.src else: _nodeid=getNodeFromPath(_path, self.cdslRepository, not force) _movepairs[_path]="%s.%s" %(self.src, _nodeid) # _delpaths[_path]=self. # tidy up the rest # Means: # * if we have siblings: clean up to longest common path with all siblings prefixes=list() if self.isHostdependent(): for nodename in self.getNodenames(): prefixes.append(os.path.join(self.cdslRepository.getTreePath(), nodename)) elif self.isShared(): prefixes.append(self.cdslRepository.getSharedTreepath()) # Let's find our parent of same type # parent2nd=None # if self.getParent()!=None and self.getParent().getParent() != None: # parent2nd=self.getParent().getParent() parent2nd=None parent=self.getParent() subpaths=list() siblings=self.getSiblings() if len(siblings) > 0: longestcommon="" for sibling in siblings: common=commonpath(self.src, sibling.src) # while common and common != longestcommon: if isSubPath(common, longestcommon): longestcommon=common for _path in subpathsto(longestcommon, self.src): subpaths.append(_path) # * if we have a parent of same type and no siblings: clean up to parent # elif parent2nd != None: # for _path in subpathsto(parent2nd.src, self.src): # subpaths.append(_path) # * if we don't have a parent and no siblings: clean up to root+mountpoint # * if we have a parent of same type and no siblings: clean up to parent elif parent != None and parent.getParent() != None: for _path in subpathsto(parent.src, self.src): subpaths.append(_path) else: for _path in subpathsto("", self.src): subpaths.append(_path) for path in subpaths: if str(path) != str(self.src): for prefix in prefixes: if os.path.lexists(os.path.join(prefix, path)): _delpaths2.append(os.path.join(prefix, path)) self.logger.debug("delpaths2: %s" %_delpaths2) self.logger.debug("delete: cwd: %s" %_cwd) self._removePath(_delpaths) for _from, _to in _movepairs.items(): if not _to: self._removePath(_from) else: # for _delpath in _delpaths: # if os.path.samefile(_delpath, _to): # _delpaths.remove(_delpath) if os.path.islink(_to): self._removePath(_to) shutil.move(_from, _to) # We must remove paths from the delpaths that have been moved to as they are # for _delpath in _delpaths: # if os.path.samefile(_to, _delpath): # _delpaths.remove(_delpath) self._removePath(_delpaths2) _deleted=ComSystem.execMethod(self.cdslRepository.delete, self) _cwd.popd() self.logger.debug("Delete CDSL from Inventoryfile") #delete cdsl also from xml inventory file #self.cdslRepository.delete(self) return _deleted
def delete(self, recursive=True, force=True): """ Deletes cdsl from filesystem and inventoryfile @param force: If not set remove only symbolic links, if set remove content, too @type force: Boolean @param recursive: if set delete subcdsls (e.g. /host/shared/host when removing /host/shared) @type recursive: Boolean """ from comoonics.ComPath import Path from comoonics.cdsl import getNodeFromPath, isSubPath, commonpath, subpathsto if not self.exists(): raise CdslDoesNotExistException("Cdsl with source " + self.src + " does not exist, cannot delete.") if not self.isShared() and not self.isHostdependent(): raise CdslUnsupportedTypeException( self.type + " is not a supported cdsl type.") #verify if cdsl contains other cdsl, if true delete these first #assume completeness of inventoryfile if recursive == True: _tmp = self.getChilds() for cdsl in _tmp: cdsl.delete(recursive, force) _cwd = Path() _cwd.pushd(self.getBasePath()) #delete or move cdsl from filesystem first is from second to if second=None it is removed _delpaths = list() _movepairs = dict() _delpaths2 = list() for _path in self.getSourcePaths(): # This one is always a link to be removed _delpaths.append(_path) for _path in self.getDestPaths(): if force: _delpaths.append(_path) else: self.logger.debug(".delete(%s): Skipping path %s" % (self.src, _path)) if self.isShared(): _movepairs[_path] = self.src else: _nodeid = getNodeFromPath(_path, self.cdslRepository) _movepairs[_path] = "%s.%s" % (self.src, _nodeid) # _delpaths[_path]=self. # tidy up the rest # Means: # * if we have siblings: clean up to longest common path with all siblings prefixes = list() if self.isHostdependent(): for nodename in self.getNodenames(): prefixes.append( os.path.join(self.cdslRepository.getTreePath(), nodename)) elif self.isShared(): prefixes.append(self.cdslRepository.getSharedTreepath()) # Let's find our parent of same type parent2nd = None if self.getParent() != None and self.getParent().getParent() != None: parent2nd = self.getParent().getParent() subpaths = list() if len(self.getSiblings()) > 0: longestcommon = "" for sibling in self.getSiblings(): common = commonpath(self.src, sibling.src) # while common and common != longestcommon: if isSubPath(common, longestcommon): longestcommon = common for _path in subpathsto(longestcommon, self.src): subpaths.append(_path) # * if we have a parent of same type and no siblings: clean up to parent elif parent2nd != None: for _path in subpathsto(parent2nd.src, self.src): subpaths.append(_path) # * if we don't have a parent and no siblings: clean up to root+mountpoint else: for _path in subpathsto("", self.src): subpaths.append(_path) for path in subpaths: if str(path) != str(self.src): for prefix in prefixes: _delpaths2.append(os.path.join(prefix, path)) self.logger.debug("delpaths2: %s" % _delpaths2) self.logger.debug("delete: cwd: %s" % _cwd) self._removePath(_delpaths) for _from, _to in _movepairs.items(): if not _to: self._removePath(_from) else: # for _delpath in _delpaths: # if os.path.samefile(_delpath, _to): # _delpaths.remove(_delpath) if os.path.islink(_to): self._removePath(_to) shutil.move(_from, _to) # We must remove paths from the delpaths that have been moved to as they are # for _delpath in _delpaths: # if os.path.samefile(_to, _delpath): # _delpaths.remove(_delpath) self._removePath(_delpaths2) _deleted = ComSystem.execMethod(self.cdslRepository.delete, self) _cwd.popd() self.logger.debug("Delete CDSL from Inventoryfile") #delete cdsl also from xml inventory file #self.cdslRepository.delete(self) return _deleted