Exemple #1
0
    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 []
Exemple #2
0
 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)