def _check_plugins(self): """Checks through all plug-ins that are currently in use (according to Maya) by the scene. We compile a list of those that we both support and should not ignore and return for inclusion in the pre-render script plug-in loading. TODO: This has been temporarily disabled because some of the plug-ins were causing errors in Maya on the render nodes. Need to investigate and add the culprits to the ignore list if necessary. """ try: with open( os.path.join(os.environ['AZUREBATCH_TOOLS'], "supported_plugins.json"), 'r') as plugins: supported_plugins = json.load(plugins) with open( os.path.join(os.environ['AZUREBATCH_TOOLS'], "ignored_plugins.json"), 'r') as plugins: ignored_plugins = json.load(plugins) except EnvironmentError: self._log.warning("Unable to load supported plugins") return [] loaded_plugins = maya.plugins(query=True, listPlugins=True) unsupported_plugins = [p for p in loaded_plugins \ if p not in supported_plugins and p not in ignored_plugins] if unsupported_plugins: warning = ( "The following plug-ins are used in the scene, but are not " "yet supported.\nRendering may be affected.\n") for plugin in unsupported_plugins: warning += plugin + "\n" options = ['Continue', 'Cancel'] answer = maya.confirm(warning, options) if answer == options[-1]: raise CancellationException("Submission Aborted") return []
def __call__(self, data, total): self.queue.put(self.bar.is_cancelled) if self.bar.done: raise CancellationException("File upload cancelled") progress = float(data) / float(total) * 100 self.log.debug(str(progress) + " " + str(self.progress)) if int(progress) > self.progress: self.progress = int(progress) self.queue.put(lambda: self.command(progress))
def is_cancelled(self): """Check whether process has been cancelled. :returns: True if cancelled else False. """ if maya.progress_bar(self._progress, query=True, isCancelled=True): self.done = True self.end() raise CancellationException("File upload cancelled") self._log.debug("not cancelled")
def test_submission_submit(self, mock_maya, mock_utils): def call(func, *args, **kwargs): self.assertTrue(callable(func)) return func(*args, **kwargs) mock_prog = mock.create_autospec(ProgressBar) mock_prog.is_cancelled.return_value = False mock_utils.ProgressBar.return_value = mock_prog mock_utils.format_scene_path.return_value = "test_file_path" mock_utils.build_template_filename.side_effect = azurebatchutils.build_template_filename self.mock_self._configure_pool = lambda t: AzureBatchSubmission._configure_pool( self.mock_self, t) self.mock_self._submit_threads = lambda: 6 self.mock_self._check_plugins.return_value = [] self.mock_self._get_os_flavor.return_value = OperatingSystem.windows self.mock_self.pool_manager.create_auto_pool.return_value = { 'autoPool': 'auto-pool' } self.mock_self.pool_manager.create_pool.return_value = { 'poolId': 'new-pool' } self.mock_self.env_manager.get_environment_settings.return_value = [{ 'name': 'foo', 'value': 'bar' }] self.mock_self.renderer = mock.Mock(render_engine='arnold') self.mock_self.renderer.get_jobdata.return_value = ("a", "b") self.mock_self.renderer.get_params.return_value = {"foo": "bar"} self.mock_self.renderer.get_title.return_value = "job name" self.mock_self._get_task_container_image.return_value = "containerImage" self.mock_self._call = call mock_job = mock.create_autospec(models.ExtendedJobParameter) self.mock_self.batch.job.jobparameter_from_json.return_value = mock_job self.mock_self.asset_manager.upload.return_value = ({ "project": "files", "path_map": "maps", "thumb_script": "thumbs", "workspace": "workspace" }, mock_prog) self.mock_self.asset_manager.generate_sas_token.return_value = "0123456789ABCDEF" self.mock_self.batch.threads = 6 mock_maya.about.return_value = "2017" self.mock_self.ui.get_pool.return_value = {1: (4, 4)} AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.error.call_count, 0) self.mock_self.renderer.disable.assert_called_with(True) self.mock_self.pool_manager.create_auto_pool.assert_called_with( (4, 4), "job name") self.mock_self.batch.job.add.assert_called_with(mock_job) self.mock_self.batch.job.jobparameter_from_json.assert_called_with({ 'commonEnvironmentSettings': [{ 'name': 'foo', 'value': 'bar' }], 'poolInfo': { 'autoPool': 'auto-pool' }, 'displayName': 'job name', 'id': mock.ANY, 'applicationTemplateInfo': { 'parameters': { 'taskContainerImageName': 'containerImage', 'sceneFile': 'test_file_path', 'outputs': mock.ANY, 'assetScript': 'maps', 'foo': 'bar', 'projectData': 'files', 'thumbScript': 'thumbs', 'storageURL': '0123456789ABCDEF', 'workspace': 'workspace' }, 'filePath': os.path.join(os.environ['AZUREBATCH_TEMPLATES'], 'containers', 'arnold-2017-windows.json') }, 'metadata': [{ 'name': 'JobType', 'value': 'Maya' }] }) self.mock_self.ui.get_pool.return_value = {2: 4} AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.error.call_count, 0) self.mock_self.renderer.disable.assert_called_with(True) self.mock_self.batch.job.add.assert_called_with(mock_job) self.mock_self.batch.job.jobparameter_from_json.assert_called_with({ 'commonEnvironmentSettings': [{ 'name': 'foo', 'value': 'bar' }], 'poolInfo': { 'poolId': '4' }, 'displayName': 'job name', 'id': mock.ANY, 'applicationTemplateInfo': { 'parameters': { 'taskContainerImageName': 'containerImage', 'sceneFile': 'test_file_path', 'outputs': mock.ANY, 'assetScript': 'maps', 'foo': 'bar', 'projectData': 'files', 'thumbScript': 'thumbs', 'storageURL': '0123456789ABCDEF', 'workspace': 'workspace' }, 'filePath': os.path.join(os.environ['AZUREBATCH_TEMPLATES'], 'containers', 'arnold-2017-windows.json') }, 'metadata': [{ 'name': 'JobType', 'value': 'Maya' }] }) self.mock_self._check_outputs.side_effect = ValueError("No camera") AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.error.call_count, 1) self.mock_self._check_outputs.side_effect = None self.mock_self.ui.get_pool.return_value = {3: (4, 4)} AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.error.call_count, 1) self.mock_self.renderer.disable.assert_called_with(True) self.mock_self.batch.job.add.assert_called_with(mock_job) self.mock_self.batch.job.add.call_count = 0 self.mock_self.pool_manager.create_pool.assert_called_with((4, 4), 'job name') mock_prog.is_cancelled.side_effect = CancellationException("cancelled") AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.info.call_count, 4) self.mock_self.renderer.disable.assert_called_with(True) self.assertEqual(self.mock_self.batch.job.add.call_count, 0) mock_prog.is_cancelled.side_effect = None self.mock_self.pool_manager.create_pool.side_effect = ValueError( "Bad data") AzureBatchSubmission.submit(self.mock_self) self.assertEqual(mock_maya.error.call_count, 2) self.mock_self.renderer.disable.assert_called_with(True) self.assertEqual(self.mock_self.batch.job.add.call_count, 0)