summaryrefslogtreecommitdiff
path: root/docs/development/architecture.md
blob: aceda08cdab3f265106812b491e2afc07fe5c9a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Development Architecture (Proposed)

## Goals
- Strong separation of concerns (transport, domain, specs, utils)
- Backward compatibility for 0.3.0 via shims
- Clear public API surface and internal boundaries
- Minimal maintenance burden for a public, official SDK

## Source Layout (file tree)
```
pyvyos/
  __init__.py            # public API exports (VyDevice, ApiResponse)
  core/                  # internal, stable layers
    __init__.py
    rest_client.py       # RestClient, ApiResponse (transport layer)
    device.py            # VyDevice (domain layer)
  specs/                 # optional Pydantic models (validation)
    __init__.py
    models.py            # base models (ApiRequest/Response)
    commands/            # split by responsibility
      __init__.py
      configure.py       # set, delete, multiple_op
      retrieve.py        # show_config, return_values
      config_file.py     # save, load (path: [])
      show.py            # show
      generate.py        # generate
      reset.py           # reset
      system.py          # reboot, poweroff
      image.py           # add, delete
  utils/                 # reusable helpers (no side effects)
    __init__.py
    json.py              # safe_json, redact_key
    http.py              # timeouts, retries (future)
    paths.py             # path builder helpers
    ids.py               # request_id helpers
  exceptions.py          # typed exceptions (SDKError, HttpError, ApiError)
  types.py               # public typing aliases if needed
  device.py              # shim re-export (compat)
  rest.py                # shim re-export (compat)
  vyos_api/              # JSON specs (docs/reference, optional at runtime)
```

## Layers & Responsibilities
- Transport (core.rest_client): HTTP, payload assembly, response validation
- Domain (core.device): high-level methods (configure, show, reset, etc.)
- Specs (specs.*): optional Pydantic models to validate requests/answers
- Utils: pure helpers (formatting, ids, path building)
- Shims (device.py, rest.py): ensure 0.3.0 compatibility

## Public API Surface
- `from pyvyos import VyDevice, ApiResponse`
- Stable imports; internal moves hidden by shims

## Compatibility Strategy
- Keep shims until 1.0.0
- Deprecation policy: warn after N minors, remove at next major
- Document migration path (import from `pyvyos.core` for new code)

## Data Validation Flow (optional)
- App builds `path` with utils.paths
- If validation enabled, use `specs.commands.*` models
- RestClient serializes payload and executes request
- Response validated (structure: success/data/error)

## Testing Strategy
- Unit: core.rest_client and core.device isolated via monkeypatch
- Contract: JSON fixtures mirror VyOS responses
- E2E (future): optional with test VyOS VM

## Packaging
- Include `vyos_api/` only if needed at runtime
- Otherwise treat it as docs/reference, not required by the package

## Naming & Conventions
- Use underscores `_` in file and module names
- One responsibility per module (keep files small)
- Typed public APIs, specific exceptions, no prints (only logging)