feat: implement DCOS source tree, tests, and build configuration

Complete implementation of the DCOS package including:
- 40+ Python source files across agents, communication, core, learning, memory, protocols, utils
- pyproject.toml build configuration
- 102 unit tests across all subsystems
- Fixed flake.nix (Python 3.12, proper dependencies, pyproject build)
- Fixed .woodpecker.yml (correct paths, removed silent-fail flags)
- Added .gitignore
- Cleared stale pytest cache
This commit is contained in:
Celes Renata
2026-08-02 03:29:55 -07:00
parent 38bb291a02
commit 57619860d5
157 changed files with 2742 additions and 10 deletions
+1
View File
@@ -0,0 +1 @@
"""Core subsystem tests."""
+37
View File
@@ -0,0 +1,37 @@
"""
Tests for ResourceAllocator.
"""
import pytest
from dcos.core.allocator import ResourceAllocator
class TestResourceAllocator:
def test_allocate(self):
alloc = ResourceAllocator()
assert alloc.allocate("agent_1", cpu=10.0, memory=256.0) is True
def test_allocate_over_limit(self):
alloc = ResourceAllocator()
# Total is 100 CPU, 1024 memory
assert alloc.allocate("agent_1", cpu=60.0, memory=512.0) is True
assert alloc.allocate("agent_2", cpu=50.0, memory=512.0) is False # over CPU
def test_release(self):
alloc = ResourceAllocator()
alloc.allocate("agent_1", cpu=10.0, memory=128.0)
assert alloc.release("agent_1") is True
assert alloc.release("nonexistent") is False
def test_utilization(self):
alloc = ResourceAllocator()
alloc.allocate("agent_1", cpu=25.0, memory=256.0)
util = alloc.utilization()
assert util["cpu"] == 0.25
assert util["memory"] == 0.25
def test_get_allocation(self):
alloc = ResourceAllocator()
alloc.allocate("agent_1", cpu=10.0, memory=128.0)
alloc_info = alloc.get_allocation("agent_1")
assert alloc_info["cpu"] == 10.0
+46
View File
@@ -0,0 +1,46 @@
"""
Tests for the AgentRegistry.
"""
import pytest
from dcos.core.registry import AgentRegistry, AgentRecord
class TestAgentRegistry:
def test_register_and_get(self):
registry = AgentRegistry()
record = AgentRecord(agent_id="a1", name="test-agent", role="planner")
registry.register(record)
retrieved = registry.get("a1")
assert retrieved is not None
assert retrieved.name == "test-agent"
def test_unregister(self):
registry = AgentRegistry()
record = AgentRecord(agent_id="a2", name="removable", role="researcher")
registry.register(record)
removed = registry.unregister("a2")
assert removed is not None
assert registry.get("a2") is None
def test_find_by_role(self):
registry = AgentRegistry()
registry.register(AgentRecord(agent_id="a1", name="planner-1", role="planner"))
registry.register(AgentRecord(agent_id="a2", name="planner-2", role="planner"))
registry.register(AgentRecord(agent_id="a3", name="researcher", role="researcher"))
planners = registry.find_by_role("planner")
assert len(planners) == 2
def test_find_by_capability(self):
registry = AgentRegistry()
registry.register(AgentRecord(agent_id="a1", name="capable", role="planner", capabilities=["ml", "nlp"]))
registry.register(AgentRecord(agent_id="a2", name="other", role="researcher", capabilities=["search"]))
ml_agents = registry.find_by_capability("ml")
assert len(ml_agents) == 1
assert ml_agents[0].agent_id == "a1"
def test_count(self):
registry = AgentRegistry()
assert registry.count() == 0
registry.register(AgentRecord(agent_id="a1", name="only", role="planner"))
assert registry.count() == 1
+51
View File
@@ -0,0 +1,51 @@
"""
Tests for the TaskScheduler.
"""
import pytest
from dcos.core.scheduler import TaskScheduler, Task
class TestTaskScheduler:
def test_enqueue_dequeue(self):
scheduler = TaskScheduler()
task = Task(name="test", agent_id="agent_1", priority=5)
scheduler.enqueue(task)
dequeued = scheduler.dequeue()
assert dequeued is not None
assert dequeued.name == "test"
assert dequeued.status.name == "RUNNING"
def test_priority_ordering(self):
scheduler = TaskScheduler()
t1 = Task(name="low", agent_id="a1", priority=1)
t2 = Task(name="high", agent_id="a2", priority=10)
scheduler.enqueue(t1)
scheduler.enqueue(t2)
first = scheduler.dequeue()
assert first is not None and first.name == "high"
def test_complete_task(self):
scheduler = TaskScheduler()
task = Task(name="done", agent_id="a1")
scheduler.enqueue(task)
dequeued = scheduler.dequeue()
assert dequeued is not None
result = scheduler.complete(dequeued.id)
assert result is True
def test_dependency_wait(self):
scheduler = TaskScheduler()
dep = Task(name="dependency", agent_id="a1")
main = Task(name="main", agent_id="a2", depends_on=[dep.id])
scheduler.enqueue(dep)
scheduler.enqueue(main)
# Only dep should dequeue since main depends on dep
first = scheduler.dequeue()
assert first is not None and first.name == "dependency"
second = scheduler.dequeue()
assert second is None # main still blocked
def test_empty_queue(self):
scheduler = TaskScheduler()
assert scheduler.dequeue() is None