summaryrefslogtreecommitdiff
path: root/gnu/machines.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/machines.scm')
-rw-r--r--gnu/machines.scm127
1 files changed, 127 insertions, 0 deletions
diff --git a/gnu/machines.scm b/gnu/machines.scm
new file mode 100644
index 0000000000..a02f668b66
--- /dev/null
+++ b/gnu/machines.scm
@@ -0,0 +1,127 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu machines)
+ #:use-module (guix records)
+ #:use-module (gnu system)
+ #:use-module (gnu system vm)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
+ #:export (deployment
+ make-deployment
+ deployment?
+ deployment-name
+ deployment-machines
+
+ machine
+ make-machine
+ machine?
+ machine-name
+ machine-system
+ machine-platform
+
+ platform
+ make-platform
+ platform-name
+ platform-description
+ platform-provision
+ platform-install
+ platform-reconfigure
+ platform-boot
+ platform-reboot
+ platform-halt
+ platform-destroy
+
+ machine-os-for-platform
+ provision-machine
+ boot-machine
+
+ local-vm))
+
+(define-record-type* <deployment> deployment
+ make-deployment
+ deployment?
+ (name deployment-name) ; string
+ (machines deployment-machines)) ; list of <machine>
+
+(define-record-type* <machine> machine
+ make-machine
+ machine?
+ (name machine-name) ; string
+ (system machine-system) ; <operating-system>
+ (platform machine-platform)) ; <platform>
+
+(define-record-type* <platform> platform
+ make-platform
+ platform?
+ (name platform-name) ; string
+ (description platform-description) ; string
+ (transform platform-transform) ; procedure
+ (provision platform-provision) ; procedure
+ ;; (install platform-install) ; procedure
+ ;; (reconfigure platform-reconfigure) ; procedure
+ (boot platform-boot) ; procedure
+ ;; (reboot platform-reboot) ; procedure
+ ;; (halt platform-halt) ; procedure
+ ;; (destroy platform-destroy) ; procedure
+ )
+
+(define (machine-os-for-platform machine)
+ ((platform-transform (machine-platform machine)) (machine-system machine)))
+
+(define (provision-machine machine)
+ (let ((os (machine-os-for-platform machine)))
+ ((platform-provision (machine-platform machine)) os)))
+
+(define (boot-machine machine state)
+ ((platform-boot (machine-platform machine)) state))
+
+(use-modules (guix monads)
+ (guix derivations)
+ (guix store)
+ (gnu services networking))
+
+(define* (local-vm #:key (ip-address "10.0.2.10")
+ (disk-image-size (* 32 (expt 2 20))))
+ (platform
+ (name "local-vm")
+ (description "Local QEMU/KVM platform")
+ (transform
+ (lambda (os)
+ (let ((os (operating-system (inherit os)
+ (services
+ (cons
+ (static-networking-service "eth0" ip-address
+ #:name-servers '("10.0.2.3")
+ #:gateway "10.0.2.2")
+ (operating-system-user-services os))))))
+ (virtualized-operating-system os '()))))
+ (provision
+ (lambda (os)
+ (mlet %store-monad
+ ((vm-script (system-qemu-image/shared-store-script
+ os #:disk-image-size disk-image-size)))
+ (mbegin %store-monad
+ (built-derivations (list vm-script))
+ (return (derivation-output-path
+ (assoc-ref (derivation-outputs vm-script) "out")))))))
+ (boot
+ (lambda (script)
+ (match (primitive-fork)
+ (0 (primitive-exit (system* script)))
+ (pid #t))))))