diff options
Diffstat (limited to 'vms')
-rw-r--r-- | vms/Makefile | 23 | ||||
-rw-r--r-- | vms/README | 7 | ||||
-rw-r--r-- | vms/configuration.nix | 25 | ||||
-rw-r--r-- | vms/images.nix | 134 | ||||
-rwxr-xr-x | vms/test_django/manage.py | 21 | ||||
-rw-r--r-- | vms/test_django/test_django/__init__.py | 0 | ||||
-rw-r--r-- | vms/test_django/test_django/__pycache__/__init__.cpython-38.pyc | bin | 0 -> 152 bytes | |||
-rw-r--r-- | vms/test_django/test_django/__pycache__/settings.cpython-38.pyc | bin | 0 -> 2304 bytes | |||
-rw-r--r-- | vms/test_django/test_django/__pycache__/urls.cpython-38.pyc | bin | 0 -> 933 bytes | |||
-rw-r--r-- | vms/test_django/test_django/__pycache__/wsgi.cpython-38.pyc | bin | 0 -> 563 bytes | |||
-rw-r--r-- | vms/test_django/test_django/settings.py | 120 | ||||
-rw-r--r-- | vms/test_django/test_django/urls.py | 21 | ||||
-rw-r--r-- | vms/test_django/test_django/wsgi.py | 16 |
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 | ||
2 | run_light: | ||
3 | $(shell nix-build images.nix --no-out-link -A light) | ||
4 | |||
5 | .PHONY: run_standalone | ||
6 | run_standalone: | ||
7 | $(shell nix-build images.nix --no-out-link -A standalone) | ||
8 | |||
9 | .PHONY: run_docker | ||
10 | run_docker: | ||
11 | $(shell nix-build images.nix --no-out-link -A docker) | ||
12 | |||
13 | .PHONY: build_light | ||
14 | build_light: | ||
15 | nix-build images.nix --no-out-link -A light.eval | ||
16 | |||
17 | .PHONY: build_standalone | ||
18 | build_standalone: | ||
19 | nix-build images.nix --no-out-link -A standalone.eval | ||
20 | |||
21 | .PHONY: build_docker | ||
22 | build_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 @@ | |||
1 | This 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 | |||
6 | In last two cases, you may build an image or directly execute it (see | ||
7 | Makefile) | ||
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 @@ | |||
1 | let | ||
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 | }; | ||
133 | in | ||
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.""" | ||
3 | import os | ||
4 | import sys | ||
5 | |||
6 | |||
7 | def 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 | |||
20 | if __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 | """ | ||
2 | Django settings for test_django project. | ||
3 | |||
4 | Generated by 'django-admin startproject' using Django 2.2.13. | ||
5 | |||
6 | For more information on this file, see | ||
7 | https://docs.djangoproject.com/en/2.2/topics/settings/ | ||
8 | |||
9 | For the full list of settings and their values, see | ||
10 | https://docs.djangoproject.com/en/2.2/ref/settings/ | ||
11 | """ | ||
12 | |||
13 | import os | ||
14 | |||
15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) | ||
16 | BASE_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! | ||
23 | SECRET_KEY = '#mvm7ddn4qmsr94a5n-bs#q88&=x_+f(x&dzg!!@@g1!0ibi0f' | ||
24 | |||
25 | # SECURITY WARNING: don't run with debug turned on in production! | ||
26 | DEBUG = True | ||
27 | |||
28 | ALLOWED_HOSTS = [] | ||
29 | |||
30 | |||
31 | # Application definition | ||
32 | |||
33 | INSTALLED_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 | |||
42 | MIDDLEWARE = [ | ||
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 | |||
52 | ROOT_URLCONF = 'test_django.urls' | ||
53 | |||
54 | TEMPLATES = [ | ||
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 | |||
70 | WSGI_APPLICATION = 'test_django.wsgi.application' | ||
71 | |||
72 | |||
73 | # Database | ||
74 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases | ||
75 | |||
76 | DATABASES = { | ||
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 | |||
87 | AUTH_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 | |||
106 | LANGUAGE_CODE = 'en-us' | ||
107 | |||
108 | TIME_ZONE = 'UTC' | ||
109 | |||
110 | USE_I18N = True | ||
111 | |||
112 | USE_L10N = True | ||
113 | |||
114 | USE_TZ = True | ||
115 | |||
116 | |||
117 | # Static files (CSS, JavaScript, Images) | ||
118 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ | ||
119 | |||
120 | STATIC_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 | |||
3 | The `urlpatterns` list routes URLs to views. For more information please see: | ||
4 | https://docs.djangoproject.com/en/2.2/topics/http/urls/ | ||
5 | Examples: | ||
6 | Function views | ||
7 | 1. Add an import: from my_app import views | ||
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') | ||
9 | Class-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') | ||
12 | Including 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 | """ | ||
16 | from django.contrib import admin | ||
17 | from django.urls import path | ||
18 | |||
19 | urlpatterns = [ | ||
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 | """ | ||
2 | WSGI config for test_django project. | ||
3 | |||
4 | It exposes the WSGI callable as a module-level variable named ``application``. | ||
5 | |||
6 | For more information on this file, see | ||
7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ | ||
8 | """ | ||
9 | |||
10 | import os | ||
11 | |||
12 | from django.core.wsgi import get_wsgi_application | ||
13 | |||
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings') | ||
15 | |||
16 | application = get_wsgi_application() | ||