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)
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)
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()
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))
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)
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()
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) )
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)
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
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('/')
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
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('/')