aboutsummaryrefslogtreecommitdiff
path: root/doc/ideas.rst
blob: e93e42decfa16d13943d984c4483a142ce1c279d (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Ideas for future development
============================

Patches welcome.

Properties
----------

- Custom Emacs indentation rules for ``DISK:VOLUMES`` (and so
  ``DISK:HAS-VOLUMES``), and reindent the examples in docstrings and manual.

Connections
-----------

- :SBCL could (fork and) SAVE-LISP-AND-DIE.  That way, we have something that
  a cronjob can call to re-run the deployment to ensure that all properties
  remain applied.  Need to think about how the property which sets up the
  cronjob will be specified in consfigs -- does it make sense to allow passing
  in arbitrary deployments, or do we only allow re-running exactly the same
  thing?  If the former, the saved image will need to take some sort of
  command line input telling it what arguments to pass to DEPLOY*.

- Basic infrastructure for connections which work with just input and output
  streams connected to an interactive POSIX sh somewhere, like TRAMP, and
  probably using ``base64 -d`` for WRITEFILE.  Probably the basic connection
  type will take a command to start up the shell as a keyword argument, and
  then we can have more specific connection types which take other arguments
  and construct the full command.

- It might be possible to write an implementation of CONNECTION-UPLOAD for
  SSH-CONNECTION which can optimise a common case.  If it can see that it is
  the only item in the connection chain, and there is an old version of an
  item of prerequisite data to upload already on the remote side, it can move
  that old version to a temporary name, rsync the new version directly to the
  temporary name so that rsync can do an incremental update, and then rename
  the file to the new version.

- It would sometimes be useful to have the SSH connection pass
  ``-oHostName=<known IP address>`` when ``NETWORK:IPV4`` and/or
  ``NETWORK:IPV6`` have been specified for the host, so that DNS propagation
  is less likely to get in the way of configuring the host.  Some hosts' SSH
  daemons might only be accessible over VPNs and the like, however, so it will
  need to be easy to override this.

Data sources
------------

- It might be useful to have a data source which can just provide a single
  item of data when registered.  Then in your consfig you can just register
  this data source to make a particular file you have on your system available
  to deployments.

Core
----

- We signal a warning whenever the contents of a property's function cell is
  called when that property has a :HOSTATTRS subroutine.  Could we figure out
  catching and muffling the warning when the :HOSTATTRS subroutine did get
  run?

- A CONCURRENTLY combinator for property application specifications, which
  means to apply each of the enclosed properties in parallel.  Particularly
  useful surrounding a set of DEPLOYS applications, to concurrently deploy a
  number of hosts.  We use ``WITH-CURRENT-DIRECTORY`` in various places, so we
  may not be able to do this using threads.  But if we want to do it with lots
  of forking, then practically speaking usage of this combinator will be
  restricted to connection chains which start up remote Lisp images.

- It might be useful to have a restart for the case where an attempt is made
  to apply a list of properties containing some ``:LISP`` properties with a
  POSIX-type connection which applies properties up to but not including the
  first ``:LISP`` property in the sequence, to get as much work as possible
  done without violating any dependency relationships (``SEQPROPS`` already
  handles wanting to apply all of the ``:POSIX`` properties in the sequence).
  But maybe this is unnecessarily complex -- wouldn't it be better to just
  fail and fix your deployment definitions?

- Combinator WITH-REQUIREMENTS-FOR-CHANGE to only apply dependencies if the
  first property's :CHECK routine indicates that a change it needed.  For
  example, if the chroot already exists, we don't attempt to install
  debootstrap.  (The ``SBCL-AVAILABLE`` property in
  ``src/connection/sbcl.lisp`` achieves a similar effect in another way.)

- We might want ``DEPLOYS``, ``DEPLOYS-THESE`` to push the host object to the
  parent host's hostattrs, under ``:CHILD-HOSTS`` or something.  This means
  that hosts implicitly defined inline using dotted propapp notation are
  accessible via their parents, so that a property which gathers up DNS
  information about all hosts, for example, would be able to find them.

Project & packaging
-------------------

- Define a semantics for version numbers (probably just like Propellor's),
  start keeping a NEWS file, start actually announcing releases to
  sgo-software-announce.  Take the opportunity to review whole public API for
  good choices of names and sensible separation of responsibilities.
  Increment major version number from zero to one.