Пример #1
0
def test_agent_process(data_module):
    project = data.Project(name="test")
    yield project.insert()

    env = data.Environment(name="dev",
                           project=project.id,
                           repo_url="",
                           repo_branch="")
    yield env.insert()

    agent_proc = data.AgentProcess(hostname="testhost",
                                   environment=env.id,
                                   first_seen=datetime.datetime.now(),
                                   last_seen=datetime.datetime.now(),
                                   sid=uuid.uuid4())
    yield agent_proc.insert()

    agi1 = data.AgentInstance(process=agent_proc.id, name="agi1", tid=env.id)
    yield agi1.insert()
    agi2 = data.AgentInstance(process=agent_proc.id, name="agi2", tid=env.id)
    yield agi2.insert()

    agent = data.Agent(environment=env.id,
                       name="agi1",
                       last_failover=datetime.datetime.now(),
                       paused=False,
                       primary=agi1.id)
    agent = yield agent.insert()

    agents = yield data.Agent.get_list()
    assert len(agents) == 1
    agent = agents[0]

    primary_instance = yield data.AgentInstance.get_by_id(agent.primary)
    primary_process = yield data.AgentProcess.get_by_id(
        primary_instance.process)
    assert primary_process.id == agent_proc.id
Пример #2
0
def test_primary_selection(motor):
    data.use_motor(motor)

    env = data.Environment(name="testenv", project=uuid4())
    yield env.insert()

    yield data.Agent(environment=env.id, name="agent1", paused=True).insert()
    yield data.Agent(environment=env.id, name="agent2", paused=False).insert()
    yield data.Agent(environment=env.id, name="agent3", paused=False).insert()

    server = Mock()
    futures = Collector()
    server.add_future.side_effect = futures
    am = AgentManager(server, False)

    @gen.coroutine
    def assert_agent(name: str, state: str, sid: UUID):
        agent = yield data.Agent.get(env.id, name)

        assert agent.get_status() == state
        if state == "paused":
            assert agent.primary is None
            assert agent.paused
        elif state == "down":
            assert agent.primary is None
            assert not agent.paused
        elif state == "up":
            assert agent.primary is not None
            agent_instance = yield data.AgentInstance.get_by_id(agent.primary)
            agent_proc = yield data.AgentProcess.get_by_id(
                agent_instance.process)
            assert agent_proc.sid == sid
            assert agent.get_status() == "up"

    @gen.coroutine
    def assert_agents(s1, s2, s3, sid1=None, sid2=None, sid3=None):
        yield assert_agent("agent1", s1, sid1)
        yield assert_agent("agent2", s2, sid2)
        yield assert_agent("agent3", s3, sid3)

    # one session
    ts1 = MockSession(uuid4(), env.id, ["agent1", "agent2"], "ts1")
    am.new_session(ts1)
    yield futures.proccess()
    assert len(am.sessions) == 1
    ts1.get_client().set_state.assert_called_with("agent2", True)
    ts1.get_client().reset_mock()
    yield assert_agents("paused", "up", "down", sid2=ts1.id)

    # alive
    am.seen(ts1, ["agent1", "agent2"])
    yield futures.proccess()
    assert len(am.sessions) == 1
    yield assert_agents("paused", "up", "down", sid2=ts1.id)

    # second session
    ts2 = MockSession(uuid4(), env.id, ["agent3", "agent2"], "ts2")
    am.new_session(ts2)
    yield futures.proccess()
    assert len(am.sessions) == 2
    ts2.get_client().set_state.assert_called_with("agent3", True)
    ts2.get_client().reset_mock()
    yield assert_agents("paused", "up", "up", sid2=ts1.id, sid3=ts2.id)

    # expire first
    am.expire(ts1)
    yield futures.proccess()
    assert len(am.sessions) == 1
    ts2.get_client().set_state.assert_called_with("agent2", True)
    ts2.get_client().reset_mock()
    yield assert_agents("paused", "up", "up", sid2=ts2.id, sid3=ts2.id)

    # expire second
    am.expire(ts2)
    yield futures.proccess()
    assert len(am.sessions) == 0
    yield assert_agents("paused", "down", "down")
Пример #3
0
def test_api(motor):
    data.use_motor(motor)

    env = data.Environment(name="testenv", project=uuid4())
    yield env.insert()
    env2 = data.Environment(name="testenv2", project=uuid4())
    yield env2.insert()
    yield data.Agent(environment=env.id, name="agent1", paused=True).insert()
    yield data.Agent(environment=env.id, name="agent2", paused=False).insert()
    yield data.Agent(environment=env.id, name="agent3", paused=False).insert()
    yield data.Agent(environment=env2.id, name="agent4", paused=False).insert()

    server = Mock()
    futures = Collector()
    server.add_future.side_effect = futures
    am = AgentManager(server, False)

    # one session
    ts1 = MockSession(uuid4(), env.id, ["agent1", "agent2"], "ts1")
    am.new_session(ts1)
    # second session
    ts2 = MockSession(uuid4(), env.id, ["agent3", "agent2"], "ts2")
    am.new_session(ts2)
    # third session
    env3 = uuid4()
    ts3 = MockSession(uuid4(), env3, ["agentx"], "ts3")
    am.new_session(ts3)

    yield futures.proccess()
    assert len(am.sessions) == 3

    code, all_agents = yield am.list_agent_processes(None, None)
    assert code == 200

    shouldbe = {
        'processes': [{
            'id':
            UNKWN,
            'first_seen':
            UNKWN,
            'expired':
            None,
            'hostname':
            'ts1',
            'last_seen':
            UNKWN,
            'endpoints': [{
                'id': UNKWN,
                'name': 'agent1',
                'process': UNKWN
            }, {
                'id': UNKWN,
                'name': 'agent2',
                'process': UNKWN
            }],
            'environment':
            env.id
        }, {
            'id':
            UNKWN,
            'first_seen':
            UNKWN,
            'expired':
            None,
            'hostname':
            'ts2',
            'last_seen':
            UNKWN,
            'endpoints': [{
                'id': UNKWN,
                'name': 'agent2',
                'process': UNKWN
            }, {
                'id': UNKWN,
                'name': 'agent3',
                'process': UNKWN
            }],
            'environment':
            env.id
        }, {
            'id':
            UNKWN,
            'first_seen':
            UNKWN,
            'expired':
            None,
            'hostname':
            'ts3',
            'last_seen':
            UNKWN,
            'endpoints': [{
                'id': UNKWN,
                'name': 'agentx',
                'process': UNKWN
            }],
            'environment':
            env3
        }]
    }

    assert_equal_ish(shouldbe, all_agents, ['hostname', 'name'])
    agentid = all_agents['processes'][0]['id']

    code, all_agents = yield am.list_agent_processes(env.id, None)
    assert code == 200

    shouldbe = {
        'processes': [{
            'id':
            UNKWN,
            'first_seen':
            UNKWN,
            'expired':
            None,
            'hostname':
            'ts1',
            'last_seen':
            UNKWN,
            'endpoints': [{
                'id': UNKWN,
                'name': 'agent1',
                'process': UNKWN
            }, {
                'id': UNKWN,
                'name': 'agent2',
                'process': UNKWN
            }],
            'environment':
            env.id
        }, {
            'id':
            UNKWN,
            'first_seen':
            UNKWN,
            'expired':
            None,
            'hostname':
            'ts2',
            'last_seen':
            UNKWN,
            'endpoints': [{
                'id': UNKWN,
                'name': 'agent3',
                'process': UNKWN
            }, {
                'id': UNKWN,
                'name': 'agent2',
                'process': UNKWN
            }],
            'environment':
            env.id
        }]
    }

    assert_equal_ish(shouldbe, all_agents)

    code, all_agents = yield am.list_agent_processes(env2.id, None)
    assert code == 200

    shouldbe = {'processes': []}

    assert_equal_ish(shouldbe, all_agents)

    @gen.coroutine
    def dummy_status():
        return Result(False, 200, "X")

    ts1.get_client().get_status.side_effect = dummy_status
    report = yield am.get_agent_process_report(agentid)
    assert (200, "X") == report

    report = yield am.get_agent_process_report(uuid4())
    assert 404 == report[0]

    code, all_agents = yield am.list_agents(None)
    assert code == 200
    shouldbe = {
        'agents': [{
            'name': 'agent1',
            'paused': True,
            'last_failover': '',
            'primary': '',
            'environment': env.id,
            "state": "paused"
        }, {
            'name': 'agent2',
            'paused': False,
            'last_failover': UNKWN,
            'primary': UNKWN,
            'environment': env.id,
            "state": "up"
        }, {
            'name': 'agent3',
            'paused': False,
            'last_failover': UNKWN,
            'primary': UNKWN,
            'environment': env.id,
            "state": "up"
        }, {
            'name': 'agent4',
            'paused': False,
            'last_failover': '',
            'primary': '',
            'environment': env2.id,
            "state": "down"
        }]
    }
    assert_equal_ish(shouldbe, all_agents, ['name'])

    code, all_agents = yield am.list_agents(env2.id)
    assert code == 200
    shouldbe = {
        'agents': [{
            'name': 'agent4',
            'paused': False,
            'last_failover': '',
            'primary': '',
            'environment': env2.id,
            "state": "down"
        }]
    }
    assert_equal_ish(shouldbe, all_agents)
Пример #4
0
 def create_default_agent(self, env: data.Environment, nodename: str):
     saved = data.Agent(environment=env.id, name=nodename, paused=False)
     yield saved.insert()
     yield self.verify_reschedule(env, [nodename])
     return saved