Author: sandervanderburg
Date: Thu Oct  7 14:30:52 2010
New Revision: 24146
URL: https://svn.nixos.org/websvn/nix/?rev=24146&sc=1

Log:
Added the nixos-deploy-network tool. With this tool you can write a network of 
NixOS configurations, e.g.:

{
  test1 = {pkgs, config, ...}:
    {
       # NixOS config of machine test1
       ...
    };

  test2 = {pkgs, config, ...}:
    {
       # NixOS config of machine test2
       ...
    };
}

And an infrastructure expression, e.g:

{
  test1 = {
    hostName = "test1.example.org";
    system = "i686-linux";
  };
  test2 = {
    hostName = "test2.example.org";
    system = "x86_64-linux";
  };
}

And by executing:

nixos-deploy-network -n network.nix -i infrastructure.nix

The system configurations in the network expression are built, transferred to 
the machines in the network and finally activated.

Added:
   nixos/trunk/modules/installer/tools/nixos-deploy-network/
   nixos/trunk/modules/installer/tools/nixos-deploy-network/deploy.nix
   
nixos/trunk/modules/installer/tools/nixos-deploy-network/nixos-deploy-network.sh
Modified:
   nixos/trunk/modules/installer/tools/tools.nix

Added: nixos/trunk/modules/installer/tools/nixos-deploy-network/deploy.nix
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ nixos/trunk/modules/installer/tools/nixos-deploy-network/deploy.nix Thu Oct 
 7 14:30:52 2010        (r24146)
@@ -0,0 +1,61 @@
+{ nixos ? /etc/nixos/nixos
+, nixpkgs ? /etc/nixos/nixpkgs
+, networkExpr
+, infrastructureExpr
+}:
+
+let
+  pkgs = import nixpkgs {};
+  
+  inherit (builtins) attrNames getAttr listToAttrs concatMapStrings;
+  
+  network = import networkExpr;
+  infrastructure = import infrastructureExpr;
+ 
+  generateScript = network: infrastructure: configs:
+    concatMapStrings (configurationName: 
+      let
+        infrastructureElement = getAttr configurationName infrastructure;
+       config = getAttr configurationName configs;
+      in
+      ''
+        echo "=== upgrading ${infrastructureElement.hostName} ==="
+        nix-copy-closure --to ${infrastructureElement.hostName} 
${config.system.build.toplevel} \
+        && ssh $NIX_SSHOPTS ${infrastructureElement.hostName} nix-env -p 
/nix/var/nix/profiles/system --set ${config.system.build.toplevel} \
+        && ssh $NIX_SSHOPTS ${infrastructureElement.hostName} 
${config.system.build.toplevel}/bin/switch-to-configuration switch \
+        && { succeeded=$((succeeded + 1)); } \
+        || { failed=$((failed + 1)); echo 'WARNING: upgrade of 
${infrastructureElement.hostName} failed!'; }
+      ''
+    ) (attrNames network)
+  ;
+
+  evaluateMachines = network: infrastructure:
+    listToAttrs (map (configurationName:
+      let
+        configuration = getAttr configurationName network;
+        system = (getAttr configurationName infrastructure).system;
+      in
+      { name = configurationName;
+        value = (import "${nixos}/lib/eval-config.nix" {
+          inherit nixpkgs system;
+          modules = [ configuration ];
+          extraArgs = evaluateMachines network infrastructure;
+        }).config; }
+    ) (attrNames (network)))
+  ;
+
+  configs = evaluateMachines network infrastructure;
+in
+pkgs.stdenv.mkDerivation {
+  name = "deploy-script";
+  buildCommand = ''
+    ensureDir $out/bin
+    cat > $out/bin/deploy-systems << "EOF"
+    #! ${pkgs.stdenv.shell} -e
+    failed=0; succeeded=0
+    ${generateScript network infrastructure configs}
+    echo "Upgrade of $failed machines failed, $succeeded machines succeeded.";
+    EOF
+    chmod +x $out/bin/deploy-systems
+  '';
+}

Added: 
nixos/trunk/modules/installer/tools/nixos-deploy-network/nixos-deploy-network.sh
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ 
nixos/trunk/modules/installer/tools/nixos-deploy-network/nixos-deploy-network.sh
    Thu Oct  7 14:30:52 2010        (r24146)
@@ -0,0 +1,73 @@
+#! @shell@ -e
+
+# Shows the usage of this command to the user
+
+showUsage()
+{
+    echo "Usage: $0 -n network_expr -i infrastructure_expr"
+    echo "Options:"
+    echo
+    echo "-n,--network        Network Nix expression which captures properties 
of machines in the network"
+    echo "-i,--infrastructure Infrastructure Nix expression which captures 
properties of machines in the network"
+    echo "-h,--help           Shows the usage of this command"
+}
+
+# Parse valid argument options
+
+PARAMS=`getopt -n $0 -o n:i:h -l network:,infrastructure:,show-trace,help -- 
"$@"`
+
+if [ $? != 0 ]
+then
+    showUsage
+    exit 1
+fi
+
+eval set -- "$PARAMS"
+
+# Evaluate valid options
+
+while [ "$1" != "--" ]
+do
+    case "$1" in
+       -n|--network)
+           networkExpr=`readlink -f $2`
+           ;;
+       -i|--infrastructure)
+           infrastructureExpr=`readlink -f $2`
+           ;;
+       --show-trace)
+           showTraceArg="--show-trace"
+           ;;
+       -h|--help)
+           showUsage
+           exit 0
+           ;;
+    esac
+    
+    shift
+done
+
+# Validate the given options
+
+if [ "$infrastructureExpr" = "" ]
+then
+    echo "ERROR: A infrastructure expression must be specified!" >&2
+    exit 1
+fi
+
+if [ "$networkExpr" = "" ]
+then
+    echo "ERROR: A network expression must be specified!" >&2
+    exit 1
+fi
+
+if [ -z "$NIXOS" ]
+then
+    NIXOS=/etc/nixos/nixos
+fi
+
+# Deploy the network
+
+nix-build $NIXOS/deploy.nix --argstr networkExpr $networkExpr --argstr 
infrastructureExpr $infrastructureExpr $showTraceArg
+./result/bin/deploy-systems
+rm -f result

Modified: nixos/trunk/modules/installer/tools/tools.nix
==============================================================================
--- nixos/trunk/modules/installer/tools/tools.nix       Thu Oct  7 14:06:44 
2010        (r24145)
+++ nixos/trunk/modules/installer/tools/tools.nix       Thu Oct  7 14:30:52 
2010        (r24146)
@@ -11,6 +11,11 @@
     isExecutable = true;
   });
   
+  nixosDeployNetwork = makeProg {
+    name = "nixos-deploy-network";
+    src = ./nixos-deploy-network/nixos-deploy-network.sh;
+  };
+  
   nixosInstall = makeProg {
     name = "nixos-install";
     src = ./nixos-install.sh;
@@ -126,7 +131,8 @@
 
   config = {
     environment.systemPackages =
-      [ nixosInstall
+      [ nixosDeployNetwork
+        nixosInstall
         nixosRebuild
          nixosHardwareScan
          nixosGenSeccureKeys
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to