示例#1
0
    def __init__(self, name, manager, *args):
        super(WorkspaceOnCouch, self).__init__(name, manager)
        self._is_replicated = replicated = CONF.getCouchIsReplicated()
        self.cdm = self._dmanager = manager.couchdbmanager

        if not self.cdm.workspaceExists(name):
            self.cdm.addWorkspace(name)
            if self.is_replicated():
                self.cdm.replicate(self.name,
                                   *self.validate_replic_urls(
                                       CONF.getCouchReplics()),
                                   create_target=True)

        self.cdm.syncWorkspaceViews(name)

        self.container = CouchedModelObjectContainer(name, self.cdm)
示例#2
0
文件: workspace.py 项目: Behk/faraday
    def __init__(self, name, manager, *args):
        super(WorkspaceOnCouch, self).__init__(name, manager)
        self._is_replicated = replicated = CONF.getCouchIsReplicated()
        self.cdm  = self._dmanager = manager.couchdbmanager
            
        if not self.cdm.workspaceExists(name):
            self.cdm.addWorkspace(name)
            if self.is_replicated():
                self.cdm.replicate(self.name, *self.validate_replic_urls(CONF.getCouchReplics()), create_target = True)

        self.cdm.syncWorkspaceViews(name)

        self.container = CouchedModelObjectContainer(name, self.cdm)
示例#3
0
文件: workspace.py 项目: Behk/faraday
class WorkspaceOnCouch(Workspace):
    """A Workspace that is syncronized in couchdb"""
    def __init__(self, name, manager, *args):
        super(WorkspaceOnCouch, self).__init__(name, manager)
        self._is_replicated = replicated = CONF.getCouchIsReplicated()
        self.cdm  = self._dmanager = manager.couchdbmanager
            
        if not self.cdm.workspaceExists(name):
            self.cdm.addWorkspace(name)
            if self.is_replicated():
                self.cdm.replicate(self.name, *self.validate_replic_urls(CONF.getCouchReplics()), create_target = True)

        self.cdm.syncWorkspaceViews(name)

        self.container = CouchedModelObjectContainer(name, self.cdm)
       

    def syncFiles(self):
        self.load()

    @staticmethod
    def isAvailable():
        return CouchdbManager.testCouch(CONF.getCouchURI())

    def is_replicated(self):
        return self._is_replicated

    def validate_replic_urls(self, urlsString):
                                      
        urls = urlsString.split(";") if urlsString is not None else ""
                                                            
        valid_replics = []
        for url in urls:
            try:
                self.cdm.testCouchUrl(url)
                valid_replics.append(url)
            except:
                pass

        return valid_replics

    def saveObj(self, obj):
        self.cdm.saveDocument(self.name, obj._toDict())
        self.cdm.compactDatabase(self.name)

    def delObj(self, obj):
        obj_id = obj.ancestors_path()
        if self._dmanager.checkDocument(self.name, obj_id):
            self._dmanager.remove(self.name, obj_id)
  
    def save(self): 
        model.api.devlog("Saving workspaces")
        for host in self.getContainee().itervalues():
            host_as_dict = host.toDict()
            for obj_dic in host_as_dict:
                self.cdm.saveDocument(self.name, obj_dic)
                                            

    def load(self):
        model.api.devlog("Changes from another instance")
        self._model_controller.setSavingModel(True)
        hosts = {}

        def find_leaf(path, sub_graph = hosts):
            for i in path:
                if len(path) > 1:
                    return find_leaf(path[1:], sub_graph['subs'][i])
                else:
                    return sub_graph
        try:
            t = time.time()
            model.api.devlog("load start: %s" % str(t))
            docs = [i["doc"] for i in self.cdm.workspaceDocumentsIterator(self.name)]
            model.api.devlog("time to get docs: %s" % str(time.time() - t))
            t = time.time()
            for d in docs:
                id_path = d['_id'].split('.')
                if d['type'] == "Host":
                    hosts[d['_id']] = d
                    subs = hosts.get('subs', {})
                    subs[d['_id']] = d
                    hosts['subs'] = subs
                    continue

                leaf = find_leaf(id_path)
                subs = leaf.get('subs', {})
                subs[d['obj_id']] = d
                leaf['subs'] = subs

                key = "%s" % d['type']
                key = key.lower()
                sub = leaf.get(key, {})
                sub[d['obj_id']] = d
                leaf[key] = sub
            model.api.devlog("time to reconstruct: %s" % str(time.time() - t))
            t = time.time()

            self.container.clear()
            for k, v in hosts.items():
                if k is not "subs":
                    h = Host(name=None, dic=v)
                    self.container[k] = h
            model.api.devlog("time to fill container: %s" % str(time.time() - t))
            t = time.time()
        except Exception, e:
            model.api.devlog("Exception during load: %s" % e)
        finally:
示例#4
0
class WorkspaceOnCouch(Workspace):
    """A Workspace that is syncronized in couchdb"""
    def __init__(self, name, manager, *args):
        super(WorkspaceOnCouch, self).__init__(name, manager)
        self._is_replicated = replicated = CONF.getCouchIsReplicated()
        self.cdm = self._dmanager = manager.couchdbmanager

        if not self.cdm.workspaceExists(name):
            self.cdm.addWorkspace(name)
            if self.is_replicated():
                self.cdm.replicate(self.name,
                                   *self.validate_replic_urls(
                                       CONF.getCouchReplics()),
                                   create_target=True)

        self.cdm.syncWorkspaceViews(name)

        self.container = CouchedModelObjectContainer(name, self.cdm)

    def syncFiles(self):
        self.load()

    @staticmethod
    def isAvailable():
        return CouchdbManager.testCouch(CONF.getCouchURI())

    def is_replicated(self):
        return self._is_replicated

    def validate_replic_urls(self, urlsString):

        urls = urlsString.split(";") if urlsString is not None else ""

        valid_replics = []
        for url in urls:
            try:
                self.cdm.testCouchUrl(url)
                valid_replics.append(url)
            except:
                pass

        return valid_replics

    def saveObj(self, obj):
        self.cdm.saveDocument(self.name, obj._toDict())
        self.cdm.compactDatabase(self.name)

    def delObj(self, obj):
        obj_id = obj.ancestors_path()
        if self._dmanager.checkDocument(self.name, obj_id):
            self._dmanager.remove(self.name, obj_id)

    def save(self):
        model.api.devlog("Saving workspaces")
        for host in self.getContainee().itervalues():
            host_as_dict = host.toDict()
            for obj_dic in host_as_dict:
                self.cdm.saveDocument(self.name, obj_dic)

    def load(self):
        self._model_controller.setSavingModel(True)
        hosts = {}

        def find_leaf(path, sub_graph=hosts):
            for i in path:
                if len(path) > 1:
                    return find_leaf(path[1:], sub_graph['subs'][i])
                else:
                    return sub_graph

        try:
            t = time.time()
            model.api.devlog("load start: %s" % str(t))
            docs = [
                i["doc"]
                for i in self.cdm.workspaceDocumentsIterator(self.name)
            ]
            model.api.devlog("time to get docs: %s" % str(time.time() - t))
            t = time.time()
            for d in docs:
                id_path = d['_id'].split('.')
                if d['type'] == "Host":
                    hosts[d['_id']] = d
                    subs = hosts.get('subs', {})
                    subs[d['_id']] = d
                    hosts['subs'] = subs
                    continue

                leaf = {}
                try:
                    leaf = find_leaf(id_path)
                except Exception as e:
                    model.api.devlog('Object parent not found, skipping: %s' %
                                     '.'.join(id_path))
                    continue

                subs = leaf.get('subs', {})
                subs[d['obj_id']] = d
                leaf['subs'] = subs

                key = "%s" % d['type']
                key = key.lower()
                sub = leaf.get(key, {})
                sub[d['obj_id']] = d
                leaf[key] = sub
            model.api.devlog("time to reconstruct: %s" % str(time.time() - t))
            t = time.time()

            self.container.clear()
            for k, v in hosts.items():
                if k is not "subs":
                    h = Host(name=None, dic=v)
                    self.container[k] = h
            model.api.devlog("time to fill container: %s" %
                             str(time.time() - t))
            t = time.time()
        except Exception, e:
            model.api.devlog("Exception during load: %s" % e)
        finally: