unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Edouard Klein <edk@beaver-labs.com>
To: guix-devel@gnu.org
Cc: "Ludovic Courtès" <ludo@gnu.org>,
	"Josselin Poiret" <dev@jpoiret.xyz>,
	"Liliana Marie Prikler" <liliana.prikler@gmail.com>
Subject: Syntactic Diabetes (was Re: A friendlier API for operating-system declarations)
Date: Fri, 24 Nov 2023 22:43:31 +0100	[thread overview]
Message-ID: <877cm6reum.fsf@rdklein.fr> (raw)
In-Reply-To: <87wn377rst.fsf@rdklein.fr>

Dear Guixers,

Here is a quick status update on my proposition to expose composable
functions to change operating-system declarations.

Thank you all for the feedback you gave me :) It's very nice to not be
talking in the void.

After Liliana opined that these functions should not put too much burden
on the maintainers, a position with which I wholeheartedly agree, here
is what I came up with:

https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/functional-services.scm

(file copied at the end of this email to make the list self-content
instead of relying on external services)

That's a macro-writing macro called "define-os-macros-for" that, for any
service (for example nginx), defines five forms. They all evaluate to a
modified os:

(.nginx os)  ;; Add nginx in its default configuration
(.nginx os toto titi tutu... )  ;; Add nginx, with toto... given as
arguments to nginx-configuration
(+nginx os toto titi tutu...)  ;; Extend an existing nginx service, giving
toto... as arguments to simple-service
(~nginx os toto...)  ;; Edit an existing nginx service, passing toto... as
arguments to modify-service
(-nginx os)  ;; Removes nginx

You can see all of them used in:
https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/system.scm?ref_type=heads

e.g. the mkdir-p function is a (+activation ...),
all web server functions use (+nginx...),
mumble is (.mumble... ),
os/git uses (~openssh... ).

I've use (-foo) forms while testing, but not in production. The others
are currently running in prod on guix-hosting.com and the-dam.org.

That'll be the meat of the first half of my presentation during the
informal Paris meetup in december.

Do you folks think something like that could one day make it in the
mainline ?

Cheers,

Edouard.


-----------------functional-services.scm----------------
(define-module (beaver functional-services)
   #:use-module (gnu system)
   #:export (*-append))

(define (syntax->string s)
  "Shorthand to convert a piece of syntax to a string"
  (symbol->string (syntax->datum s)))

(define (*->string s)
  "Convert into a string any symbol-like type we may encounter in a macro"
  (cond
   [(string? s) s]
   [(symbol? s) (symbol->string s)]
   [else (syntax->string s)]))  ;; assume syntax

(define* (*-append #:rest args)
  "Return a symbol which is a concatenation of the given symbol-like args"
  (string->symbol (apply string-append (map *->string args))))


(define-syntax define-os-macros-for
  ;; This macro, called like e.g. (define-os-macros-for foo) will define four
  ;; forms, .foo, +foo, ~foo and -foo
  ;;
  ;; These forms take an operating-system as their first argument, and
  ;; evaluate to an operating-system, which allows one to compose them
  ;; (e.g. (foo (bar os))).
  (lambda (x)
    (syntax-case x ()
      [(_ foo)
       (with-syntax
        ([dot-foo           (datum->syntax x (*-append "." #'foo))]
         [plus-foo          (datum->syntax x (*-append "+" #'foo))]
         [tilde-foo         (datum->syntax x (*-append "~" #'foo))]
         [minus-foo         (datum->syntax x (*-append "-" #'foo))]
         [foo-service-type  (datum->syntax x (*-append #'foo "-service-type"))]
         [foo-configuration (datum->syntax x (*-append #'foo "-configuration"))])
        #'(begin
            ;; The fist macro is .foo
            (define-syntax dot-foo
              (syntax-rules ()
                ;; Its simplest form is (.foo os), which will add an instance
                ;; of service foo to os.
                [(dot-foo os)
                 ((lambda (x)  ;; It is wrapped in a lamba to make sure os is
                    ;; evaluated once only. It it wasn't in a labmda, whatever
                    ;; form os is in the calling code would be repeated
                    ;; multiple times, and so if the form was e.g. (some-func
                    ;; os), then some-func would be called multiple times,
                    ;; which may not be desirable.
                    (operating-system
                      (inherit x)
                      (services
                       (cons
                        (service foo-service-type)
                        (operating-system-user-services x)))))
                  os)]
                ;; This other form, (.foo os something bar baz...) takes
                ;; multiple forms as arguments, which are reproduced as is to
                ;; construct the foo-configuration
                [(dot-foo os forms (... ...))
                 ((lambda (x)  ;; Wrapping in a lambda for the same reasons as above
                    (operating-system
                      (inherit x)
                      (services
                       (cons
                        (service foo-service-type
                                 (foo-configuration forms (... ...)))
                        (operating-system-user-services x)))))
                  os)]))
            ;; The second one is +foo. It extends a service, reproducing the
            ;; given forms as arguments to the simple-service procedure
            (define-syntax plus-foo
              (syntax-rules ()
                [(plus-foo os forms (... ...))
                 ((lambda (x)
                    (operating-system
                      (inherit x)
                      (services
                       (cons
                        (simple-service (format  #f "A ~a extension" (*->string #'foo))
                                        foo-service-type
                                        forms (... ...))
                        (operating-system-user-services x)))))
                  os)]))
            ;; The third one is ~foo. It modifies existing instances of a service,
            ;; passing the given forms as arguments to the modify-service macro
            (define-syntax tilde-foo
              (syntax-rules ()
                [(tilde-foo os forms (... ...))
                 ((lambda (x)
                    (operating-system
                      (inherit x)
                      (services
                       (modify-services (operating-system-user-services x)
                         (foo-service-type
                          config =>
                          (foo-configuration
                           (inherit config)
                           forms (... ...)))))))
                  os)]))
            ;; The fourth one is -foo. It removes foo-service-type from the
            ;; os' services
            (define-syntax minus-foo
              (syntax-rules ()
                [(minus-foo os)
                 ((lambda (x)
                    (operating-system
                      (inherit x)
                      (services
                       (modify-services (operating-system-user-services x)
                         (delete foo-service-type)))))
                  os)]))
            ;;Don't forget to make .foo, +foo, ~foo, and -foo visible
            (export dot-foo plus-foo tilde-foo minus-foo)))])))


;; What follows is generated by running the following fish command in the
;; guix repo :

;; grep -E "define[^\(]*-service-type" **.scm | sort | uniq | sed 's|/| |g' | sed -E 's/(gnu|guix)/\(use-modules \(\1/' | sed -E 's/.scm/\)\)/' | sed -E 's/:\(define(-public|-syntax)* / \(define-os-macros-for /' | grep -v define-record-type | grep -Ev 'lookup.*-service-types' | grep -v python-os-service-types  | sed -E 's/([^ ]*)-service-type/\1\)/'
(use-modules (gnu home services)) (define-os-macros-for home-activation)
(use-modules (gnu home services)) (define-os-macros-for home-environment-variables)
(use-modules (gnu home services)) (define-os-macros-for home-files)
(use-modules (gnu home services)) (define-os-macros-for home-profile)
(use-modules (gnu home services)) (define-os-macros-for home-provenance)
(use-modules (gnu home services)) (define-os-macros-for home-run-on-change)
(use-modules (gnu home services)) (define-os-macros-for home-run-on-first-login)
(use-modules (gnu home services)) (define-os-macros-for home)
(use-modules (gnu home services)) (define-os-macros-for home-xdg-configuration-files)
(use-modules (gnu home services)) (define-os-macros-for home-xdg-data-files)
(use-modules (gnu home services desktop)) (define-os-macros-for home-dbus)
(use-modules (gnu home services desktop)) (define-os-macros-for home-redshift)
(use-modules (gnu home services desktop)) (define-os-macros-for home-unclutter)
(use-modules (gnu home services desktop)) (define-os-macros-for home-xmodmap)
(use-modules (gnu home services fontutils)) (define-os-macros-for home-fontconfig)
(use-modules (gnu home services gnupg)) (define-os-macros-for home-gpg-agent)
(use-modules (gnu home services guix)) (define-os-macros-for home-channels)
(use-modules (gnu home services mail)) (define-os-macros-for home-msmtp)
(use-modules (gnu home services mcron)) (define-os-macros-for home-mcron)
(use-modules (gnu home services media)) (define-os-macros-for home-kodi)
(use-modules (gnu home services messaging)) (define-os-macros-for home-znc)
(use-modules (gnu home services pm)) (define-os-macros-for home-batsignal)
(use-modules (gnu home services shells)) (define-os-macros-for home-bash)
(use-modules (gnu home services shells)) (define-os-macros-for home-fish)
(use-modules (gnu home services shells)) (define-os-macros-for home-shell-profile)
(use-modules (gnu home services shells)) (define-os-macros-for home-zsh)
(use-modules (gnu home services shepherd)) (define-os-macros-for home-shepherd)
(use-modules (gnu home services sound)) (define-os-macros-for home-pulseaudio-rtp-sink)
(use-modules (gnu home services sound)) (define-os-macros-for home-pulseaudio-rtp-source)
(use-modules (gnu home services ssh)) (define-os-macros-for home-openssh)
(use-modules (gnu home services ssh)) (define-os-macros-for home-ssh-agent)
(use-modules (gnu home services symlink-manager)) (define-os-macros-for home-symlink-manager)
(use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-base-directories)
(use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-mime-applications)
(use-modules (gnu home services xdg)) (define-os-macros-for home-xdg-user-directories)
(use-modules (gnu services)) (define-os-macros-for activation)
(use-modules (gnu services)) (define-os-macros-for boot)
(use-modules (gnu services)) (define-os-macros-for cleanup)
(use-modules (gnu services)) (define-os-macros-for etc)
(use-modules (gnu services)) (define-os-macros-for firmware)
(use-modules (gnu services)) (define-os-macros-for gc-root)
(use-modules (gnu services)) (define-os-macros-for hurd-startup)
(use-modules (gnu services)) (define-os-macros-for linux-builder)
(use-modules (gnu services)) (define-os-macros-for linux-loadable-module)
(use-modules (gnu services)) (define-os-macros-for profile)
(use-modules (gnu services)) (define-os-macros-for provenance)
(use-modules (gnu services)) (define-os-macros-for setuid-program)
(use-modules (gnu services)) (define-os-macros-for special-files)
(use-modules (gnu services)) (define-os-macros-for system)
(use-modules (gnu services admin)) (define-os-macros-for log-cleanup)
(use-modules (gnu services admin)) (define-os-macros-for rottlog)
(use-modules (gnu services admin)) (define-os-macros-for unattended-upgrade)
(use-modules (gnu services audio)) (define-os-macros-for mpd)
(use-modules (gnu services audio)) (define-os-macros-for mympd)
(use-modules (gnu services auditd)) (define-os-macros-for auditd)
(use-modules (gnu services authentication)) (define-os-macros-for fprintd)
(use-modules (gnu services authentication)) (define-os-macros-for nslcd)
(use-modules (gnu services avahi)) (define-os-macros-for avahi)
(use-modules (gnu services base)) (define-os-macros-for agetty)
(use-modules (gnu services base)) (define-os-macros-for console-font)
(use-modules (gnu services base)) (define-os-macros-for file-system)
(use-modules (gnu services base)) (define-os-macros-for fstab)
(use-modules (gnu services base)) (define-os-macros-for gpm)
(use-modules (gnu services base)) (define-os-macros-for greetd)
(use-modules (gnu services base)) (define-os-macros-for guix-publish)
(use-modules (gnu services base)) (define-os-macros-for guix)
(use-modules (gnu services base)) (define-os-macros-for host-name)
(use-modules (gnu services base)) (define-os-macros-for hosts)
(use-modules (gnu services base)) (define-os-macros-for kmscon)
(use-modules (gnu services base)) (define-os-macros-for login)
(use-modules (gnu services base)) (define-os-macros-for mingetty)
(use-modules (gnu services base)) (define-os-macros-for nscd)
(use-modules (gnu services base)) (define-os-macros-for pam-limits)
(use-modules (gnu services base)) (define-os-macros-for rngd)
(use-modules (gnu services base)) (define-os-macros-for root-file-system)
(use-modules (gnu services base)) (define-os-macros-for static-networking)
(use-modules (gnu services base)) (define-os-macros-for swap)
(use-modules (gnu services base)) (define-os-macros-for syslog)
(use-modules (gnu services base)) (define-os-macros-for udev)
(use-modules (gnu services base)) (define-os-macros-for urandom-seed)
(use-modules (gnu services base)) (define-os-macros-for virtual-terminal)
(use-modules (gnu services certbot)) (define-os-macros-for certbot)
(use-modules (gnu services cgit)) (define-os-macros-for cgit)
(use-modules (gnu services ci)) (define-os-macros-for laminar)
(use-modules (gnu services cuirass)) (define-os-macros-for cuirass-remote-worker)
(use-modules (gnu services cuirass)) (define-os-macros-for cuirass)
(use-modules (gnu services cups)) (define-os-macros-for cups)
(use-modules (gnu services databases)) (define-os-macros-for memcached)
(use-modules (gnu services databases)) (define-os-macros-for mysql)
(use-modules (gnu services databases)) (define-os-macros-for postgresql-role)
(use-modules (gnu services databases)) (define-os-macros-for postgresql)
(use-modules (gnu services databases)) (define-os-macros-for redis)
(use-modules (gnu services dbus)) (define-os-macros-for dbus-root)
(use-modules (gnu services dbus)) (define-os-macros-for polkit)
(use-modules (gnu services desktop)) (define-os-macros-for accountsservice)
(use-modules (gnu services desktop)) (define-os-macros-for bluetooth)
(use-modules (gnu services desktop)) (define-os-macros-for colord)
(use-modules (gnu services desktop)) (define-os-macros-for cups-pk-helper)
(use-modules (gnu services desktop)) (define-os-macros-for elogind)
(use-modules (gnu services desktop)) (define-os-macros-for enlightenment-desktop)
(use-modules (gnu services desktop)) (define-os-macros-for geoclue)
(use-modules (gnu services desktop)) (define-os-macros-for gnome-desktop)
(use-modules (gnu services desktop)) (define-os-macros-for gnome-keyring)
(use-modules (gnu services desktop)) (define-os-macros-for inputattach)
(use-modules (gnu services desktop)) (define-os-macros-for lxqt-desktop)
(use-modules (gnu services desktop)) (define-os-macros-for mate-desktop)
(use-modules (gnu services desktop)) (define-os-macros-for sane)
(use-modules (gnu services desktop)) (define-os-macros-for seatd)
(use-modules (gnu services desktop)) (define-os-macros-for sugar-desktop)
(use-modules (gnu services desktop)) (define-os-macros-for udisks)
(use-modules (gnu services desktop)) (define-os-macros-for upower)
(use-modules (gnu services desktop)) (define-os-macros-for x11-socket-directory)
(use-modules (gnu services desktop)) (define-os-macros-for xfce-desktop)
(use-modules (gnu services dict)) (define-os-macros-for dicod)
(use-modules (gnu services dns)) (define-os-macros-for ddclient)
(use-modules (gnu services dns)) (define-os-macros-for dnsmasq)
(use-modules (gnu services dns)) (define-os-macros-for knot-resolver)
(use-modules (gnu services dns)) (define-os-macros-for knot)
(use-modules (gnu services docker)) (define-os-macros-for docker)
(use-modules (gnu services docker)) (define-os-macros-for singularity)
(use-modules (gnu services file-sharing)) (define-os-macros-for transmission-daemon)
(use-modules (gnu services games)) (define-os-macros-for joycond)
(use-modules (gnu services games)) (define-os-macros-for wesnothd)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-cleaner)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-confd)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-kvmd)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-luxid)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-metad)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-mond)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-noded)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-rapi)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-watcher)
(use-modules (gnu services ganeti)) (define-os-macros-for ganeti-wconfd)
(use-modules (gnu services getmail)) (define-os-macros-for getmail)
(use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator-agent)
(use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator-queue-builds)
(use-modules (gnu services guix)) (define-os-macros-for guix-build-coordinator)
(use-modules (gnu services guix)) (define-os-macros-for guix-data)
(use-modules (gnu services guix)) (define-os-macros-for nar-herder)
(use-modules (gnu services hurd)) (define-os-macros-for hurd-console)
(use-modules (gnu services hurd)) (define-os-macros-for hurd-getty)
(use-modules (gnu services kerberos)) (define-os-macros-for krb5)
(use-modules (gnu services kerberos)) (define-os-macros-for pam-krb5)
(use-modules (gnu services ldap)) (define-os-macros-for directory-server)
(use-modules (gnu services lightdm)) (define-os-macros-for lightdm)
(use-modules (gnu services linux)) (define-os-macros-for earlyoom)
(use-modules (gnu services linux)) (define-os-macros-for fstrim)
(use-modules (gnu services linux)) (define-os-macros-for kernel-module-loader)
(use-modules (gnu services linux)) (define-os-macros-for rasdaemon)
(use-modules (gnu services linux)) (define-os-macros-for zram-device)
(use-modules (gnu services lirc)) (define-os-macros-for lirc)
(use-modules (gnu services mail)) (define-os-macros-for dovecot)
(use-modules (gnu services mail)) (define-os-macros-for exim)
(use-modules (gnu services mail)) (define-os-macros-for imap4d)
(use-modules (gnu services mail)) (define-os-macros-for mail-aliases)
(use-modules (gnu services mail)) (define-os-macros-for opensmtpd)
(use-modules (gnu services mail)) (define-os-macros-for radicale)
(use-modules (gnu services mcron)) (define-os-macros-for mcron)
(use-modules (gnu services messaging)) (define-os-macros-for bitlbee)
(use-modules (gnu services messaging)) (define-os-macros-for prosody)
(use-modules (gnu services messaging)) (define-os-macros-for quassel)
(use-modules (gnu services monitoring)) (define-os-macros-for darkstat)
(use-modules (gnu services monitoring)) (define-os-macros-for prometheus-node-exporter)
(use-modules (gnu services monitoring)) (define-os-macros-for vnstat)
(use-modules (gnu services monitoring)) (define-os-macros-for zabbix-agent)
(use-modules (gnu services monitoring)) (define-os-macros-for zabbix-front-end)
(use-modules (gnu services monitoring)) (define-os-macros-for zabbix-server)
(use-modules (gnu services networking)) (define-os-macros-for block-facebook-hosts)
(use-modules (gnu services networking)) (define-os-macros-for connman)
(use-modules (gnu services networking)) (define-os-macros-for dhcp-client)
(use-modules (gnu services networking)) (define-os-macros-for dhcpd)
(use-modules (gnu services networking)) (define-os-macros-for hostapd)
(use-modules (gnu services networking)) (define-os-macros-for ipfs)
(use-modules (gnu services networking)) (define-os-macros-for iptables)
(use-modules (gnu services networking)) (define-os-macros-for keepalived)
(use-modules (gnu services networking)) (define-os-macros-for modem-manager)
(use-modules (gnu services networking)) (define-os-macros-for network-manager)
(use-modules (gnu services networking)) (define-os-macros-for nftables)
(use-modules (gnu services networking)) (define-os-macros-for ntp)
(use-modules (gnu services networking)) (define-os-macros-for opendht)
(use-modules (gnu services networking)) (define-os-macros-for openntpd)
(use-modules (gnu services networking)) (define-os-macros-for openvswitch)
(use-modules (gnu services networking)) (define-os-macros-for pagekite)
(use-modules (gnu services networking)) (define-os-macros-for simulated-wifi)
(use-modules (gnu services networking)) (define-os-macros-for tor)
(use-modules (gnu services networking)) (define-os-macros-for usb-modeswitch)
(use-modules (gnu services networking)) (define-os-macros-for wpa-supplicant)
(use-modules (gnu services networking)) (define-os-macros-for yggdrasil)
(use-modules (gnu services networking)) (define-os-macros-for inetd)
(use-modules (gnu services nfs)) (define-os-macros-for gss)
(use-modules (gnu services nfs)) (define-os-macros-for idmap)
(use-modules (gnu services nfs)) (define-os-macros-for nfs)
(use-modules (gnu services nfs)) (define-os-macros-for pipefs)
(use-modules (gnu services nfs)) (define-os-macros-for rpcbind)
(use-modules (gnu services nix)) (define-os-macros-for nix)
(use-modules (gnu services pam-mount)) (define-os-macros-for pam-mount)
(use-modules (gnu services pm)) (define-os-macros-for thermald)
(use-modules (gnu services pm)) (define-os-macros-for tlp)
(use-modules (gnu services rsync)) (define-os-macros-for rsync)
(use-modules (gnu services samba)) (define-os-macros-for samba)
(use-modules (gnu services samba)) (define-os-macros-for wsdd)
(use-modules (gnu services science)) (define-os-macros-for rshiny)
(use-modules (gnu services sddm)) (define-os-macros-for sddm)
(use-modules (gnu services security-token)) (define-os-macros-for pcscd)
(use-modules (gnu services security)) (define-os-macros-for fail2ban)
(use-modules (gnu services shepherd)) (define-os-macros-for shepherd-root)
(use-modules (gnu services shepherd)) (define-os-macros-for user-processes)
(use-modules (gnu services shepherd)) (define-os-macros-for shepherd)
(use-modules (gnu services sound)) (define-os-macros-for alsa)
(use-modules (gnu services sound)) (define-os-macros-for ladspa)
(use-modules (gnu services sound)) (define-os-macros-for pulseaudio)
(use-modules (gnu services spice)) (define-os-macros-for spice-vdagent)
(use-modules (gnu services ssh)) (define-os-macros-for autossh)
(use-modules (gnu services ssh)) (define-os-macros-for dropbear)
(use-modules (gnu services ssh)) (define-os-macros-for lsh)
(use-modules (gnu services ssh)) (define-os-macros-for openssh)
(use-modules (gnu services ssh)) (define-os-macros-for webssh)
(use-modules (gnu services syncthing)) (define-os-macros-for syncthing)
(use-modules (gnu services sysctl)) (define-os-macros-for sysctl)
(use-modules (gnu services telephony)) (define-os-macros-for jami)
(use-modules (gnu services telephony)) (define-os-macros-for mumble-server)
(use-modules (gnu services version-control)) (define-os-macros-for git-daemon)
(use-modules (gnu services version-control)) (define-os-macros-for gitile)
(use-modules (gnu services version-control)) (define-os-macros-for gitolite)
(use-modules (gnu services virtualization)) (define-os-macros-for hurd-vm)
(use-modules (gnu services virtualization)) (define-os-macros-for libvirt)
(use-modules (gnu services virtualization)) (define-os-macros-for qemu-binfmt)
(use-modules (gnu services virtualization)) (define-os-macros-for qemu-guest-agent)
(use-modules (gnu services virtualization)) (define-os-macros-for secret)
(use-modules (gnu services virtualization)) (define-os-macros-for virtlog)
(use-modules (gnu services vnc)) (define-os-macros-for xvnc)
(use-modules (gnu services vpn)) (define-os-macros-for openvpn-client)
(use-modules (gnu services vpn)) (define-os-macros-for openvpn-server)
(use-modules (gnu services vpn)) (define-os-macros-for strongswan)
(use-modules (gnu services vpn)) (define-os-macros-for wireguard)
(use-modules (gnu services vpn)) (define-os-macros-for bitmask)
(use-modules (gnu services web)) (define-os-macros-for agate)
(use-modules (gnu services web)) (define-os-macros-for anonip)
(use-modules (gnu services web)) (define-os-macros-for fcgiwrap)
(use-modules (gnu services web)) (define-os-macros-for gmnisrv)
(use-modules (gnu services web)) (define-os-macros-for hpcguix-web)
(use-modules (gnu services web)) (define-os-macros-for httpd)
(use-modules (gnu services web)) (define-os-macros-for mumi)
(use-modules (gnu services web)) (define-os-macros-for nginx)
(use-modules (gnu services web)) (define-os-macros-for patchwork)
(use-modules (gnu services web)) (define-os-macros-for php-fpm)
(use-modules (gnu services web)) (define-os-macros-for tailon)
(use-modules (gnu services web)) (define-os-macros-for varnish)
(use-modules (gnu services xorg)) (define-os-macros-for dconf)
(use-modules (gnu services xorg)) (define-os-macros-for gdm)
(use-modules (gnu services xorg)) (define-os-macros-for localed)
(use-modules (gnu services xorg)) (define-os-macros-for screen-locker)
(use-modules (gnu services xorg)) (define-os-macros-for slim)
(use-modules (gnu services xorg)) (define-os-macros-for xorg-server)
(use-modules (gnu system install)) (define-os-macros-for configuration-template)
(use-modules (gnu system install)) (define-os-macros-for cow-store)
(use-modules (gnu system install)) (define-os-macros-for documentation)
(use-modules (gnu system install)) (define-os-macros-for uvesafb)
(use-modules (gnu system linux-container)) (define-os-macros-for dummy-networking)
(use-modules (gnu system mapped-devices)) (define-os-macros-for device-mapping)
(use-modules (gnu system pam)) (define-os-macros-for pam-root)
(use-modules (gnu system pam)) (define-os-macros-for session-environment)
(use-modules (gnu system shadow)) (define-os-macros-for account)
(use-modules (gnu tests)) (define-os-macros-for marionette)
(use-modules (guix scripts publish)) (define-os-macros-for publish)


Edouard Klein <edk@beaver-labs.com> writes:

> Dear Guixers,
>
> For my clients and my own use, I use a layer on top of operating-system
> declarations in which I create functions that take an os as a first
> argument, and return an os.
>
> With the help of the handy -> macro, I can chain them, thus allowing an
> easy stacking of multiple "roles" or "functionalities" on the same
> machine, and an easy transfer of said functionality to another machine:
> just cut and paste one line from one declaration to the other.
>
> I have written a tutorial for my clients here:
>
> https://guix-hosting.com/docs/tuto/getting-started.html
>
> that gives an example of what an os configuration may look like:
>
> #+begin_src scheme
> (->
>  (minimal-ovh "ssh-rsa AAASomethingSomething== root@minimal-ovh")
>  (http-static-content "sub2.example.com" #:to-dir "/srv/sub2")
>  (http-static-content "sub1.example.com" #:to-dir "/srv/sub1/")
>  (add-services my-db))
> #+end_src
>
> The code of the function is on my channel:
> https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/system.scm
>
> After a few months of experience, and positive feedback from my clients,
> my question to you guys is: would you be interested in mainlining this,
> or should I keep my development efforts separate in my channel ?
>
> I do think this API is easier than manipulating services, and although
> extendable services are awesome and a very nifty piece of engineering,
> they require quite a good knowledge of scheme and take a while to be
> used to, while this new API, while way less powerful, lowers the barrier
> to entry for newcomers.
>
> They are an easy way to maintain a declarative whole operating system
> configuration, with a syntax similar enough to docker and ansible that
> sysadmins familiar with it can quickly get up and running, thus exposing
> more people to Guix.
>
> What do you think ?
>
> Cheers,
>
> Edouard.


  parent reply	other threads:[~2023-11-24 22:02 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-23  8:06 A friendlier API for operating-system declarations Edouard Klein
2023-03-23 18:48 ` Josselin Poiret
2023-03-23 20:23   ` Edouard Klein
2023-03-23 21:05 ` Liliana Marie Prikler
2023-04-13  9:42 ` Ludovic Courtès
2023-05-18 14:37   ` Edouard Klein
2023-11-24 21:43 ` Edouard Klein [this message]
2023-11-24 22:50   ` Syntactic Diabetes (was Re: A friendlier API for operating-system declarations) Liliana Marie Prikler
2023-11-25 20:14     ` Attila Lendvai
2023-11-26  5:36       ` Michal Atlas
2023-11-26 16:49       ` Edouard Klein
2023-11-26 18:32         ` Liliana Marie Prikler
2023-11-26 20:46           ` Edouard Klein
2023-11-27 21:09             ` Liliana Marie Prikler
2023-11-29 20:12               ` Attila Lendvai
2023-11-29 23:39                 ` Felix Lechner via Development of GNU Guix and the GNU System distribution.
2023-11-30 11:16                   ` Attila Lendvai
2023-12-01 18:18                     ` Michal Atlas
2024-02-01 13:29                     ` Introducing Guix "Features"! (Was: Syntactic Diabetes) Felix Lechner via Development of GNU Guix and the GNU System distribution.
2024-02-01 19:43                       ` Liliana Marie Prikler
2024-02-01 20:30                         ` Attila Lendvai
2024-02-01 20:46                           ` Liliana Marie Prikler
2024-02-02 20:11                             ` Attila Lendvai
2024-02-01 21:02                           ` Ricardo Wurmus
2024-02-02 19:36                             ` Attila Lendvai
2024-02-02 20:21                               ` Vagrant Cascadian
2024-02-02 21:25                                 ` Attila Lendvai
2024-02-02  0:03                       ` Introducing Guix "Features"! Carlo Zancanaro
2024-02-18 15:07                       ` Introducing Guix "Features"! (Was: Syntactic Diabetes) Edouard Klein
2023-12-09 10:12         ` Syntactic Diabetes (was Re: A friendlier API for operating-system declarations) Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877cm6reum.fsf@rdklein.fr \
    --to=edk@beaver-labs.com \
    --cc=dev@jpoiret.xyz \
    --cc=guix-devel@gnu.org \
    --cc=liliana.prikler@gmail.com \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).