Exemple #1
0
 def _create_legacy_schedule(self, sched, klass):
     sched_path = sched.as_node_url()
     if sched_path not in self.__legacy_schedules:
         do_create = True
         for s in self.__legacy_needs_pruning:
             if sched_path == s.configuration().get('delegate'):
                 do_create = False
                 break
         if do_create:
             for s in self.__ph_legacy_needs_pruning:
                 if sched_path == s.configuration().get('delegate'):
                     do_create = False
                     break
         if do_create:
             new_sched = klass()
             name = sched.name.replace(':', '_')
             cd = {
                 'name': name,
                 'parent': self,
                 'delegate': sched.as_node_url()
             }
             new_sched.configure(cd)
             nodepath = new_sched.as_node_url()
             PERSISTANCE_MANAGER.put_sched(nodepath,
                                           serialize_node(new_sched))
             new_sched.set_override(True)
             new_sched.start()
         self.__legacy_schedules.append(sched_path)
Exemple #2
0
 def _create_legacy_schedule(self, sched, klass): 
     sched_path = sched.as_node_url()
     if sched_path not in self.__legacy_schedules:
         do_create = True
         for s in self.__legacy_needs_pruning:
             if sched_path == s.configuration().get('delegate'):
                 do_create = False
                 break
         if do_create:
             for s in self.__ph_legacy_needs_pruning:
                 if sched_path == s.configuration().get('delegate'):
                     do_create = False
                     break
         if do_create:
             new_sched = klass()
             name = sched.name.replace(':', '_')
             cd = {'name':name,
                   'parent':self,
                   'delegate':sched.as_node_url()}
             new_sched.configure(cd)
             nodepath = new_sched.as_node_url()
             PERSISTANCE_MANAGER.put_sched(
                 nodepath, serialize_node(new_sched)
                 )
             new_sched.set_override(True)
             new_sched.start()
         self.__legacy_schedules.append(sched_path)
Exemple #3
0
 def _rename_schedule(self, source, destination, force=0):
     source_sched = self._get_schedule_node(source)
     if not force and source_sched.get_meta().get('immutable'):
         err_msg = 'Runtime renaming of schedule %s is not supported' % source_sched.name
         raise EImmutable(err_msg)
     new_name = destination.split('/')[-1]
     orig_sched_path = source_sched.as_node_url()
     cd = source_sched.configuration()
     cd['name'] = new_name
     source_sched.configure(cd)
     try:
         PERSISTANCE_MANAGER.move_sched(orig_sched_path,
                                        source_sched.as_node_url(),
                                        serialize_node(source_sched), True)
     except:
         msglog.exception()
Exemple #4
0
 def create_schedule(self, name, parent):
     '''create a schedule'''
     parent = self._get_schedule_node(parent)
     schedule = HierarchialScheduler()
     cd = {'name': name, 'parent': parent}
     schedule.configure(cd)
     nodepath = schedule.as_node_url()
     PERSISTANCE_MANAGER.put_sched(nodepath, serialize_node(schedule))
     if parent is not self:
         # do not change override status
         schedule._set_summary(parent.get_summary())
     else:
         schedule.set_override(True)
     schedule.start()
     PERSISTANCE_MANAGER.put_sched_summary(nodepath, schedule.get_summary())
     self.event_generate(ScheduleCreatedEvent(self, schedule))
Exemple #5
0
 def _load_remote_schedules(self, sched_manager, host):
     hostname = host.name
     host_url = host.as_node_url()
     for sched_name in sched_manager.children_schedule_names():
         name = '[%s] %s' % (hostname, sched_name)
         try:
             schedule = sched_manager.get_child(sched_name)
             uuid = schedule.get_uuid()
             if self._proxied_manager.was_persisted(host_url, uuid):
                 persisted_sched = self._proxied_manager.get_persisted(
                     host_url, uuid)
                 if persisted_sched.name != name:
                     from_path = persisted_sched.as_node_url()
                     fsplit = from_path.split('/')
                     fsplit[-1] = name
                     to_path = '/'.join(fsplit)
                     # update the link to the schedule that it proxies.
                     cd = persisted_sched.configuration()
                     cd['proxy'] = schedule
                     persisted_sched.configure(cd)
                     self.move_schedule(from_path, to_path, 1)
                 self._proxied_manager.register_active(
                     host_url, uuid, schedule)
             else:
                 new_schedule = ProxiedHierarchialScheduler()
                 cd = {
                     'name': name,
                     'parent': self,
                     'proxy': schedule,
                     'host_url': host_url,
                     'uuid': uuid
                 }
                 new_schedule.configure(cd)
                 nodepath = new_schedule.as_node_url()
                 PERSISTANCE_MANAGER.put_sched(nodepath,
                                               serialize_node(new_schedule))
                 new_schedule.start()
                 new_schedule.set_host(host)
                 self._proxied_manager.register_new(host_url, uuid,
                                                    new_schedule)
                 persisted_sched = new_schedule
             persisted_sched.refresh_children_names()
         except:
             msglog.exception()
     self._proxied_manager.prune_inactive(host_url)
     self._proxied_manager.clear_active(host_url)
Exemple #6
0
 def _rename_schedule(self, source, destination, force=0):
     source_sched = self._get_schedule_node(source)
     if not force and source_sched.get_meta().get('immutable'):
         err_msg = 'Runtime renaming of schedule %s is not supported' % source_sched.name
         raise EImmutable(err_msg)
     new_name = destination.split('/')[-1]
     orig_sched_path = source_sched.as_node_url()
     cd = source_sched.configuration()
     cd['name'] = new_name
     source_sched.configure(cd)
     try:
         PERSISTANCE_MANAGER.move_sched(
             orig_sched_path,
             source_sched.as_node_url(),
             serialize_node(source_sched),
             True
             )
     except:
         msglog.exception()
Exemple #7
0
 def create_schedule(self, name, parent):
 	'''create a schedule'''
     parent = self._get_schedule_node(parent)
     schedule = HierarchialScheduler()
     cd = {'name':name,
           'parent':parent}
     schedule.configure(cd)
     nodepath = schedule.as_node_url()
     PERSISTANCE_MANAGER.put_sched(nodepath, serialize_node(schedule))
     if parent is not self:
         # do not change override status
         schedule._set_summary(parent.get_summary())
     else:
         schedule.set_override(True)
     schedule.start()
     PERSISTANCE_MANAGER.put_sched_summary(nodepath, schedule.get_summary())
     self.event_generate(
         ScheduleCreatedEvent(self, schedule)
         )
Exemple #8
0
 def _load_remote_schedules(self, sched_manager, host): 
     hostname = host.name
     host_url = host.as_node_url()
     for sched_name in sched_manager.children_schedule_names():
         name = '[%s] %s' % (hostname, sched_name)
         try:
             schedule = sched_manager.get_child(sched_name)
             uuid = schedule.get_uuid()
             if self._proxied_manager.was_persisted(host_url, uuid):
                 persisted_sched = self._proxied_manager.get_persisted(host_url, uuid)
                 if persisted_sched.name != name:
                     from_path = persisted_sched.as_node_url()
                     fsplit = from_path.split('/')
                     fsplit[-1] = name
                     to_path = '/'.join(fsplit)
                     # update the link to the schedule that it proxies.
                     cd = persisted_sched.configuration()
                     cd['proxy'] = schedule
                     persisted_sched.configure(cd)
                     self.move_schedule(from_path, to_path, 1)
                 self._proxied_manager.register_active(host_url, uuid, schedule)
             else:
                 new_schedule = ProxiedHierarchialScheduler()
                 cd = {'name':name,
                       'parent':self,
                       'proxy':schedule,
                       'host_url':host_url,
                       'uuid':uuid}
                 new_schedule.configure(cd)
                 nodepath = new_schedule.as_node_url()
                 PERSISTANCE_MANAGER.put_sched(
                     nodepath, serialize_node(new_schedule)
                     )
                 new_schedule.start()
                 new_schedule.set_host(host)
                 self._proxied_manager.register_new(host_url, uuid, new_schedule)
                 persisted_sched = new_schedule
             persisted_sched.refresh_children_names()
         except:
             msglog.exception()
     self._proxied_manager.prune_inactive(host_url)
     self._proxied_manager.clear_active(host_url)
Exemple #9
0
 def do_start(self):
     self.message('Schedule Manager starting.')
     schedule_ph_prune = False
     scheds = PERSISTANCE_MANAGER.get_scheds()
     proxy_prune_list = []
     for sched in scheds:
         node_info = {}
         try:
             node_info = PERSISTANCE_MANAGER.get_sched_cfg(sched)
            	if node_info.get('factory').count('ProxiedHierarchialScheduler'):
                 host_url = node_info.get('cfg').get('host_url')
                 try:
                     as_node(host_url)
                 except ENoSuchName:
                     proxy_prune_list.append(sched)
                     continue
             sched_node = create_node(node_info)
             uuid = node_info.get('cfg').get('uuid')
             if not uuid or uuid == 'None':
                 # uuid was added later - below code to deal with persisting
                 # of that property.
                 PERSISTANCE_MANAGER.put_sched(
                     sched_node.as_node_url(), serialize_node(sched_node)
                 )
         #except:
         #    msglog.exception()
         #    continue
             if not isinstance(sched_node, ProxiedHierarchialScheduler):
                 # proxied schedules store locally.  Restore summary, properties
                 # and meta for local.
                 url = sched_node.as_node_url()   
                 properties = PERSISTANCE_MANAGER.get_sched_props(url)
                 if properties:
                     sched_node.set_properties(properties, save=False)
                 meta = PERSISTANCE_MANAGER.get_sched_meta(url)
                 if meta:
                     sched_node.set_event_meta(meta)
                 if not isinstance(sched_node, 
                     (DelegatedHierarchialScheduler,
                      CtlSvcDelegatedHierarchialScheduler)):
                     sched_node._set_summary(
                        PERSISTANCE_MANAGER.get_sched_summary(url)
                     )    
                 sched_node.set_override(
                     PERSISTANCE_MANAGER.get_override(url)
                 )
             if isinstance(sched_node, DelegatedHierarchialScheduler):
                 # keep track of the "legacy" schedules we are delegating to
                 delegate = sched_node.configuration().get('delegate')
                 try:
                     # see if the target still exists.
                     as_node(delegate)
                     self.__legacy_schedules.append(delegate)
                 except:
                     # the legacy schedule disappeared on us.  
                     # schedule it for removal, iff it doesn't have children
                     if isinstance(sched_node, CtlSvcDelegatedHierarchialScheduler):
                         schedule_ph_prune = True
                         self.__ph_legacy_needs_pruning.append(sched_node)
                     else:
                         self.__legacy_needs_pruning.append(sched_node)
             elif isinstance(sched_node, ProxiedHierarchialScheduler):
                 host_url = sched_node.host_url
                 uuid = sched_node.configuration().get('uuid')
                 self._proxied_manager.register_persisted(host_url, uuid, sched_node)
             try:
                 sched_node.start()
             except:
                 msglog.exception()
         except:
             msglog.exception()
             #continue
         #LOOP ENDS
   	proxy_prune_list.sort(sched_sort)
     for sched in proxy_prune_list:
         msg = 'Removing schedule %s for non existent host.' % urllib.unquote(sched)
         self.message(msg, level=0)
         PERSISTANCE_MANAGER.remove_sched(sched)  
     self._load_schedules()
     self._prune_schedules(self.__legacy_needs_pruning)
     try:
         remote_hosts = self.host_manager.children_nodes()
     except:
         remote_hosts = []
     self.load_remote_hosts(remote_hosts)
     if schedule_ph_prune:
         # there's control service scheduled to care about.
         self._ph_scheduled = sys_scheduler.seconds_from_now_do(
             60, self._prune_legacy_ph_schedules
         )
     self.__running = True
Exemple #10
0
         return self._rename_schedule(source, destination, force)
     source_sched = self._get_schedule_node(source)
     source_sched.set_override(True)
     orig_sched_path = source_sched.as_node_url()
     dest_sched = self._get_schedule_node(destination)
     if dest_sched.has_child(source_sched.name):
         raise ENameInUse(source_sched.name)
     dest_sched_path = dest_sched.as_node_url()
     cd = source_sched.configuration()
     cd['parent'] = dest_sched
     source_sched.configure(cd)
     try:
         PERSISTANCE_MANAGER.move_sched(
             orig_sched_path, 
             dest_sched.as_node_url(), 
             serialize_node(source_sched)
             )
     except:
         msglog.exception()
     if dest_sched is self:
         source_sched.set_override(True)
     source_sched.stop()
     source_sched.start()
     self.event_generate(
         ScheduleMovedEvent(self, source_sched, orig_sched_path, dest_sched_path)
         )
         
 def _is_rename(self, source, destination):
     if is_node(source):
         return source is destination
     s_elements = source.split('/')
Exemple #11
0
 def do_start(self):
     self.message('Schedule Manager starting.')
     schedule_ph_prune = False
     scheds = PERSISTANCE_MANAGER.get_scheds()
     proxy_prune_list = []
     for sched in scheds:
         node_info = {}
         try:
             node_info = PERSISTANCE_MANAGER.get_sched_cfg(sched)
             if node_info.get('factory').count(
                     'ProxiedHierarchialScheduler'):
                 host_url = node_info.get('cfg').get('host_url')
                 try:
                     as_node(host_url)
                 except ENoSuchName:
                     proxy_prune_list.append(sched)
                     continue
             sched_node = create_node(node_info)
             uuid = node_info.get('cfg').get('uuid')
             if not uuid or uuid == 'None':
                 # uuid was added later - below code to deal with persisting
                 # of that property.
                 PERSISTANCE_MANAGER.put_sched(sched_node.as_node_url(),
                                               serialize_node(sched_node))
         #except:
         #    msglog.exception()
         #    continue
             if not isinstance(sched_node, ProxiedHierarchialScheduler):
                 # proxied schedules store locally.  Restore summary, properties
                 # and meta for local.
                 url = sched_node.as_node_url()
                 properties = PERSISTANCE_MANAGER.get_sched_props(url)
                 if properties:
                     sched_node.set_properties(properties, save=False)
                 meta = PERSISTANCE_MANAGER.get_sched_meta(url)
                 if meta:
                     sched_node.set_event_meta(meta)
                 if not isinstance(sched_node,
                                   (DelegatedHierarchialScheduler,
                                    CtlSvcDelegatedHierarchialScheduler)):
                     sched_node._set_summary(
                         PERSISTANCE_MANAGER.get_sched_summary(url))
                 sched_node.set_override(
                     PERSISTANCE_MANAGER.get_override(url))
             if isinstance(sched_node, DelegatedHierarchialScheduler):
                 # keep track of the "legacy" schedules we are delegating to
                 delegate = sched_node.configuration().get('delegate')
                 try:
                     # see if the target still exists.
                     as_node(delegate)
                     self.__legacy_schedules.append(delegate)
                 except:
                     # the legacy schedule disappeared on us.
                     # schedule it for removal, iff it doesn't have children
                     if isinstance(sched_node,
                                   CtlSvcDelegatedHierarchialScheduler):
                         schedule_ph_prune = True
                         self.__ph_legacy_needs_pruning.append(sched_node)
                     else:
                         self.__legacy_needs_pruning.append(sched_node)
             elif isinstance(sched_node, ProxiedHierarchialScheduler):
                 host_url = sched_node.host_url
                 uuid = sched_node.configuration().get('uuid')
                 self._proxied_manager.register_persisted(
                     host_url, uuid, sched_node)
             try:
                 sched_node.start()
             except:
                 msglog.exception()
         except:
             msglog.exception()
             #continue
         #LOOP ENDS
     proxy_prune_list.sort(sched_sort)
     for sched in proxy_prune_list:
         msg = 'Removing schedule %s for non existent host.' % urllib.unquote(
             sched)
         self.message(msg, level=0)
         PERSISTANCE_MANAGER.remove_sched(sched)
     self._load_schedules()
     self._prune_schedules(self.__legacy_needs_pruning)
     try:
         remote_hosts = self.host_manager.children_nodes()
     except:
         remote_hosts = []
     self.load_remote_hosts(remote_hosts)
     if schedule_ph_prune:
         # there's control service scheduled to care about.
         self._ph_scheduled = sys_scheduler.seconds_from_now_do(
             60, self._prune_legacy_ph_schedules)
     self.__running = True
Exemple #12
0
        if self._is_rename(source, destination):
            return self._rename_schedule(source, destination, force)
        source_sched = self._get_schedule_node(source)
        source_sched.set_override(True)
        orig_sched_path = source_sched.as_node_url()
        dest_sched = self._get_schedule_node(destination)
        if dest_sched.has_child(source_sched.name):
            raise ENameInUse(source_sched.name)
        dest_sched_path = dest_sched.as_node_url()
        cd = source_sched.configuration()
        cd['parent'] = dest_sched
        source_sched.configure(cd)
        try:
            PERSISTANCE_MANAGER.move_sched(orig_sched_path,
                                           dest_sched.as_node_url(),
                                           serialize_node(source_sched))
        except:
            msglog.exception()
        if dest_sched is self:
            source_sched.set_override(True)
        source_sched.stop()
        source_sched.start()
        self.event_generate(
            ScheduleMovedEvent(self, source_sched, orig_sched_path,
                               dest_sched_path))

    def _is_rename(self, source, destination):
        if is_node(source):
            return source is destination
        s_elements = source.split('/')
        d_elements = destination.split('/')