Merge pull request #1824 from alicevision/dev/submitterJobTitles

[submitters] Add an option to update the job title on submitters
This commit is contained in:
Fabien Castan 2022-12-05 16:22:33 +01:00 committed by GitHub
commit ffca9c68e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 31 additions and 14 deletions

View file

@ -64,6 +64,10 @@ parser.add_argument('--forceCompute', help='Compute in all cases even if already
parser.add_argument('--submit', help='Submit on renderfarm instead of local computation.', parser.add_argument('--submit', help='Submit on renderfarm instead of local computation.',
action='store_true') action='store_true')
parser.add_argument("--submitLabel",
type=str,
default='{projectName} [Meshroom]',
help="Label of a node in the submitter")
parser.add_argument('--submitter', parser.add_argument('--submitter',
type=str, type=str,
default='SimpleFarm', default='SimpleFarm',
@ -193,7 +197,7 @@ if args.submit:
if not args.save: if not args.save:
raise ValueError('Need to save the project to file to submit on renderfarm.') raise ValueError('Need to save the project to file to submit on renderfarm.')
# submit on renderfarm # submit on renderfarm
meshroom.core.graph.submit(args.save, args.submitter, toNode=args.toNode) meshroom.core.graph.submit(args.save, args.submitter, toNode=args.toNode, submitLabel=args.submitLabel)
elif args.compute: elif args.compute:
# find end nodes (None will compute all graph) # find end nodes (None will compute all graph)
toNodes = graph.findNodes(args.toNode) if args.toNode else None toNodes = graph.findNodes(args.toNode) if args.toNode else None

View file

@ -16,7 +16,11 @@ parser.add_argument('--submitter',
type=str, type=str,
default='SimpleFarm', default='SimpleFarm',
help='Execute job with a specific submitter.') help='Execute job with a specific submitter.')
parser.add_argument("--submitLabel",
type=str,
default='{projectName} [Meshroom]',
help="Label of a node in the submitter")
args = parser.parse_args() args = parser.parse_args()
meshroom.core.graph.submit(args.save, args.submitter, toNode=toNodes) meshroom.core.graph.submit(args.save, args.submitter, toNode=toNodes, submitLabel=args.submitLabel)

View file

@ -1513,7 +1513,7 @@ def executeGraph(graph, toNodes=None, forceCompute=False, forceStatus=False):
node.endSequence() node.endSequence()
def submitGraph(graph, submitter, toNodes=None): def submitGraph(graph, submitter, toNodes=None, submitLabel="{projectName}"):
nodesToProcess, edgesToProcess = graph.dfsToProcess(startNodes=toNodes) nodesToProcess, edgesToProcess = graph.dfsToProcess(startNodes=toNodes)
flowEdges = graph.flowEdges(startNodes=toNodes) flowEdges = graph.flowEdges(startNodes=toNodes)
edgesToProcess = set(edgesToProcess).intersection(flowEdges) edgesToProcess = set(edgesToProcess).intersection(flowEdges)
@ -1536,7 +1536,7 @@ def submitGraph(graph, submitter, toNodes=None):
submitter=submitter, allSubmitters=str(meshroom.core.submitters.keys()))) submitter=submitter, allSubmitters=str(meshroom.core.submitters.keys())))
try: try:
res = sub.submit(nodesToProcess, edgesToProcess, graph.filepath) res = sub.submit(nodesToProcess, edgesToProcess, graph.filepath, submitLabel=submitLabel)
if res: if res:
for node in nodesToProcess: for node in nodesToProcess:
node.submit() # update node status node.submit() # update node status
@ -1544,11 +1544,11 @@ def submitGraph(graph, submitter, toNodes=None):
logging.error("Error on submit : {}".format(e)) logging.error("Error on submit : {}".format(e))
def submit(graphFile, submitter, toNode=None): def submit(graphFile, submitter, toNode=None, submitLabel="{projectName}"):
""" """
Submit the given graph via the given submitter. Submit the given graph via the given submitter.
""" """
graph = loadGraph(graphFile) graph = loadGraph(graphFile)
toNodes = graph.findNodes(toNode) if toNode else None toNodes = graph.findNodes(toNode) if toNode else None
submitGraph(graph, submitter, toNodes) submitGraph(graph, submitter, toNodes, submitLabel=submitLabel)

View file

@ -9,7 +9,7 @@ class BaseSubmitter(BaseObject):
super(BaseSubmitter, self).__init__(parent) super(BaseSubmitter, self).__init__(parent)
self._name = name self._name = name
def submit(self, nodes, edges, filepath): def submit(self, nodes, edges, filepath, submitLabel="{projectName}"):
""" Submit the given graph """ Submit the given graph
Returns: Returns:
bool: whether the submission succeeded bool: whether the submission succeeded

View file

@ -367,7 +367,7 @@ class TaskManager(BaseObject):
raise RuntimeError("[{}] Impossible Process:\n" raise RuntimeError("[{}] Impossible Process:\n"
"There is no node able to be processed.".format(context)) "There is no node able to be processed.".format(context))
def submit(self, graph, submitter=None, toNodes=None): def submit(self, graph, submitter=None, toNodes=None, submitLabel="{projectName}"):
""" """
Nodes are send to the renderfarm Nodes are send to the renderfarm
:param graph: :param graph:
@ -422,7 +422,7 @@ class TaskManager(BaseObject):
logging.info("Edges to process: {}".format(edgesToProcess)) logging.info("Edges to process: {}".format(edgesToProcess))
try: try:
res = sub.submit(nodesToProcess, edgesToProcess, graph.filepath) res = sub.submit(nodesToProcess, edgesToProcess, graph.filepath, submitLabel=submitLabel)
if res: if res:
for node in nodesToProcess: for node in nodesToProcess:
node.destroyed.connect(lambda obj=None, name=node.name: self.onNodeDestroyed(obj, name)) node.destroyed.connect(lambda obj=None, name=node.name: self.onNodeDestroyed(obj, name))
@ -436,12 +436,12 @@ class TaskManager(BaseObject):
except Exception as e: except Exception as e:
logging.error("Error on submit : {}".format(e)) logging.error("Error on submit : {}".format(e))
def submitFromFile(self, graphFile, submitter, toNode=None): def submitFromFile(self, graphFile, submitter, toNode=None, submitLabel="{projectName}"):
""" """
Submit the given graph via the given submitter. Submit the given graph via the given submitter.
""" """
graph = meshroom.core.graph.loadGraph(graphFile) graph = meshroom.core.graph.loadGraph(graphFile)
self.submit(graph, submitter, toNode) self.submit(graph, submitter, toNode, submitLabel=submitLabel)
def getAlreadySubmittedChunks(self, nodes): def getAlreadySubmittedChunks(self, nodes):
""" """

View file

@ -83,8 +83,11 @@ class SimpleFarmSubmitter(BaseSubmitter):
**arguments) **arguments)
return task return task
def submit(self, nodes, edges, filepath): def submit(self, nodes, edges, filepath, submitLabel="{projectName}"):
name = os.path.splitext(os.path.basename(filepath))[0] + ' [Meshroom]'
projectName = os.path.splitext(os.path.basename(filepath))[0]
name = submitLabel.format(projectName=projectName)
comment = filepath comment = filepath
nbFrames = max([node.size for node in nodes]) nbFrames = max([node.size for node in nodes])

View file

@ -85,6 +85,7 @@ class MeshroomApp(QApplication):
parser.add_argument('-p', '--pipeline', metavar="FILE.mg/" + "/".join(meshroom.core.pipelineTemplates), type=str, parser.add_argument('-p', '--pipeline', metavar="FILE.mg/" + "/".join(meshroom.core.pipelineTemplates), type=str,
default=os.environ.get("MESHROOM_DEFAULT_PIPELINE", "photogrammetry"), default=os.environ.get("MESHROOM_DEFAULT_PIPELINE", "photogrammetry"),
help='Override the default Meshroom pipeline with this external or template graph.') help='Override the default Meshroom pipeline with this external or template graph.')
parser.add_argument("--submitLabel", metavar='SUBMITLABEL', type=str, help="Label of a node in the submitter", default='{projectName} [Meshroom]')
parser.add_argument("--verbose", help="Verbosity level", default='warning', parser.add_argument("--verbose", help="Verbosity level", default='warning',
choices=['fatal', 'error', 'warning', 'info', 'debug', 'trace'],) choices=['fatal', 'error', 'warning', 'info', 'debug', 'trace'],)
@ -135,6 +136,7 @@ class MeshroomApp(QApplication):
self._undoStack = commands.UndoStack(self) self._undoStack = commands.UndoStack(self)
self._taskManager = TaskManager(self) self._taskManager = TaskManager(self)
r = Reconstruction(undoStack=self._undoStack, taskManager=self._taskManager, defaultPipeline=args.pipeline, parent=self) r = Reconstruction(undoStack=self._undoStack, taskManager=self._taskManager, defaultPipeline=args.pipeline, parent=self)
r.setSubmitLabel(args.submitLabel)
self.engine.rootContext().setContextProperty("_reconstruction", r) self.engine.rootContext().setContextProperty("_reconstruction", r)
# those helpers should be available from QML Utils module as singletons, but: # those helpers should be available from QML Utils module as singletons, but:

View file

@ -278,6 +278,7 @@ class UIGraph(QObject):
self._selectedNodes = QObjectListModel(parent=self) self._selectedNodes = QObjectListModel(parent=self)
self._hoveredNode = None self._hoveredNode = None
self.submitLabel = "{projectName}"
self.computeStatusChanged.connect(self.updateLockedUndoStack) self.computeStatusChanged.connect(self.updateLockedUndoStack)
def setGraph(self, g): def setGraph(self, g):
@ -457,7 +458,7 @@ class UIGraph(QObject):
self.save() # graph must be saved before being submitted self.save() # graph must be saved before being submitted
self._undoStack.clear() # the undo stack must be cleared self._undoStack.clear() # the undo stack must be cleared
node = [node] if node else None node = [node] if node else None
self._taskManager.submit(self._graph, os.environ.get('MESHROOM_DEFAULT_SUBMITTER', ''), node) self._taskManager.submit(self._graph, os.environ.get('MESHROOM_DEFAULT_SUBMITTER', ''), node, submitLabel=self.submitLabel)
def updateGraphComputingStatus(self): def updateGraphComputingStatus(self):
# update graph computing status # update graph computing status

View file

@ -461,6 +461,9 @@ class Reconstruction(UIGraph):
def setDefaultPipeline(self, defaultPipeline): def setDefaultPipeline(self, defaultPipeline):
self._defaultPipeline = defaultPipeline self._defaultPipeline = defaultPipeline
def setSubmitLabel(self, submitLabel):
self.submitLabel = submitLabel
def initActiveNodes(self): def initActiveNodes(self):
# Create all possible entries # Create all possible entries
for category, _ in self.activeNodeCategories.items(): for category, _ in self.activeNodeCategories.items():