summaryrefslogtreecommitdiff
path: root/vms
diff options
context:
space:
mode:
Diffstat (limited to 'vms')
-rw-r--r--vms/Makefile23
-rw-r--r--vms/README7
-rw-r--r--vms/configuration.nix25
-rw-r--r--vms/images.nix134
-rwxr-xr-xvms/test_django/manage.py21
-rw-r--r--vms/test_django/test_django/__init__.py0
-rw-r--r--vms/test_django/test_django/__pycache__/__init__.cpython-38.pycbin0 -> 152 bytes
-rw-r--r--vms/test_django/test_django/__pycache__/settings.cpython-38.pycbin0 -> 2304 bytes
-rw-r--r--vms/test_django/test_django/__pycache__/urls.cpython-38.pycbin0 -> 933 bytes
-rw-r--r--vms/test_django/test_django/__pycache__/wsgi.cpython-38.pycbin0 -> 563 bytes
-rw-r--r--vms/test_django/test_django/settings.py120
-rw-r--r--vms/test_django/test_django/urls.py21
-rw-r--r--vms/test_django/test_django/wsgi.py16
13 files changed, 367 insertions, 0 deletions
diff --git a/vms/Makefile b/vms/Makefile
new file mode 100644
index 0000000..3306b52
--- /dev/null
+++ b/vms/Makefile
@@ -0,0 +1,23 @@
1.PHONY: run_light
2run_light:
3 $(shell nix-build images.nix --no-out-link -A light)
4
5.PHONY: run_standalone
6run_standalone:
7 $(shell nix-build images.nix --no-out-link -A standalone)
8
9.PHONY: run_docker
10run_docker:
11 $(shell nix-build images.nix --no-out-link -A docker)
12
13.PHONY: build_light
14build_light:
15 nix-build images.nix --no-out-link -A light.eval
16
17.PHONY: build_standalone
18build_standalone:
19 nix-build images.nix --no-out-link -A standalone.eval
20
21.PHONY: build_docker
22build_docker:
23 nix-build images.nix --no-out-link -A docker.eval
diff --git a/vms/README b/vms/README
new file mode 100644
index 0000000..d918d19
--- /dev/null
+++ b/vms/README
@@ -0,0 +1,7 @@
1This directory regroups several ways to run a VM, all building the same configuration.nix file
2- A light VM to run with QEMU binding to the host store
3- A standalone VM to run with QEMU
4- A docker VM
5
6In last two cases, you may build an image or directly execute it (see
7Makefile)
diff --git a/vms/configuration.nix b/vms/configuration.nix
new file mode 100644
index 0000000..c6e2cdf
--- /dev/null
+++ b/vms/configuration.nix
@@ -0,0 +1,25 @@
1{ pkgs, ... }:
2{
3 config = {
4 users.users.root.password = "";
5 users.mutableUsers = false;
6
7 environment.systemPackages = [
8 pkgs.curl
9 ];
10 systemd.services.django-hello-world = {
11 description = "An example django app";
12 wantedBy = [ "multi-user.target" ];
13 after = [ "network.target" ];
14
15 preStart = "rm -rf /var/lib/django_app/test_app && cp -a ${./test_django} /var/lib/django_app/test_app";
16 script =
17 let pythonWithDjango = pkgs.python3.withPackages (p: [ p.django ]);
18 in "cd /var/lib/django_app/test_app && ${pythonWithDjango}/bin/python manage.py runserver";
19 serviceConfig = {
20 WorkingDirectory = "/var/lib/django_app";
21 StateDirectory = "django_app";
22 };
23 };
24 };
25}
diff --git a/vms/images.nix b/vms/images.nix
new file mode 100644
index 0000000..fd6c967
--- /dev/null
+++ b/vms/images.nix
@@ -0,0 +1,134 @@
1let
2 pkgs = import <nixpkgs> {};
3 lib = pkgs.lib;
4 toEval = modules:
5 import <nixpkgs/nixos/lib/eval-config.nix> {
6 system = pkgs.system;
7 modules = [ ./configuration.nix ] ++ modules;
8 };
9 modules = {
10 docker = [
11 {
12 config = {
13 boot.isContainer = true;
14 system.activationScripts.installInitScript = ''
15 ln -fs $systemConfig/init /init
16 '';
17 };
18 }
19 ];
20 light = [
21 { config.virtualisation.graphics = false; }
22 <nixpkgs/nixos/modules/virtualisation/qemu-vm.nix>
23 ];
24 standalone = [
25 {
26 config = {
27 fileSystems."/" = {
28 device = "/dev/disk/by-label/nixos";
29 fsType = "ext4";
30 autoResize = true;
31 };
32
33 boot = {
34 kernelParams = [ "console=ttyS0" ];
35 loader = {
36 timeout = 0;
37 grub.device = "/dev/xvda";
38 grub.configurationLimit = 0;
39 };
40
41 initrd = {
42 network.enable = true;
43 };
44 };
45
46 services.udisks2.enable = false;
47 };
48 }
49 ];
50 };
51 evals = {
52 light = (toEval modules.light).config.system.build.vm;
53 docker =
54 # inspired from
55 # https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/docker-image.nix
56 let
57 eval = toEval modules.docker;
58 in
59 pkgs.callPackage <nixpkgs/nixos/lib/make-system-tarball.nix> {
60 contents = [
61 {
62 source = "${eval.config.system.build.toplevel}/.";
63 target = "./";
64 }
65 ];
66 extraArgs = "--owner=0";
67
68 # Add init script to image
69 storeContents = map (x: { object = x; symlink = "none"; }) [
70 eval.config.system.build.toplevel
71 pkgs.stdenv
72 ];
73
74 # Some container managers like lxc need these
75 extraCommands = "mkdir -p proc sys dev";
76 };
77 standalone =
78 let
79 eval = toEval modules.standalone;
80 name = "nixos-${eval.config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
81 in
82 import <nixpkgs/nixos/lib/make-disk-image.nix> {
83 inherit lib name pkgs;
84 config = eval.config;
85 contents = [];
86 diskSize = 2048;
87 format = "qcow2";
88 postVM = ''
89 extension=''${diskImage##*.}
90 friendlyName=$out/${name}.$extension
91 mv "$diskImage" "$friendlyName"
92 diskImage=$friendlyName
93
94 mkdir -p $out/nix-support
95
96 ${pkgs.jq}/bin/jq -n \
97 --arg label ${lib.escapeShellArg eval.config.system.nixos.label} \
98 --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
99 --arg logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$diskImage" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
100 --arg file "$diskImage" \
101 '$ARGS.named' \
102 > $out/nix-support/image-info.json
103 '';
104 };
105 };
106 scripts = {
107 standalone = pkgs.writeScript "run" ''
108 #!${pkgs.stdenv.shell}
109
110 file=$(cat ${evals.standalone}/nix-support/image-info.json | jq -r .file)
111 cp $file ./nixos.qcow2
112 chmod u+w nixos.qcow2
113
114 trap "rm -f nixos.qcow2" EXIT
115 ${pkgs.qemu}/bin/qemu-system-x86_64 -nographic --cpu host --enable-kvm -hda nixos.qcow2
116 '';
117 light = pkgs.writeScript "run" ''
118 #!${pkgs.stdenv.shell}
119
120 trap "rm -f nixos.qcow2" EXIT
121 ${evals.light}/bin/run-nixos-vm
122 '';
123 docker = pkgs.writeScript "run" ''
124 #!${pkgs.stdenv.shell}
125
126 docker import ${evals.docker}/tarball/nixos-system-*.tar.xz nixos-docker
127 cid=$(docker run --rm --privileged --detach nixos-docker /init)
128 trap "docker stop $cid" EXIT
129 sleep 10
130 docker exec -it $cid /run/current-system/sw/bin/bash
131 '';
132 };
133in
134 lib.mapAttrs (name: v: v // { run = scripts.${name}; eval = evals.${name}; modules = modules.${name};}) scripts
diff --git a/vms/test_django/manage.py b/vms/test_django/manage.py
new file mode 100755
index 0000000..3908dee
--- /dev/null
+++ b/vms/test_django/manage.py
@@ -0,0 +1,21 @@
1#!/nix/store/f87w21b91cws0wbsvyfn5vnlyv491czi-python3-3.8.3/bin/python
2"""Django's command-line utility for administrative tasks."""
3import os
4import sys
5
6
7def main():
8 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings')
9 try:
10 from django.core.management import execute_from_command_line
11 except ImportError as exc:
12 raise ImportError(
13 "Couldn't import Django. Are you sure it's installed and "
14 "available on your PYTHONPATH environment variable? Did you "
15 "forget to activate a virtual environment?"
16 ) from exc
17 execute_from_command_line(sys.argv)
18
19
20if __name__ == '__main__':
21 main()
diff --git a/vms/test_django/test_django/__init__.py b/vms/test_django/test_django/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vms/test_django/test_django/__init__.py
diff --git a/vms/test_django/test_django/__pycache__/__init__.cpython-38.pyc b/vms/test_django/test_django/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..34a31c9
--- /dev/null
+++ b/vms/test_django/test_django/__pycache__/__init__.cpython-38.pyc
Binary files differ
diff --git a/vms/test_django/test_django/__pycache__/settings.cpython-38.pyc b/vms/test_django/test_django/__pycache__/settings.cpython-38.pyc
new file mode 100644
index 0000000..bc32dc4
--- /dev/null
+++ b/vms/test_django/test_django/__pycache__/settings.cpython-38.pyc
Binary files differ
diff --git a/vms/test_django/test_django/__pycache__/urls.cpython-38.pyc b/vms/test_django/test_django/__pycache__/urls.cpython-38.pyc
new file mode 100644
index 0000000..ee44baa
--- /dev/null
+++ b/vms/test_django/test_django/__pycache__/urls.cpython-38.pyc
Binary files differ
diff --git a/vms/test_django/test_django/__pycache__/wsgi.cpython-38.pyc b/vms/test_django/test_django/__pycache__/wsgi.cpython-38.pyc
new file mode 100644
index 0000000..8e5eb2b
--- /dev/null
+++ b/vms/test_django/test_django/__pycache__/wsgi.cpython-38.pyc
Binary files differ
diff --git a/vms/test_django/test_django/settings.py b/vms/test_django/test_django/settings.py
new file mode 100644
index 0000000..6d6cb48
--- /dev/null
+++ b/vms/test_django/test_django/settings.py
@@ -0,0 +1,120 @@
1"""
2Django settings for test_django project.
3
4Generated by 'django-admin startproject' using Django 2.2.13.
5
6For more information on this file, see
7https://docs.djangoproject.com/en/2.2/topics/settings/
8
9For the full list of settings and their values, see
10https://docs.djangoproject.com/en/2.2/ref/settings/
11"""
12
13import os
14
15# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
16BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17
18
19# Quick-start development settings - unsuitable for production
20# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
21
22# SECURITY WARNING: keep the secret key used in production secret!
23SECRET_KEY = '#mvm7ddn4qmsr94a5n-bs#q88&=x_+f(x&dzg!!@@g1!0ibi0f'
24
25# SECURITY WARNING: don't run with debug turned on in production!
26DEBUG = True
27
28ALLOWED_HOSTS = []
29
30
31# Application definition
32
33INSTALLED_APPS = [
34 'django.contrib.admin',
35 'django.contrib.auth',
36 'django.contrib.contenttypes',
37 'django.contrib.sessions',
38 'django.contrib.messages',
39 'django.contrib.staticfiles',
40]
41
42MIDDLEWARE = [
43 'django.middleware.security.SecurityMiddleware',
44 'django.contrib.sessions.middleware.SessionMiddleware',
45 'django.middleware.common.CommonMiddleware',
46 'django.middleware.csrf.CsrfViewMiddleware',
47 'django.contrib.auth.middleware.AuthenticationMiddleware',
48 'django.contrib.messages.middleware.MessageMiddleware',
49 'django.middleware.clickjacking.XFrameOptionsMiddleware',
50]
51
52ROOT_URLCONF = 'test_django.urls'
53
54TEMPLATES = [
55 {
56 'BACKEND': 'django.template.backends.django.DjangoTemplates',
57 'DIRS': [],
58 'APP_DIRS': True,
59 'OPTIONS': {
60 'context_processors': [
61 'django.template.context_processors.debug',
62 'django.template.context_processors.request',
63 'django.contrib.auth.context_processors.auth',
64 'django.contrib.messages.context_processors.messages',
65 ],
66 },
67 },
68]
69
70WSGI_APPLICATION = 'test_django.wsgi.application'
71
72
73# Database
74# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
75
76DATABASES = {
77 'default': {
78 'ENGINE': 'django.db.backends.sqlite3',
79 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
80 }
81}
82
83
84# Password validation
85# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
86
87AUTH_PASSWORD_VALIDATORS = [
88 {
89 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
90 },
91 {
92 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
93 },
94 {
95 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
96 },
97 {
98 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
99 },
100]
101
102
103# Internationalization
104# https://docs.djangoproject.com/en/2.2/topics/i18n/
105
106LANGUAGE_CODE = 'en-us'
107
108TIME_ZONE = 'UTC'
109
110USE_I18N = True
111
112USE_L10N = True
113
114USE_TZ = True
115
116
117# Static files (CSS, JavaScript, Images)
118# https://docs.djangoproject.com/en/2.2/howto/static-files/
119
120STATIC_URL = '/static/'
diff --git a/vms/test_django/test_django/urls.py b/vms/test_django/test_django/urls.py
new file mode 100644
index 0000000..9a2afd8
--- /dev/null
+++ b/vms/test_django/test_django/urls.py
@@ -0,0 +1,21 @@
1"""test_django URL Configuration
2
3The `urlpatterns` list routes URLs to views. For more information please see:
4 https://docs.djangoproject.com/en/2.2/topics/http/urls/
5Examples:
6Function views
7 1. Add an import: from my_app import views
8 2. Add a URL to urlpatterns: path('', views.home, name='home')
9Class-based views
10 1. Add an import: from other_app.views import Home
11 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12Including another URLconf
13 1. Import the include() function: from django.urls import include, path
14 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15"""
16from django.contrib import admin
17from django.urls import path
18
19urlpatterns = [
20 path('admin/', admin.site.urls),
21]
diff --git a/vms/test_django/test_django/wsgi.py b/vms/test_django/test_django/wsgi.py
new file mode 100644
index 0000000..984650c
--- /dev/null
+++ b/vms/test_django/test_django/wsgi.py
@@ -0,0 +1,16 @@
1"""
2WSGI config for test_django project.
3
4It exposes the WSGI callable as a module-level variable named ``application``.
5
6For more information on this file, see
7https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
8"""
9
10import os
11
12from django.core.wsgi import get_wsgi_application
13
14os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings')
15
16application = get_wsgi_application()