def write_environment_1( self, BUFFER=None ): if not BUFFER: BUFFER = self.FILE BUFFER.write( "\n\n# CYLC SUITE ENVIRONMENT:" ) # write the static suite variables for var, val in self.__class__.suite_env.items(): BUFFER.write( "\nexport " + var + "=" + str(val) ) if str(self.__class__.suite_env.get('CYLC_UTC')) == 'True': BUFFER.write( "\nexport TZ=UTC" ) # override and write task-host-specific suite variables gcfg = get_global_cfg() suite_work_dir = gcfg.get_derived_host_item( self.suite, 'suite work directory', self.host, self.owner ) st_env = deepcopy( self.__class__.suite_task_env ) st_env[ 'CYLC_SUITE_RUN_DIR' ] = gcfg.get_derived_host_item( self.suite, 'suite run directory', self.host, self.owner ) st_env[ 'CYLC_SUITE_WORK_DIR' ] = suite_work_dir st_env[ 'CYLC_SUITE_SHARE_DIR' ] = gcfg.get_derived_host_item( self.suite, 'suite share directory', self.host, self.owner ) st_env[ 'CYLC_SUITE_SHARE_PATH' ] = '$CYLC_SUITE_SHARE_DIR' # DEPRECATED rsp = self.jobconfig['remote suite path'] if rsp: st_env[ 'CYLC_SUITE_DEF_PATH' ] = rsp else: # replace home dir with '$HOME' for evaluation on the task host st_env[ 'CYLC_SUITE_DEF_PATH' ] = re.sub( os.environ['HOME'], '$HOME', st_env['CYLC_SUITE_DEF_PATH'] ) for var, val in st_env.items(): BUFFER.write( "\nexport " + var + "=" + str(val) ) task_work_dir = os.path.join( suite_work_dir, self.jobconfig['work sub-directory'] ) use_login_shell = gcfg.get_host_item( 'use login shell', self.host, self.owner ) comms = gcfg.get_host_item( 'task communication method', self.host, self.owner ) BUFFER.write( "\n\n# CYLC TASK ENVIRONMENT:" ) BUFFER.write( "\nexport CYLC_TASK_ID=" + self.task_id ) BUFFER.write( "\nexport CYLC_TASK_NAME=" + self.task_name ) BUFFER.write( "\nexport CYLC_TASK_MSG_RETRY_INTVL=" + str( gcfg.cfg['task messaging']['retry interval in seconds'])) BUFFER.write( "\nexport CYLC_TASK_MSG_MAX_TRIES=" + str( gcfg.cfg['task messaging']['maximum number of tries'])) BUFFER.write( "\nexport CYLC_TASK_MSG_TIMEOUT=" + str( gcfg.cfg['task messaging']['connection timeout in seconds'])) BUFFER.write( "\nexport CYLC_TASK_IS_COLDSTART=" + str( self.jobconfig['is cold-start']) ) BUFFER.write( "\nexport CYLC_TASK_CYCLE_TIME=" + self.tag ) BUFFER.write( "\nexport CYLC_TASK_LOG_ROOT=" + self.log_root ) BUFFER.write( '\nexport CYLC_TASK_NAMESPACE_HIERARCHY="' + ' '.join( self.jobconfig['namespace hierarchy']) + '"') BUFFER.write( "\nexport CYLC_TASK_TRY_NUMBER=" + str(self.jobconfig['try number']) ) BUFFER.write( "\nexport CYLC_TASK_COMMS_METHOD=" + comms ) BUFFER.write( "\nexport CYLC_TASK_SSH_LOGIN_SHELL=" + str(use_login_shell) ) BUFFER.write( "\nexport CYLC_TASK_WORK_DIR=" + task_work_dir ) BUFFER.write( "\nexport CYLC_TASK_WORK_PATH=$CYLC_TASK_WORK_DIR") # DEPRECATED
def __init__(self, hosts=None, owner=None, poll_interval=None): gobject.threads_init() set_exception_hook_dialog("cylc gsummary") setup_icons() if not hosts: gcfg = get_global_cfg() try: hosts = gcfg.cfg["suite host scanning"]["hosts"] except KeyError: hosts = ["localhost"] self.hosts = hosts if owner is None: owner = user self.owner = owner self.window = gtk.Window() self.window.set_title("cylc gsummary") self.window.set_icon(get_icon()) self.vbox = gtk.VBox() self.vbox.show() self.usercfg = config().cfg self.theme_name = self.usercfg['use theme'] self.theme = self.usercfg['themes'][self.theme_name] self.dots = DotMaker(self.theme) suite_treemodel = gtk.TreeStore(*([str, str, bool, str, int] + [str] * 20)) self._prev_tooltip_location_id = None self.suite_treeview = gtk.TreeView(suite_treemodel) # Construct the host column. host_name_column = gtk.TreeViewColumn("Host") cell_text_host = gtk.CellRendererText() host_name_column.pack_start(cell_text_host, expand=False) host_name_column.set_cell_data_func(cell_text_host, self._set_cell_text_host) host_name_column.set_sort_column_id(0) host_name_column.set_visible(False) # Construct the suite name column. suite_name_column = gtk.TreeViewColumn("Suite") cell_text_name = gtk.CellRendererText() suite_name_column.pack_start(cell_text_name, expand=False) suite_name_column.set_cell_data_func(cell_text_name, self._set_cell_text_name) suite_name_column.set_sort_column_id(1) # Construct the suite title column. suite_title_column = gtk.TreeViewColumn("Title") cell_text_title = gtk.CellRendererText() suite_title_column.pack_start(cell_text_title, expand=False) suite_title_column.set_cell_data_func(cell_text_title, self._set_cell_text_title) suite_title_column.set_sort_column_id(3) suite_title_column.set_visible(False) # Construct the update time column. time_column = gtk.TreeViewColumn("Updated") cell_text_time = gtk.CellRendererText() time_column.pack_start(cell_text_time, expand=False) time_column.set_cell_data_func(cell_text_time, self._set_cell_text_time) time_column.set_sort_column_id(4) time_column.set_visible(False) # Construct the status column. status_column = gtk.TreeViewColumn("Status") status_column.set_sort_column_id(5) for i in range(5, 25): cell_pixbuf_state = gtk.CellRendererPixbuf() status_column.pack_start(cell_pixbuf_state, expand=False) status_column.set_cell_data_func(cell_pixbuf_state, self._set_cell_pixbuf_state, i) self.suite_treeview.append_column(host_name_column) self.suite_treeview.append_column(suite_name_column) self.suite_treeview.append_column(suite_title_column) self.suite_treeview.append_column(time_column) self.suite_treeview.append_column(status_column) self.suite_treeview.show() if hasattr(self.suite_treeview, "set_has_tooltip"): self.suite_treeview.set_has_tooltip(True) try: self.suite_treeview.connect('query-tooltip', self._on_query_tooltip) except TypeError: # Lower PyGTK version. pass self.suite_treeview.connect("button-press-event", self._on_button_press_event) scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled_window.add(self.suite_treeview) scrolled_window.show() self.vbox.pack_start(scrolled_window, expand=True, fill=True) self.updater = SummaryAppUpdater(self.hosts, suite_treemodel, owner=self.owner, poll_interval=poll_interval) self.updater.start() self.window.add(self.vbox) self.window.connect("destroy", self._on_destroy_event) self.window.set_default_size(200, 100) self.suite_treeview.grab_focus() self.window.show()
def write_environment_1(self, BUFFER=None): if not BUFFER: BUFFER = self.FILE BUFFER.write("\n\n# CYLC SUITE ENVIRONMENT:") # write the static suite variables for var, val in self.__class__.suite_env.items(): BUFFER.write("\nexport " + var + "=" + str(val)) if str(self.__class__.suite_env.get('CYLC_UTC')) == 'True': BUFFER.write("\nexport TZ=UTC") # override and write task-host-specific suite variables gcfg = get_global_cfg() suite_work_dir = gcfg.get_derived_host_item(self.suite, 'suite work directory', self.host, self.owner) st_env = deepcopy(self.__class__.suite_task_env) st_env['CYLC_SUITE_RUN_DIR'] = gcfg.get_derived_host_item( self.suite, 'suite run directory', self.host, self.owner) st_env['CYLC_SUITE_WORK_DIR'] = suite_work_dir st_env['CYLC_SUITE_SHARE_DIR'] = gcfg.get_derived_host_item( self.suite, 'suite share directory', self.host, self.owner) st_env['CYLC_SUITE_SHARE_PATH'] = '$CYLC_SUITE_SHARE_DIR' # DEPRECATED rsp = self.jobconfig['remote suite path'] if rsp: st_env['CYLC_SUITE_DEF_PATH'] = rsp else: # replace home dir with '$HOME' for evaluation on the task host st_env['CYLC_SUITE_DEF_PATH'] = re.sub( os.environ['HOME'], '$HOME', st_env['CYLC_SUITE_DEF_PATH']) for var, val in st_env.items(): BUFFER.write("\nexport " + var + "=" + str(val)) task_work_dir = os.path.join(suite_work_dir, self.jobconfig['work sub-directory']) use_login_shell = gcfg.get_host_item('use login shell', self.host, self.owner) comms = gcfg.get_host_item('task communication method', self.host, self.owner) BUFFER.write("\n\n# CYLC TASK ENVIRONMENT:") BUFFER.write("\nexport CYLC_TASK_ID=" + self.task_id) BUFFER.write("\nexport CYLC_TASK_NAME=" + self.task_name) BUFFER.write( "\nexport CYLC_TASK_MSG_RETRY_INTVL=" + str(gcfg.cfg['task messaging']['retry interval in seconds'])) BUFFER.write( "\nexport CYLC_TASK_MSG_MAX_TRIES=" + str(gcfg.cfg['task messaging']['maximum number of tries'])) BUFFER.write( "\nexport CYLC_TASK_MSG_TIMEOUT=" + str(gcfg.cfg['task messaging']['connection timeout in seconds'])) BUFFER.write("\nexport CYLC_TASK_IS_COLDSTART=" + str(self.jobconfig['is cold-start'])) BUFFER.write("\nexport CYLC_TASK_CYCLE_TIME=" + self.tag) BUFFER.write("\nexport CYLC_TASK_LOG_ROOT=" + self.log_root) BUFFER.write('\nexport CYLC_TASK_NAMESPACE_HIERARCHY="' + ' '.join(self.jobconfig['namespace hierarchy']) + '"') BUFFER.write("\nexport CYLC_TASK_TRY_NUMBER=" + str(self.jobconfig['try number'])) BUFFER.write("\nexport CYLC_TASK_COMMS_METHOD=" + comms) BUFFER.write("\nexport CYLC_TASK_SSH_LOGIN_SHELL=" + str(use_login_shell)) BUFFER.write("\nexport CYLC_TASK_WORK_DIR=" + task_work_dir) BUFFER.write( "\nexport CYLC_TASK_WORK_PATH=$CYLC_TASK_WORK_DIR") # DEPRECATED
def __init__( self, task_id, suite, jobconfig, submit_num ): self.jobconfig = jobconfig self.task_id = task_id self.suite = suite self.logfiles = jobconfig.get( 'log files' ) self.job_submit_command_template = jobconfig.get('command template') # Local job script path: append submit number. # (used by both local and remote tasks) tag = task_id + TaskID.DELIM + submit_num gcfg = get_global_cfg() self.local_jobfile_path = os.path.join( \ gcfg.get_derived_host_item( self.suite, 'suite job log directory' ), tag ) # The directory is created in config.py self.logfiles.add_path( self.local_jobfile_path ) task_host = jobconfig.get('task host') task_owner = jobconfig.get('task owner') self.remote_shell_template = gcfg.get_host_item( 'remote shell template', task_host, task_owner ) if is_remote_host(task_host) or is_remote_user(task_owner): # REMOTE TASK OR USER ACCOUNT SPECIFIED FOR TASK - submit using ssh self.local = False if task_owner: self.task_owner = task_owner else: self.task_owner = None if task_host: self.task_host = task_host else: self.task_host = socket.gethostname() self.remote_jobfile_path = os.path.join( \ gcfg.get_derived_host_item( self.suite, 'suite job log directory', self.task_host, self.task_owner ), tag ) # Remote log files self.stdout_file = self.remote_jobfile_path + ".out" self.stderr_file = self.remote_jobfile_path + ".err" # Used in command construction: self.jobfile_path = self.remote_jobfile_path # Record paths of remote log files for access by gui if True: # by ssh URL url_prefix = self.task_host if self.task_owner: url_prefix = self.task_owner + "@" + url_prefix self.logfiles.add_path( url_prefix + ':' + self.stdout_file) self.logfiles.add_path( url_prefix + ':' + self.stderr_file) else: # CURRENTLY DISABLED: # If the remote and suite hosts see a common filesystem, or # if the remote task is really just a local task with a # different owner, we could just use local filesystem access. # But to use this: (a) special namespace config would be # required to indicate we have a common filesystem, and # (b) we'd need to consider how the log directory can be # specified (for example use of '$HOME' as for remote # task use would not work here as log file access is by # gui under the suite owner account. self.logfiles.add_path( self.stdout_file ) self.logfiles.add_path( self.stderr_file ) else: # LOCAL TASKS self.local = True self.task_owner = None # Used in command construction: self.jobfile_path = self.local_jobfile_path # Local stdout and stderr log file paths: self.stdout_file = self.local_jobfile_path + ".out" self.stderr_file = self.local_jobfile_path + ".err" # interpolate environment variables in extra logs for idx in range( 0, len( self.logfiles.paths )): self.logfiles.paths[idx] = expandvars( self.logfiles.paths[idx] ) # Record paths of local log files for access by gui self.logfiles.add_path( self.stdout_file) self.logfiles.add_path( self.stderr_file) # set some defaults that can be overridden by derived classes self.jobconfig[ 'directive prefix' ] = None self.jobconfig[ 'directive final' ] = "# FINAL DIRECTIVE" self.jobconfig[ 'directive connector' ] = " " # overrideable methods self.set_directives() self.set_scripting() self.set_environment()
def __init__(self, task_id, suite, jobconfig, submit_num): self.jobconfig = jobconfig self.task_id = task_id self.suite = suite self.logfiles = jobconfig.get('log files') self.job_submit_command_template = jobconfig.get('command template') # Local job script path: append submit number. # (used by both local and remote tasks) tag = task_id + TaskID.DELIM + submit_num gcfg = get_global_cfg() self.local_jobfile_path = os.path.join( \ gcfg.get_derived_host_item( self.suite, 'suite job log directory' ), tag ) # The directory is created in config.py self.logfiles.add_path(self.local_jobfile_path) task_host = jobconfig.get('task host') task_owner = jobconfig.get('task owner') self.remote_shell_template = gcfg.get_host_item( 'remote shell template', task_host, task_owner) if is_remote_host(task_host) or is_remote_user(task_owner): # REMOTE TASK OR USER ACCOUNT SPECIFIED FOR TASK - submit using ssh self.local = False if task_owner: self.task_owner = task_owner else: self.task_owner = None if task_host: self.task_host = task_host else: self.task_host = socket.gethostname() self.remote_jobfile_path = os.path.join( \ gcfg.get_derived_host_item( self.suite, 'suite job log directory', self.task_host, self.task_owner ), tag ) # Remote log files self.stdout_file = self.remote_jobfile_path + ".out" self.stderr_file = self.remote_jobfile_path + ".err" # Used in command construction: self.jobfile_path = self.remote_jobfile_path # Record paths of remote log files for access by gui if True: # by ssh URL url_prefix = self.task_host if self.task_owner: url_prefix = self.task_owner + "@" + url_prefix self.logfiles.add_path(url_prefix + ':' + self.stdout_file) self.logfiles.add_path(url_prefix + ':' + self.stderr_file) else: # CURRENTLY DISABLED: # If the remote and suite hosts see a common filesystem, or # if the remote task is really just a local task with a # different owner, we could just use local filesystem access. # But to use this: (a) special namespace config would be # required to indicate we have a common filesystem, and # (b) we'd need to consider how the log directory can be # specified (for example use of '$HOME' as for remote # task use would not work here as log file access is by # gui under the suite owner account. self.logfiles.add_path(self.stdout_file) self.logfiles.add_path(self.stderr_file) else: # LOCAL TASKS self.local = True self.task_owner = None # Used in command construction: self.jobfile_path = self.local_jobfile_path # Local stdout and stderr log file paths: self.stdout_file = self.local_jobfile_path + ".out" self.stderr_file = self.local_jobfile_path + ".err" # interpolate environment variables in extra logs for idx in range(0, len(self.logfiles.paths)): self.logfiles.paths[idx] = expandvars(self.logfiles.paths[idx]) # Record paths of local log files for access by gui self.logfiles.add_path(self.stdout_file) self.logfiles.add_path(self.stderr_file) # set some defaults that can be overridden by derived classes self.jobconfig['directive prefix'] = None self.jobconfig['directive final'] = "# FINAL DIRECTIVE" self.jobconfig['directive connector'] = " " # overrideable methods self.set_directives() self.set_scripting() self.set_environment()
def __init__(self, hosts=None, owner=None, poll_interval=None): gobject.threads_init() set_exception_hook_dialog("cylc gsummary") setup_icons() if not hosts: gcfg = get_global_cfg() try: hosts = gcfg.cfg["suite host scanning"]["hosts"] except KeyError: hosts = ["localhost"] self.hosts = hosts if owner is None: owner = user self.owner = owner self.window = gtk.Window() self.window.set_title("cylc gsummary") self.window.set_icon(get_icon()) self.vbox = gtk.VBox() self.vbox.show() self.usercfg = config().cfg self.theme_name = self.usercfg['use theme'] self.theme = self.usercfg['themes'][self.theme_name] self.dots = DotMaker(self.theme) suite_treemodel = gtk.TreeStore(*([str, str, bool, str, int] + [str] * 20)) self._prev_tooltip_location_id = None self.suite_treeview = gtk.TreeView(suite_treemodel) # Construct the host column. host_name_column = gtk.TreeViewColumn("Host") cell_text_host = gtk.CellRendererText() host_name_column.pack_start(cell_text_host, expand=False) host_name_column.set_cell_data_func( cell_text_host, self._set_cell_text_host) host_name_column.set_sort_column_id(0) host_name_column.set_visible(False) # Construct the suite name column. suite_name_column = gtk.TreeViewColumn("Suite") cell_text_name = gtk.CellRendererText() suite_name_column.pack_start(cell_text_name, expand=False) suite_name_column.set_cell_data_func( cell_text_name, self._set_cell_text_name) suite_name_column.set_sort_column_id(1) # Construct the suite title column. suite_title_column = gtk.TreeViewColumn("Title") cell_text_title = gtk.CellRendererText() suite_title_column.pack_start(cell_text_title, expand=False) suite_title_column.set_cell_data_func( cell_text_title, self._set_cell_text_title) suite_title_column.set_sort_column_id(3) suite_title_column.set_visible(False) # Construct the update time column. time_column = gtk.TreeViewColumn("Updated") cell_text_time = gtk.CellRendererText() time_column.pack_start(cell_text_time, expand=False) time_column.set_cell_data_func( cell_text_time, self._set_cell_text_time) time_column.set_sort_column_id(4) time_column.set_visible(False) # Construct the status column. status_column = gtk.TreeViewColumn("Status") status_column.set_sort_column_id(5) for i in range(5, 25): cell_pixbuf_state = gtk.CellRendererPixbuf() status_column.pack_start(cell_pixbuf_state, expand=False) status_column.set_cell_data_func( cell_pixbuf_state, self._set_cell_pixbuf_state, i) self.suite_treeview.append_column(host_name_column) self.suite_treeview.append_column(suite_name_column) self.suite_treeview.append_column(suite_title_column) self.suite_treeview.append_column(time_column) self.suite_treeview.append_column(status_column) self.suite_treeview.show() if hasattr(self.suite_treeview, "set_has_tooltip"): self.suite_treeview.set_has_tooltip(True) try: self.suite_treeview.connect('query-tooltip', self._on_query_tooltip) except TypeError: # Lower PyGTK version. pass self.suite_treeview.connect("button-press-event", self._on_button_press_event) scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled_window.add(self.suite_treeview) scrolled_window.show() self.vbox.pack_start(scrolled_window, expand=True, fill=True) self.updater = SummaryAppUpdater(self.hosts, suite_treemodel, owner=self.owner, poll_interval=poll_interval) self.updater.start() self.window.add(self.vbox) self.window.connect("destroy", self._on_destroy_event) self.window.set_default_size(200, 100) self.suite_treeview.grab_focus() self.window.show()