def __init__(self, *args, **kwargs): self.command_log, self.message_log = [], [] DXExecDependencyInstaller.__init__(self, *args, **kwargs)
def test_dx_execdepends_installer(self): def get_edi(run_spec, job_desc=None): return TestEDI(executable_desc={"runSpec": run_spec}, job_desc=job_desc if job_desc else {}) def assert_cmd_ran(edi, regexp): self.assertRegexpMatches("\n".join(edi.command_log), regexp) def assert_log_contains(edi, regexp): self.assertRegexpMatches("\n".join(edi.message_log), regexp) with self.assertRaisesRegexp(AppInternalError, 'Expected field "runSpec" to be present'): DXExecDependencyInstaller({}, {}) with self.assertRaisesRegexp(AppInternalError, 'Expected field "name" to be present'): get_edi({"dependencies": [{"foo": "bar"}]}) edi = get_edi({ "dependencies": [{ "name": "foo", "package_manager": "cran", "version": "1.2.3" }] }) edi.install() assert_cmd_ran( edi, "R -e .+ install.packages.+devtools.+install_version.+foo.+version.+1.2.3" ) with self.assertRaisesRegexp(AppInternalError, 'does not have a "url" field'): get_edi( {"dependencies": [{ "name": "foo", "package_manager": "git" }]}) edi = get_edi({ "execDepends": [{ "name": "git" }], "dependencies": [{ "name": "tmux" }] }) edi.install() assert_cmd_ran( edi, "apt-get install --yes --no-install-recommends git tmux") edi = get_edi({}) edi.install() edi = get_edi({ "execDepends": [], "bundledDepends": [], "dependencies": [] }) edi.install() edi = get_edi({ "dependencies": [{ "name": "pytz", "package_manager": "pip", "version": "2014.7" }, { "name": "certifi", "package_manager": "pip", "stages": ["main"] }, { "name": "tmux", "package_manager": "apt" }, { "name": "rake", "package_manager": "gem", "version": "10.3.2" }, { "name": "nokogiri", "package_manager": "gem", "stages": ["main"] }, { "name": "Module::Provision", "package_manager": "cpan", "version": "0.36.1" }, { "name": "LWP::MediaTypes", "package_manager": "cpan" }, { "name": "RJSONIO", "package_manager": "cran" }, { "name": "plyr", "package_manager": "cran", "version": "1.8.1" }, { "name": "ggplot2", "package_manager": "cran", "stages": ["main"], "version": "1.0.1" }, { "name": "r1", "id": { "$dnanexus_link": "record-123" } }, { "name": "g1", "package_manager": "git", "url": "https://github.com/dnanexus/oauth2-demo" }, { "name": "g2", "package_manager": "git", "url": "https://github.com/dnanexus/bwa", "tag": "production", "destdir": "/tmp/ee-edi-test-bwa", "buld_commands": "echo build bwa here", "stages": ["main"] }] }) edi.install() assert_cmd_ran(edi, re.escape("pip install --upgrade pytz==2014.7 certifi")) assert_cmd_ran(edi, "apt-get install --yes --no-install-recommends tmux") assert_cmd_ran( edi, re.escape( "gem install rake --version 10.3.2 && gem install nokogiri")) assert_cmd_ran( edi, "R -e .+ install.packages.+\"RJSONIO\".+install_version.+\"ggplot2\".+version=\"1.0.1\"" ) assert_log_contains( edi, 'Skipping bundled dependency "r1" because it does not refer to a file' ) assert_cmd_ran( edi, re.escape( "cd $(mktemp -d) && git clone https://github.com/dnanexus/oauth2-demo" )) assert_cmd_ran( edi, "cd /tmp/ee-edi-test-bwa && git clone https://github.com/dnanexus/bwa" ) assert_cmd_ran(edi, "git checkout production") edi = get_edi({ "execDepends": [{ "name": "w00t", "stages": ["foo", "bar"] }, { "name": "f1", "id": { "$dnanexus_link": "file-123" }, "stages": ["xyzzt"] }] }) edi.install() self.assertNotRegexpMatches("\n".join(edi.command_log), "w00t") for name in "w00t", "f1": assert_log_contains( edi, "Skipping dependency {} because it is inactive in stage \(function\) main" .format(name)) edi = get_edi( {"execDepends": [{ "name": "git", "stages": ["foo", "bar"] }]}, job_desc={"function": "foo"}) edi.install() assert_cmd_ran(edi, "apt-get install --yes --no-install-recommends git")
def install_run_spec(exec_depends): run_spec = {"runSpec": {"execDepends": exec_depends}} job_desc = dxpy.get_handler(dxpy.JOB_ID).describe() dx_installer = DXExecDependencyInstaller(run_spec, job_desc) dx_installer.install()