def test_testconnections_envfix(mock_sendtossh): """ Test that the environment checking works. """ jobs = { "LongbowJob1": { "resource": "resource1", "env-fix": "false" }, "LongbowJob2": { "resource": "resource2", "env-fix": "false" }, "LongbowJob3": { "resource": "resource1", "env-fix": "false" } } mock_sendtossh.side_effect = sshfunc checkconnections(jobs) assert jobs["LongbowJob1"]["env-fix"] == "true" assert jobs["LongbowJob2"]["env-fix"] == "false" assert jobs["LongbowJob3"]["env-fix"] == "true"
def test_testconnections_single(mock_sendtossh): """ Test that the connection test is launched. """ jobs = { "LongbowJob1": { "resource": "resource1" } } checkconnections(jobs) assert mock_sendtossh.call_count == 2, "sendtossh should be called twice"
def test_testconnections_multiple(mock_sendtossh): """ Test that the connection test is run only for each host once. """ jobs = { "LongbowJob1": { "resource": "resource1" }, "LongbowJob2": { "resource": "resource2" }, "LongbowJob3": { "resource": "resource1" } } checkconnections(jobs) assert mock_sendtossh.call_count == 4, "should be called four times"
def test_testconnections_sshexcept(mock_sendtossh): """ Test to see that if the underlying SSH call fails, the resulting SSHError is passed up the chain. This is important! """ jobs = { "LongbowJob1": { "resource": "resource1" }, "LongbowJob2": { "resource": "resource2" }, "LongbowJob3": { "resource": "resource1" } } mock_sendtossh.side_effect = exceptions.SSHError("SSH Error", "output") with pytest.raises(exceptions.SSHError): checkconnections(jobs)
def longbow(jobs, parameters): """Entry point at the top level of the Longbow library. Being the top level method that makes calls on the Longbow library. This is a good place to link against Longbow if a developer does not want to link against the executable, or if low level linking is not needed or is over-kill. Required inputs are: parameters (dictionary): A dictionary containing the parameters and overrides from the command-line. """ # A failure at this level will result in jobs being killed off before # escalating the exception to trigger graceful exit. # Load configurations and initialise Longbow data structures. jobparams = configuration.processconfigs(parameters) # Copy to jobs so when exceptions are raised the structure is available. for param in jobparams: jobs[param] = jobparams[param] # Test all connection/s specified in the job configurations shellwrappers.checkconnections(jobs) # Test the hosts listed in the jobs configuration file have their # scheduler environments listed, if not then test and save them. scheduling.checkenv(jobs, parameters["hosts"]) # Test that for the applications listed in the job configuration # file are available and that the executable is present. if parameters["nochecks"] is False: applications.checkapp(jobs) # Process the jobs command line arguments and find files for # staging. applications.processjobs(jobs) # Create jobfile and add it to the list of files that needs # uploading. scheduling.prepare(jobs) # Stage all of the job files along with the scheduling script. staging.stage_upstream(jobs) # Submit all jobs. scheduling.submit(jobs) # Process the disconnect function. if parameters["disconnect"] is True: raise exceptions.DisconnectException # Monitor all jobs. scheduling.monitor(jobs) # Clean up all jobs staging.cleanup(jobs)