summaryrefslogtreecommitdiff
path: root/doc/roadmap.rst
blob: c75584f3a9471c2c236c2e09c490a0a4de7a4507 (plain) (blame)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
==========================================
 Roadmap and Architecture for NETCONF APK
==========================================


1.0 (2020 Q3)
=============

[X] Module management system
----------------------------

* [X] Track name/revision/namespace, and register with NSMAP

  * Namespace includes prefix, since this is standardised.  i.e.
    ns "urn:ietf:params:xml:ns:yang:ietf-interfaces" -> prefix "if:".

* [X] Track features implemented

* [X] Handle import-only modules

* [ ] Submodule support?  (possibly post-1.0)

* [X] Respond to state requests

* [X] Handle per-module RPC requests


The module management system will be the heart of ``ncserver``.  Similar to
modules in Charybdis/Atheme or GlorIRCd.  Each module will provide a piece of
functionality (in this case, implementation of a YANG module).  Each module
will have a callback for retrieving its relevant config and state information.

The module management system will be responsible for bookkeeping and also
implement the ietf-yang-library module itself.  This exposes the internal
bookkeeping to the NETCONF world for introspecting the server.

This also makes the server more customisable.  If a user does not care about
a specific YANG module, it can just be removed from the list to import.


Outstanding TBDs
````````````````
* None.

Resolved TBDs
`````````````
* The ``modules-state`` requires a ``module-set-id`` which represents the
  unique combination of YANG modules present and loaded in a NETCONF server.
  We have freedom to implement this however we like.  One thought is to take
  the strings of every module's namespace and sha512 the result.  Alternatively
  we could just use Python ``uuid`` to generate a new one on each server start,
  but this would also mean that tooling that caches modules would pull in all
  modules on every server restart.

  **Resolution**: We went with sha256 of a comma-separated list of Python
  module names.  This is expected to be the cleanest way to do this; it allows
  the implementation to provide the same ``module-set-id`` when modules stay
  the same, but also changes ``module-set-id`` if a new module replaces an
  existing one for the same namespace (which may require data to be reloaded).



[X] Logging system
------------------

* [X] Output format

* [X] Configuration

* [X] Event logging

  * [X] auth

    * [X] Connection established

    * [X] Authentication succeess

    * [X] Authentication failure

    * [X] Connection closed

  * [X] operational

    * [X] RPC executed

    * [X] RPC unknown

    * [X] RPC failure

    * [X] RPC success

  * [X] config

    * [X] Configuration editing

    * [X] Configuration edited

    * [X] Configuration reading

    * [X] Configuration operation denied

This system is reponsible for all event logging for the NETCONF APK
project.  See the `logging specification`_ for more details.

.. _`logging specification`: ./logging.rst



[ ] NACM
--------

This feature will require in-depth discussion.



[/] Service management module
-----------------------------

* [X] Design API

* [X] Design YANG model

* [X] Implement module

  * [/] OpenRC

  * [ ] s6?

This module allows administration of services on the system.  See the
separate `service management specification`_ for more details.

.. _`service management specification`: ./service.rst



[/] System module
-----------------

* [/] Configuration nodes

  * [X] Retrieve and set admin contact and system location information.

  * [X] Retrieve and set hostname.

  * [ ] Clock:

    * [ ] Retrieve and set timezone name (``/etc/localtime``).

    * [ ] Determine ``timezone-utc-offset`` from current localtime.

  * [X] DNS configuration

  * [ ] NTP configuration

  * [ ] Local user administration:

    * [ ] SSH key administration (``$HOME/.ssh/authorized_keys``).

* [X] State nodes

  * [X] Platform information.

  * [X] Current date and time.

  * [X] Boot date and time.

* [/] RPCs

  * [ ] Set date/time.

  * [X] Restart.

  * [X] Shutdown.


The system module allows basic administration of system configuration.


Outstanding TBDs
````````````````
* When the admin tries to set ``timezone-utc-offset``, do we make a custom
  zoneinfo file or do we try to match?

* Should there be a group for NETCONF-allowed users?

Resolved TBDs
`````````````
* Do we support NTP?  If so, which implementation?  Prefer chrony because it's
  available on Adélie (openntpd isn't available due to ppc/be issues)

  **Resolution**: Yes, NTP support is desireable.  THe implementation is
  ``ntpsec``.  It has been packaged and tested for Adélie/ppc64, so it appears
  portable.

* Where do we store the ``contact`` and ``location`` node information?

  **Resolution**: Flat files on the disk.

* Can musl be configured for DNS timeout seconds and resolution attempts?
  Would Rich be open to adding this?

  **Resolution**: Yes, musl supports these options in ``/etc/resolv.conf``.

* Do we calculate boot date/time naively (current time - uptime) or do we try
  to ascertain the actual boot date/time from something like ctime of ``/run``?

  **Resolution**: Naive calculation works well.  ctime is not always
  available and may be unreliable (systems that boot with time set to 1970).

* Do we support password-based authentication?

  **Resolution**: No, only key-based authentication.

* If we support password-based authentication, do we have a custom database or
  do we use ``/etc/shadow``?

  **Resolution**: Not applicable; we do not support password-based
  authentication.

* How do we support ``name`` of DNS resolvers?  It is mandatory.

  **Resolution**: Well-defined comment above each nameserver line.  Default
  to 'Resolver' if not specified.

* Do we support RADIUS?

  **Resolution**: No.



[/] Interfaces module
---------------------

* [x] Configuration nodes

  * [x] Name, type

  * [x] Description

  * [x] Enabled

* [/] State nodes

  * [x] Operational state

  * [ ] Time operational state entered

  * [x] Interface index

  * [x] MAC address

  * [ ] Related higher/lower layer interfaces

  * [x] Link speed (bits/second)

  * [x] Statistics (``ifctrstat``)


The interfaces module allows configuration and inspection of the physical layer
of system network interfaces.


Outstanding TBDs
````````````````
* How do we retrieve ``last-change``?

Resolved TBDs
`````````````
* We support ``arbitrary-names``, right?  Pretty sure GRE / tuntap / etc all
  let you name things whatever you want.

  **Resolution**: No.  We do not, as some Linux network tooling cannot properly
  handle UTF-8 names.

* Do we support ``pre-provisioning``?  It would make sense, since /e/n/i and
  /e/c/n both let you just specify whatever configuration you want for whatever
  interfaces you want.

  **Resolution**: Yes.

* Where do we store interface ``description``?

  **Resolution**: /e/n/i can do ``netconf-description`` keyword, /e/c/n (if
  we support it) can do ``description_$IFACE``.



[/] IP module
-------------

* [/] Configuration nodes

  * [ ] Enable/disable IPv4 on an interface

  * [x] Enable/disable IPv4 forwarding on an interface

  * [x] Set IPv4 MTU

  * [ ] Retrieve/set IPv4 address(es)

  * [ ] Handle neighbour / static ARP cache (set)

  * [x] Enable/disable IPv6 on an interface

  * [x] Enable/disable IPv6 forwarding on an interface

  * [x] Set IPv6 MTU

  * [ ] Retrieve/set IPv6 address(es)

  * [x] IPv6 DAD: Neighbour-Solicitation messages sent

  * [x] SLAAC configuration

* [ ] State nodes

  * [ ] Origin of IPv4 address(es)

  * [ ] Origin of IPv6 address(es)

  * [ ] IPv6 address status


The IP module allows configuration and inspection of the network layer of
system network interfaces.


Outstanding TBDs
````````````````
* Do we have a way to determine what addresses are static vs DHCP?  Can i.e.
  dhcpcd tell us what addresses it configured?

Resolved TBDs
`````````````
* Do we support IPv6 privacy extensions?

  **Resolution**: Yes.




2.0 (2021)
==========

[ ] Software module
-------------------

* [ ] Define model

* [ ] Configuration nodes

  * [ ] APK repositories

    * [ ] URL

    * [ ] Name / description

* [ ] State nodes

  * [ ] Software installed

    * [ ] Name, description, installed size

    * [ ] Repository

* [ ] RPCs

  * [ ] Install software

  * [ ] Deinstall software


The Software module allows configuration and inspection of installed packages
on a system.  This module will need to be properly defined.


Outstanding TBDs
````````````````
* Many.

Resolved TBDs
`````````````
* None.



[ ] NAT module?
---------------

See `ietf-nat module`_.

.. _`ietf-nat module`: https://github.com/YangModels/yang/raw/master/standard/ietf/RFC/ietf-nat%402019-01-10.yang



[ ] VRF/VSI module
------------------

See `ietf-network-instance module`_.

.. _`ietf-network-instance module`: https://github.com/YangModels/yang/raw/master/standard/ietf/RFC/ietf-network-instance%402019-01-21.yang



[ ] Routing module (base)
-------------------------

See `ietf-routing module`_.

.. _`ietf-routing module`: https://github.com/YangModels/yang/raw/master/standard/ietf/RFC/ietf-routing%402018-03-13.yang


Outstanding TBDs
````````````````
* How do we determine when a RIB entry was modified?

Resolved TBDs
`````````````
* Per kernel docs, the Linux kernel supports 242 user-defined RIBs in addition
  to default and main.  Do we want to expose that (feature ``multiple-ribs``)?

  **Resolution**: Yes, we expose feature ``multiple-ribs``.



[ ] Other features
------------------

Some features that have been tossed around that warrant further investigation,
but do not have any concrete proposals or architecture/design.

* [ ] 'Audit' system that can ensure malicious/errant users have not
      manipulated configuration in a way that the NETCONF server can't detect.

* [ ] Integration with something like etckeeper for further audit and change
      logging / documentation capabilities.