class TestCondaOperator(BaseTestCase): def setUp(self): super().setUp() self.conda = CondaOperator() @staticmethod def mock_popen(return_code, out_msg, err_msg=None): def popen(*args, **kwargs): stdout = kwargs.pop("stdout") stdout.write(out_msg) if err_msg: stderr = kwargs.pop("stderr") stderr.write(err_msg) return mock.Mock(wait=mock.Mock(return_value=return_code)) return mock.Mock(side_effect=popen) @mock.patch("polyaxon.deploy.operators.cmd_operator.subprocess") def test_conda(self, mock_subprocess): mock_subprocess.Popen = self.mock_popen(0, "bar") assert self.conda.execute(["install"]) == "bar" assert mock_subprocess.Popen.call_args[0][0] == ["conda", "install"] @mock.patch("polyaxon.deploy.operators.cmd_operator.subprocess") def test_conda_json(self, mock_subprocess): mock_subprocess.Popen = self.mock_popen(0, '{"foo": "bar"}') assert self.conda.execute(["env", "list", "--json"], is_json=True) == dict(foo="bar") assert mock_subprocess.Popen.call_args[0][0] == [ "conda", "env", "list", "--json", ] @mock.patch("polyaxon.deploy.operators.cmd_operator.subprocess") def test_conda_error(self, mock_subprocess): return_code = 1 stdout = "output" stderr = "error" mock_subprocess.Popen = self.mock_popen(return_code, stdout, stderr) with self.assertRaises(PolyaxonOperatorException) as exception: self.conda.execute(["run"]) self.assertEqual( exception.exception.message, "`conda` command ('conda', 'run') " "failed with exit status {}\nstdout:\n{}\nstderr:\n{}".format( return_code, stdout, stderr), )
def _run(ctx, name, owner, project_name, description, tags, specification, log, conda_env): conda = CondaOperator() # cmd = CmdOperator() if not conda.check(): raise PolyaxonException("Conda is required to run this command.") envs = conda.execute(["env", "list", "--json"], is_json=True) env_names = [os.path.basename(env) for env in envs["envs"]] project_env_name = _get_conda_env_name(conda_env) if project_env_name not in env_names: click.echo("Creating conda environment {}".format(project_env_name)) conda.execute( ["env", "create", "-n", project_env_name, "--file", conda_env], stream=True) cmd_bash, cmd_args = specification.run.get_container_cmd() cmd_args = ["source activate {}".format(project_env_name)] + cmd_args subprocess.Popen(cmd_bash + [" && ".join(cmd_args)], close_fds=True)
def setUp(self): super().setUp() self.conda = CondaOperator()