def test_purge(sock_dir, job1): """ Test if it purge all the jobs currently scheduled on the minion. """ _schedule_data = {"job1": job1} with patch.dict(schedule.__opts__, {"schedule": {}, "sock_dir": sock_dir}): mock = MagicMock(return_value=True) with patch.dict(schedule.__salt__, {"event.fire": mock}): _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): with patch.object(schedule, "list_", MagicMock(return_value=_schedule_data)): assert schedule.purge() == { "comment": ["Deleted job: job1 from schedule."], "changes": { "job1": "removed" }, "result": True, } _schedule_data = {"job1": job1, "job2": job1, "job3": job1} comm = [ "Deleted job: job1 from schedule.", "Deleted job: job2 from schedule.", "Deleted job: job3 from schedule.", ] changes = {"job1": "removed", "job2": "removed", "job3": "removed"} schedule_config_file = schedule._get_schedule_config_file() with patch.dict(schedule.__opts__, { "schedule": { "job1": "salt" }, "sock_dir": sock_dir }): with patch("salt.utils.files.fopen", mock_open(read_data="")) as fopen_mock: with patch.object(schedule, "list_", MagicMock(return_value=_schedule_data)): ret = schedule.purge(offline=True) assert any([True for item in comm if item in ret["comment"]]) assert ret["changes"] == changes assert ret["result"] _call = call(b"schedule: {}\n") write_calls = fopen_mock.filehandles[schedule_config_file][ 0].write._mock_mock_calls assert _call in write_calls
def test_delete(sock_dir, job1): """ Test if it delete a job from the minion's schedule. """ with patch.dict(schedule.__opts__, {"schedule": {}, "sock_dir": sock_dir}): mock = MagicMock(return_value=True) with patch.dict(schedule.__salt__, {"event.fire": mock}): _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): assert schedule.delete("job1") == { "comment": "Job job1 does not exist.", "changes": {}, "result": False, } _schedule_data = {"job1": job1} comm = "Deleted Job job1 from schedule." changes = {"job1": "removed"} schedule_config_file = schedule._get_schedule_config_file() with patch.dict(schedule.__opts__, { "schedule": { "job1": "salt" }, "sock_dir": sock_dir }): with patch("salt.utils.files.fopen", mock_open(read_data="")) as fopen_mock: with patch.object(schedule, "list_", MagicMock(return_value=_schedule_data)): assert schedule.delete("job1", offline="True") == { "comment": comm, "changes": changes, "result": True, } _call = call(b"schedule: {}\n") write_calls = fopen_mock.filehandles[schedule_config_file][ 0].write._mock_mock_calls assert _call in write_calls
def test_modify(sock_dir, job1): """ Test if modifying job to the schedule. """ current_job1 = { "function": "salt", "seconds": "3600", "maxrunning": 1, "name": "job1", "enabled": True, "jid_include": True, } new_job1 = { "function": "salt", "seconds": "60", "maxrunning": 1, "name": "job1", "enabled": True, "jid_include": True, } comm1 = "Modified job: job1 in schedule." changes1 = { "job1": { "new": salt.utils.odict.OrderedDict(new_job1), "old": salt.utils.odict.OrderedDict(current_job1), } } new_job4 = { "function": "test.version", "seconds": "3600", "maxrunning": 1, "name": "job1", "enabled": True, "jid_include": True, } changes4 = { "job1": { "new": salt.utils.odict.OrderedDict(new_job4), "old": salt.utils.odict.OrderedDict(current_job1), } } expected1 = {"comment": comm1, "changes": changes1, "result": True} comm2 = ('Error: Unable to use "seconds", "minutes", "hours", ' 'or "days" with "when" option.') expected2 = {"comment": comm2, "changes": {}, "result": False} comm3 = 'Unable to use "when" and "cron" options together. Ignoring.' expected3 = {"comment": comm3, "changes": {}, "result": False} comm4 = "Job: job1 would be modified in schedule." expected4 = {"comment": comm4, "changes": changes4, "result": True} comm5 = "Job job2 does not exist in schedule." expected5 = {"comment": comm5, "changes": {}, "result": False} with patch.dict(schedule.__opts__, { "schedule": { "job1": current_job1 }, "sock_dir": sock_dir }): mock = MagicMock(return_value=True) with patch.dict(schedule.__salt__, {"event.fire": mock}): _ret_value = {"complete": True, "schedule": {"job1": current_job1}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): ret = schedule.modify("job1", seconds="60") assert "job1" in ret["changes"] assert "new" in ret["changes"]["job1"] assert "old" in ret["changes"]["job1"] for key in [ "maxrunning", "function", "seconds", "jid_include", "name", "enabled", ]: assert (ret["changes"]["job1"]["new"][key] == expected1["changes"]["job1"]["new"][key]) assert (ret["changes"]["job1"]["old"][key] == expected1["changes"]["job1"]["old"][key]) assert ret["comment"] == expected1["comment"] assert ret["result"] == expected1["result"] _ret_value = {"complete": True, "schedule": {"job1": current_job1}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): ret = schedule.modify("job1", function="test.ping", seconds=3600, when="2400") assert ret == expected2 _ret_value = {"complete": True, "schedule": {"job1": current_job1}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): ret = schedule.modify("job1", function="test.ping", when="2400", cron="2") assert ret == expected3 _ret_value = {"complete": True, "schedule": {"job1": current_job1}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): ret = schedule.modify("job1", function="test.version", test=True) assert "job1" in ret["changes"] assert "new" in ret["changes"]["job1"] assert "old" in ret["changes"]["job1"] for key in [ "maxrunning", "function", "jid_include", "name", "enabled", ]: assert (ret["changes"]["job1"]["new"][key] == expected4["changes"]["job1"]["new"][key]) assert (ret["changes"]["job1"]["old"][key] == expected4["changes"]["job1"]["old"][key]) assert ret["comment"] == expected4["comment"] assert ret["result"] == expected4["result"] _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): ret = schedule.modify("job2", function="test.version", test=True) assert ret == expected5 _schedule_data = {"job1": job1} comm = "Modified job: job1 in schedule." changes = {"job1": "removed"} changes = { "job1": { "new": OrderedDict([ ("function", "test.version"), ("maxrunning", 1), ("name", "job1"), ("enabled", True), ("jid_include", True), ]), "old": OrderedDict([ ("function", "test.ping"), ("maxrunning", 1), ("name", "job1"), ("jid_include", True), ("enabled", True), ]), } } schedule_config_file = schedule._get_schedule_config_file() with patch.dict(schedule.__opts__, { "schedule": { "job1": "salt" }, "sock_dir": sock_dir }): with patch("salt.utils.files.fopen", mock_open(read_data="")) as fopen_mock: with patch.object(schedule, "list_", MagicMock(return_value=_schedule_data)): ret = schedule.modify("job1", function="test.version", offline="True") assert ret["comment"] == comm assert ret["result"] assert all([ True for k, v in ret["changes"]["job1"]["old"].items() if v == changes["job1"]["old"][k] ]) assert all([ True for k, v in ret["changes"]["job1"]["new"].items() if v == changes["job1"]["new"][k] ]) _call = call( b"schedule:\n job1: {enabled: true, function: test.version, jid_include: true, maxrunning: 1,\n name: job1}\n" ) write_calls = fopen_mock.filehandles[schedule_config_file][ 0].write._mock_mock_calls assert _call in write_calls
def test_add(sock_dir): """ Test if it add a job to the schedule. """ comm1 = "Job job1 already exists in schedule." comm2 = ('Error: Unable to use "seconds", "minutes", "hours", ' 'or "days" with "when" or "cron" options.') comm3 = 'Unable to use "when" and "cron" options together. Ignoring.' comm4 = "Job: job2 would be added to schedule." with patch.dict(schedule.__opts__, { "schedule": { "job1": "salt" }, "sock_dir": sock_dir }): mock = MagicMock(return_value=True) with patch.dict(schedule.__salt__, {"event.fire": mock}): _ret_value = { "complete": True, "schedule": { "job1": { "salt": "salt" } } } with patch.object(SaltEvent, "get_event", return_value=_ret_value): assert schedule.add("job1") == { "comment": comm1, "changes": {}, "result": False, } _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): assert schedule.add("job2", function="test.ping", seconds=3600, when="2400") == { "comment": comm2, "changes": {}, "result": False } _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): assert schedule.add("job2", function="test.ping", when="2400", cron="2") == { "comment": comm3, "changes": {}, "result": False } _ret_value = {"complete": True, "schedule": {}} with patch.object(SaltEvent, "get_event", return_value=_ret_value): assert schedule.add("job2", function="test.ping", test=True) == { "comment": comm4, "changes": {}, "result": True, } schedule_config_file = schedule._get_schedule_config_file() comm1 = "Added job: job3 to schedule." changes1 = {"job3": "added"} with patch.dict(schedule.__opts__, { "schedule": { "job1": "salt" }, "sock_dir": sock_dir }): with patch("os.path.exists", MagicMock(return_value=True)): with patch("salt.utils.files.fopen", mock_open(read_data="")) as fopen_mock: assert schedule.add("job3", function="test.ping", seconds=3600, offline="True") == { "comment": comm1, "changes": changes1, "result": True } _call = call( b"schedule:\n job3: {function: test.ping, seconds: 3600, maxrunning: 1, name: job3, enabled: true,\n jid_include: true}\n" ) write_calls = fopen_mock.filehandles[schedule_config_file][ 1].write._mock_mock_calls assert _call in write_calls