flake.nix 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. {
  2. inputs = {
  3. nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
  4. flake-utils.url = github:numtide/flake-utils;
  5. drawio2py.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/drawio2py.git?ref=library;
  6. xopp2py.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/xopp2py.git;
  7. drawio.url = git+ssh://git@msdl.uantwerpen.be/jexelmans/drawio.git;
  8. wee.url = git+ssh://git@msdl.uantwerpen.be/lucasalbertins/wee.git;
  9. };
  10. outputs = { self, nixpkgs, flake-utils, drawio2py, xopp2py, drawio, wee }:
  11. flake-utils.lib.eachDefaultSystem (system:
  12. let
  13. pkgs = nixpkgs.legacyPackages.${system};
  14. myLibs = {
  15. drawio2py = drawio2py.defaultPackage.${system};
  16. xopp2py = xopp2py.defaultPackage.${system};
  17. };
  18. in rec {
  19. packages = rec {
  20. # Python library
  21. drawio2oml =
  22. let
  23. drawioWebRoot = drawio.packages.${system}.webRoot;
  24. in
  25. pkgs.python3Packages.buildPythonPackage {
  26. pname = "drawio2oml";
  27. version = "1.0.0";
  28. src = ./.; # location of setup.py
  29. propagatedBuildInputs = [
  30. myLibs.drawio2py
  31. pkgs.python3Packages.jinja2
  32. pkgs.python3Packages.requests
  33. ];
  34. checkPhase = ''
  35. runHook preCheck
  36. DRAWIOSHAPELIBS="${drawioWebRoot}/share/myPlugins/shape_libs" ${pkgs.python3}/bin/python -m unittest test.run_tests
  37. runHook postCheck
  38. '';
  39. };
  40. # The backend script - to be called with PROJECTDIR argument
  41. backend =
  42. let
  43. # By default, gradle depends on 'full java'. For our purposes, this is not necessary:
  44. gradleHeadless = pkgs.gradle.override { java=pkgs.jdk19_headless; };
  45. in
  46. pkgs.python3Packages.buildPythonApplication {
  47. pname = "dtdesign-backend";
  48. version = "1.0.0";
  49. src = ./backend; # location of setup.py
  50. # The backend scripts needs the gradle binary in its PATH:
  51. makeWrapperArgs = [ "--set PATH \\$PATH:${gradleHeadless}/bin/" ];
  52. propagatedBuildInputs = [
  53. myLibs.drawio2py
  54. myLibs.xopp2py
  55. drawio2oml
  56. pkgs.python3Packages.flask
  57. pkgs.python3Packages.flask-cors
  58. ];
  59. };
  60. # Service monitor - PROJECTDIR needs to be passed as environment variable
  61. # Runs 4 services:
  62. # - Fuseki
  63. # - Lighttpd
  64. # - backend script (defined above)
  65. # - Workflow Enactment Engine (Wee™)
  66. serviceMonitor =
  67. let
  68. # Build the latest Fuseki version, and tell it to use headless Java:
  69. fusekiHeadless = (import ./backend/fuseki.nix) { pkgs=pkgs; java=pkgs.jdk19_headless; };
  70. drawioStaticServer = drawio.packages.${system}.staticServer;
  71. weeServer = wee.packages.${system}.wee;
  72. commonSettings = ''
  73. stdout_logfile=/dev/stdout
  74. stdout_logfile_maxbytes=0
  75. redirect_stderr=true
  76. startretries=1
  77. killasgroup=true
  78. '';
  79. supervisordConfigFile = pkgs.writeTextFile {
  80. name = "supervisord.conf";
  81. text = ''
  82. [supervisord]
  83. nodaemon=true
  84. logfile_maxbytes=0
  85. [program:fuseki]
  86. directory=%(ENV_PROJECTDIR)s/.fuseki
  87. command=${fusekiHeadless}/bin/fuseki run
  88. environment=FUSEKI_BASE="%(ENV_PROJECTDIR)s/.fuseki/run",PATH="${pkgs.which}/bin:${pkgs.coreutils}/bin:%(ENV_PATH)s",FUSEKI_CONF="%(ENV_PROJECTDIR)s/.fuseki.ttl"
  89. ${commonSettings}
  90. [program:lighttpd]
  91. command=${drawioStaticServer}/bin/drawio-msdl-staticserver
  92. ${commonSettings}
  93. [program:backend]
  94. command=${backend}/bin/dtdesign-backend %(ENV_PROJECTDIR)s
  95. ${commonSettings}
  96. [program:wee]
  97. command=${weeServer}/bin/wee
  98. ${commonSettings}
  99. '';
  100. };
  101. runner = pkgs.writeShellScript "dtdesign_service_monitor.sh" ''
  102. if [[ -z "''${PROJECTDIR}" ]]; then
  103. echo "Error: Please set the environment variable PROJECTDIR to the 'SystemDesignOntology2Layers' directory."
  104. exit 1
  105. fi
  106. exec ${pkgs.python3Packages.supervisor}/bin/supervisord -c ${supervisordConfigFile}
  107. '';
  108. in
  109. pkgs.stdenv.mkDerivation {
  110. name = "dtdesign-service-monitor";
  111. src = ./.;
  112. installPhase = ''
  113. mkdir -p $out/bin
  114. cp ${runner} $out/bin/serviceMonitor
  115. '';
  116. };
  117. # Docker container - no dependencies (contains its own PROJECTDIR clone)
  118. dockerContainer =
  119. let
  120. dtdesignRepo = builtins.fetchGit {
  121. url = "git@msdl.uantwerpen.be:lucasalbertins/DTDesign.git";
  122. rev = "795cb854077d82fa6370ad64b8b6f06530e11bbc";
  123. ref = "main";
  124. shallow = true;
  125. };
  126. in pkgs.dockerTools.buildImage {
  127. name = "dtdesign-backend";
  128. runAsRoot = ''
  129. #!${pkgs.runtimeShell}
  130. mkdir /tmp
  131. cp -r ${dtdesignRepo}/examples/oml/SystemDesignOntology2Layers /projectdir
  132. '';
  133. config = {
  134. Env = [ "PROJECTDIR=/projectdir" ]; # tell the script where the projectdir is at.
  135. Cmd = [ "${serviceMonitor}" ]; # ran when container starts
  136. ExposedPorts = {
  137. "5000/tcp" = {}; # python backend
  138. "3030/tcp" = {}; # fuseki
  139. "8700/tcp" = {}; # lightttp (serving drawio)
  140. };
  141. Volumes = {
  142. "/projectdir" = {}; # path to persist as Docker 'Volume'
  143. };
  144. };
  145. };
  146. };
  147. defaultPackage = packages.drawio2oml;
  148. apps = rec {
  149. # App that starts when invoking `nix run .#serviceMonitor`
  150. serviceMonitor = {
  151. type = "app";
  152. program = "${self.packages.${system}.serviceMonitor}/bin/serviceMonitor";
  153. };
  154. # App that starts when invoking `nix run .`
  155. default = serviceMonitor;
  156. };
  157. });
  158. nixConfig.bash-prompt-prefix = "\\e\[94;1m[drawio2oml]\\e\[m ";
  159. }