<refentry xmlns="http://docbook.org/ns/docbook"
          xmlns:xlink="http://www.w3.org/1999/xlink"
          xmlns:xi="http://www.w3.org/2001/XInclude">
 <refmeta>
  <refentrytitle><command>nixos-build-vms</command>
  </refentrytitle><manvolnum>8</manvolnum>
  <refmiscinfo class="source">NixOS</refmiscinfo>
<!-- <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> -->
 </refmeta>
 <refnamediv>
  <refname><command>nixos-build-vms</command>
  </refname><refpurpose>build a network of virtual machines from a network of NixOS configurations</refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <cmdsynopsis>
   <command>nixos-build-vms</command> 
   <arg>
    <option>--show-trace</option>
   </arg>
    
   <arg>
    <option>--no-out-link</option>
   </arg>
    
   <arg>
    <option>--help</option>
  </arg>

  <arg>
    <option>--option</option>
    <replaceable>name</replaceable>
    <replaceable>value</replaceable>
  </arg>

   <arg choice="plain">
    <replaceable>network.nix</replaceable>
   </arg>
  </cmdsynopsis>
 </refsynopsisdiv>
 <refsection>
  <title>Description</title>
  <para>
   This command builds a network of QEMU-KVM virtual machines of a Nix
   expression specifying a network of NixOS machines. The virtual network can
   be started by executing the <filename>bin/run-vms</filename> shell script
   that is generated by this command. By default, a <filename>result</filename>
   symlink is produced that points to the generated virtual network.
  </para>
  <para>
   A network Nix expression has the following structure:
<screen>
{
  test1 = {pkgs, config, ...}:
    {
      services.openssh.enable = true;
      nixpkgs.localSystem.system = "i686-linux";
      deployment.targetHost = "test1.example.net";

      # Other NixOS options
    };

  test2 = {pkgs, config, ...}:
    {
      services.openssh.enable = true;
      services.httpd.enable = true;
      environment.systemPackages = [ pkgs.lynx ];
      nixpkgs.localSystem.system = "x86_64-linux";
      deployment.targetHost = "test2.example.net";

      # Other NixOS options
    };
}
</screen>
   Each attribute in the expression represents a machine in the network (e.g.
   <varname>test1</varname> and <varname>test2</varname>) referring to a
   function defining a NixOS configuration. In each NixOS configuration, two
   attributes have a special meaning. The
   <varname>deployment.targetHost</varname> specifies the address (domain name
   or IP address) of the system which is used by <command>ssh</command> to
   perform remote deployment operations. The
   <varname>nixpkgs.localSystem.system</varname> attribute can be used to
   specify an architecture for the target machine, such as
   <varname>i686-linux</varname> which builds a 32-bit NixOS configuration.
   Omitting this property will build the configuration for the same
   architecture as the host system.
  </para>
 </refsection>
 <refsection>
  <title>Options</title>
  <para>
   This command accepts the following options:
  </para>
  <variablelist>
   <varlistentry>
    <term>
     <option>--show-trace</option>
    </term>
    <listitem>
     <para>
      Shows a trace of the output.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>
     <option>--no-out-link</option>
    </term>
    <listitem>
     <para>
      Do not create a 'result' symlink.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>
     <option>-h</option>, <option>--help</option>
    </term>
    <listitem>
     <para>
      Shows the usage of this command to the user.
     </para>
    </listitem>
   </varlistentry>
   <varlistentry>
    <term>
     <option>--option</option> <replaceable>name</replaceable> <replaceable>value</replaceable>
    </term>
    <listitem>
     <para>Set the Nix configuration option
      <replaceable>name</replaceable> to <replaceable>value</replaceable>.
      This overrides settings in the Nix configuration file (see
      <citerefentry><refentrytitle>nix.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsection>
</refentry>
