<commit_before><?xml version="1.0" encoding="UTF-8"?>
<section xmlns="http://docbook.org/ns/docbook"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  version="5.0"
  xml:id="neutron-network-node">
  <title>Install and configure network node</title>
  <para>The network node primarily handles internal and external routing
    and <glossterm>DHCP</glossterm> services for virtual networks.</para>
  <procedure>
    <title>To configure prerequisites</title>
    <para>Before you install and configure OpenStack Networking, you
      must configure certain kernel networking parameters.</para>
    <step>
      <para>Edit the <filename>/etc/sysctl.conf</filename> file to
        contain the following parameters:</para>
      <programlisting>net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0</programlisting>
    </step>
    <step>
      <para>Implement the changes:</para>
      <screen><prompt>#</prompt> <userinput>sysctl -p</userinput></screen>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To install the Networking components</title>
    <step>
      <screen os="ubuntu"><prompt>#</prompt> <userinput>apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent \
  neutron-l3-agent neutron-dhcp-agent</userinput></screen>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-openvswitch</userinput></screen>
      <screen os="sles;opensuse"><prompt>#</prompt> <userinput>zypper install --no-recommends openstack-neutron-openvswitch-agent openstack-neutron-l3-agent \
  openstack-neutron-dhcp-agent openstack-neutron-metadata-agent ipset</userinput></screen>
      <note os="sles;opensuse">
        <para>SUSE does not use a separate ML2 plug-in package.</para>
      </note>
    </step>
  </procedure>
  <procedure os="debian">
    <title>To install and configure the Networking components</title>
    <step>
      <screen><prompt>#</prompt> <userinput>apt-get install neutron-plugin-openvswitch-agent openvswitch-datapath-dkms \
  neutron-l3-agent neutron-dhcp-agent</userinput></screen>
      <note>
        <para>Debian does not use a separate ML2 plug-in package.</para>
      </note>
    </step>
    <step>
      <para>Respond to prompts for
        <link linkend="debconf-dbconfig-common">database management</link>,
        <link linkend="debconf-keystone_authtoken">Identity service
        credentials</link>,
        <link linkend="debconf-api-endpoints">service endpoint
        registration</link>, and
        <link linkend="debconf-rabbitmq">message broker
        credentials</link>.</para>
    </step>
    <step>
       <para>Select the ML2 plug-in:</para>
       <informalfigure>
        <mediaobject>
          <imageobject>
            <imagedata scale="50"
              fileref="figures/debconf-screenshots/neutron_1_plugin_selection.png"
            />
          </imageobject>
        </mediaobject>
      </informalfigure>
      <note>
        <para>Selecting the ML2 plug-in also populates the
          <option>service_plugins</option> and
          <option>allow_overlapping_ips</option> options in the
          <filename>/etc/neutron/neutron.conf</filename> file with the
          appropriate values.</para>
      </note>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To configure the Networking common components</title>
    <para>The Networking common component configuration includes the
      authentication mechanism, message broker, and plug-in.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/neutron.conf</filename> file
        and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[database]</literal> section, comment out
            any <literal>connection</literal> options because network nodes
            do not directly access the database.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            <application>RabbitMQ</application> message broker access:</para>
          <programlisting language="ini">[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = <replaceable>controller</replaceable>
rabbit_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>RABBIT_PASS</replaceable> with the
            password you chose for the <literal>guest</literal> account in
            <application>RabbitMQ</application>.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> and
            <literal>[keystone_authtoken]</literal> sections,
            configure Identity service access:</para>
          <programlisting language="ini">[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri = http://<replaceable>controller</replaceable>:5000/v2.0
identity_uri = http://<replaceable>controller</replaceable>:35357
admin_tenant_name = service
admin_user = neutron
admin_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>NEUTRON_PASS</replaceable> with the
            password you chose or the <literal>neutron</literal> user in the
            Identity service.</para>
          <note>
            <para>Comment out any <literal>auth_host</literal>,
              <literal>auth_port</literal>, and
              <literal>auth_protocol</literal> options because the
              <literal>identity_uri</literal> option replaces them.</para>
          </note>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section,
           enable the Modular Layer 2 (ML2) plug-in,
           router service, and overlapping IP addresses:</para>
          <programlisting language="ini">[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True</programlisting>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the Modular Layer 2 (ML2) plug-in</title>
    <para>The ML2 plug-in uses the
      <glossterm baseform="Open vSwitch">Open vSwitch (OVS)</glossterm>
      mechanism (agent) to build the virtual networking framework for
      instances.</para>
    <step>
      <para>Edit the
        <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename>
        file and complete the following actions:</para>
      <substeps>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[ml2]</literal> section, enable the
            <glossterm baseform="flat network">flat</glossterm> and
            <glossterm>generic routing encapsulation (GRE)</glossterm>
            network type drivers, GRE tenant networks, and the OVS
            mechanism driver:</para>
          <programlisting language="ini">[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch</programlisting>
        </step>
        <step>
          <para>In the <literal>[ml2_type_flat]</literal> section,
           configure the external flat provider network:</para>
          <programlisting language="ini">[ml2_type_flat]
...
flat_networks = external</programlisting>
        </step>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[ml2_type_gre]</literal> section,
           configure the tunnel identifier (id) range:</para>
          <programlisting language="ini">[ml2_type_gre]
...
tunnel_id_ranges = 1:1000</programlisting>
        </step>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[securitygroup]</literal>
           section, enable security groups, enable
           <glossterm>ipset</glossterm>, and configure
           the OVS <glossterm>iptables</glossterm> firewall
           driver:</para>
          <programlisting language="ini">[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver</programlisting>
        </step>
        <step>
          <para>In the <literal>[ovs]</literal> section, enable tunnels,
            configure the local tunnel endpoint, and map the external flat
            provider network to the <literal>br-ex</literal> external
            network bridge:</para>
          <programlisting language="ini">[ovs]
...
local_ip = <replaceable>INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS</replaceable>
enable_tunneling = True
bridge_mappings = external:br-ex</programlisting>
          <para>Replace
            <replaceable>INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS</replaceable>
            with the IP address of the instance
            tunnels network interface on your network node.</para>
        </step>
        <step>
          <para>In the <literal>[agent]</literal> section, enable GRE
            tunnels:</para>
          <programlisting language="ini">[agent]
...
tunnel_types = gre</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To configure the Layer-3 (L3) agent</title>
    <para>The <glossterm>Layer-3 (L3) agent</glossterm> provides
      routing services for virtual networks.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/l3_agent.ini</filename>
       file and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            the driver, enable
            <glossterm baseform="network namespace">network
            namespaces</glossterm>, configure the external network bridge
            and enable deletion of defunct router namespaces:</para>
          <programlisting language="ini">[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br-ex
router_delete_namespaces = True</programlisting>
          <note os="sles">
            <para>Due to an issue with old versions of the
              <application>iproute2</application> utility, we recommend
              that you do not configure the
              <option>router_delete_namespaces</option> option on SLES 11
              SP3.</para>
            </note>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the DHCP agent</title>
    <para>The <glossterm>DHCP agent</glossterm> provides DHCP
      services for virtual networks.</para>
    <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
      <para>Edit the
       <filename>/etc/neutron/dhcp_agent.ini</filename> file
       and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            the drivers, enable namespaces and enable deletion of defunct
            DHCP namespaces:</para>
          <programlisting language="ini">[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
dhcp_delete_namespaces = True</programlisting>
          <note os="sles">
            <para>Due to an issue with old versions of the
              <application>iproute2</application> utility, we recommend
              that you do not configure the
              <option>dhcp_delete_namespaces</option> option on SLES 11
              SP3.</para>
            </note>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
    <step>
      <para>(Optional)</para>
      <para>Tunneling protocols such as GRE include additional packet
        headers that increase overhead and decrease space available for the
        payload or user data. Without knowledge of the virtual network
        infrastructure, instances attempt to send packets using the default
        Ethernet <glossterm>maximum transmission unit (MTU)</glossterm> of
        1500 bytes. <glossterm>Internet protocol (IP)</glossterm> networks
        contain the <glossterm>path MTU discovery (PMTUD)</glossterm>
        mechanism to detect end-to-end MTU and adjust packet size
        accordingly. However, some operating systems and networks block or
        otherwise lack support for PMTUD causing performance degradation
        or connectivity failure.</para>
      <para>Ideally, you can prevent these problems by enabling
        <glossterm baseform="jumbo frame">jumbo frames</glossterm> on the
        physical network that contains your tenant virtual networks.
        Jumbo frames support MTUs up to approximately 9000 bytes which
        negates the impact of GRE overhead on virtual networks. However,
        many network devices lack support for jumbo frames and OpenStack
        administrators often lack control over network infrastructure.
        Given the latter complications, you can also prevent MTU problems
        by reducing the instance MTU to account for GRE overhead.
        Determining the proper MTU value often takes experimentation,
        but 1454 bytes works in most environments. You can configure the
        DHCP server that assigns IP addresses to your instances to also
        adjust the MTU.</para>
      <note>
        <para>Some cloud images ignore the DHCP MTU option in which case
          you should configure it using metadata, a script, or another suitable
          method.</para>
      </note>
      <substeps>
        <step>
          <para>Edit the <filename>/etc/neutron/dhcp_agent.ini</filename>
            file and complete the following action:</para>
          <substeps>
            <step>
              <para>In the <literal>[DEFAULT]</literal> section, enable the
                <glossterm>dnsmasq</glossterm> configuration file:</para>
              <programlisting language="ini">[DEFAULT]
...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf</programlisting>
            </step>
          </substeps>
        </step>
        <step>
          <para>Create and edit the
            <filename>/etc/neutron/dnsmasq-neutron.conf</filename> file and
            complete the following action:</para>
          <substeps>
            <step>
              <para>Enable the DHCP MTU option (26) and configure it to
                1454 bytes:</para>
              <programlisting language="ini">dhcp-option-force=26,1454</programlisting>
            </step>
          </substeps>
        </step>
        <step>
          <para>Kill any existing
            <systemitem role="process">dnsmasq</systemitem> processes:</para>
            <screen><prompt>#</prompt> <userinput>pkill dnsmasq</userinput></screen>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the metadata agent</title>
    <para>The <glossterm baseform="Metadata agent">metadata agent</glossterm>
      provides configuration information such as credentials to
      instances.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/metadata_agent.ini</filename>
        file and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            access parameters:</para>
          <programlisting language="ini">[DEFAULT]
...
auth_url = http://<replaceable>controller</replaceable>:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>NEUTRON_PASS</replaceable> with the
            password you chose for the <literal>neutron</literal> user in
            the Identity service.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure the
            metadata host:</para>
          <programlisting language="ini">[DEFAULT]
...
nova_metadata_ip = <replaceable>controller</replaceable></programlisting>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure the
            metadata proxy shared secret:</para>
          <programlisting language="ini">[DEFAULT]
...
metadata_proxy_shared_secret = <replaceable>METADATA_SECRET</replaceable></programlisting>
          <para>Replace <replaceable>METADATA_SECRET</replaceable> with a
            suitable secret for the metadata proxy.</para>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
    <step>
      <para>On the <emphasis>controller</emphasis> node, edit the
        <filename>/etc/nova/nova.conf</filename> file and complete the
        following action:</para>
      <substeps>
        <step>
          <para>In the <literal>[neutron]</literal> section, enable the
            metadata proxy and configure the secret:</para>
          <programlisting language="ini">[neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = <replaceable>METADATA_SECRET</replaceable></programlisting>
          <para>Replace <replaceable>METADATA_SECRET</replaceable> with
            the secret you chose for the metadata proxy.</para>
        </step>
      </substeps>
    </step>
    <step>
      <para>On the <emphasis>controller</emphasis> node, restart the
        Compute <glossterm>API</glossterm> service:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl restart openstack-nova-api.service</userinput></screen>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openstack-nova-api restart</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl restart openstack-nova-api.service</userinput></screen>
      <screen os="ubuntu;debian"><prompt>#</prompt> <userinput>service nova-api restart</userinput></screen>
    </step>
  </procedure>
  <procedure>
    <title>To configure the Open vSwitch (OVS) service</title>
    <para>The OVS service provides the underlying virtual networking
      framework for instances. The integration bridge
      <literal>br-int</literal> handles internal instance network
      traffic within OVS. The external bridge <literal>br-ex</literal>
      handles external instance network traffic within OVS. The
      external bridge requires a port on the physical external network
      interface to provide instances with external network access. In
      essence, this port connects the virtual and physical external
      networks in your environment.</para>
    <step os="rhel;centos;fedora;sles;opensuse">
      <para>Start the OVS service and configure it to start when the
        system boots:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl enable openvswitch.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openvswitch.service</userinput></screen>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openvswitch-switch start</userinput>
<prompt>#</prompt> <userinput>chkconfig openvswitch-switch on</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl enable openvswitch.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openvswitch.service</userinput></screen>
    </step>
    <step os="debian;ubuntu">
      <para>Restart the OVS service:</para>
      <screen><prompt>#</prompt> <userinput>service openvswitch-switch restart</userinput></screen>
    </step>
    <step>
      <para>Add the external bridge:</para>
      <screen><prompt>#</prompt> <userinput>ovs-vsctl add-br br-ex</userinput></screen>
    </step>
    <step>
      <para>Add a port to the external bridge that connects to the
        physical external network interface:</para>
      <para>Replace <replaceable>INTERFACE_NAME</replaceable> with the
        actual interface name. For example, <emphasis>eth2</emphasis>
        or <emphasis>ens256</emphasis>.</para>
      <screen><prompt>#</prompt> <userinput>ovs-vsctl add-port br-ex <replaceable>INTERFACE_NAME</replaceable></userinput></screen>
      <note>
        <para>Depending on your network interface driver, you may need
          to disable <glossterm>generic receive offload
            (GRO)</glossterm> to achieve suitable throughput between
          your instances and the external network.</para>
        <para>To temporarily disable GRO on the external network
          interface while testing your environment:</para>
        <screen><prompt>#</prompt> <userinput>ethtool -K <replaceable>INTERFACE_NAME</replaceable> gro off</userinput></screen>
      </note>
    </step>
  </procedure>
  <procedure>
    <title>To finalize the installation</title>
    <step os="rhel;centos;fedora">
      <para>The Networking service initialization scripts expect a
        symbolic link <filename>/etc/neutron/plugin.ini</filename>
        pointing to the ML2 plug-in configuration file,
        <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename>.
        If this symbolic link does not exist, create it using the
        following command:</para>
      <screen><prompt>#</prompt> <userinput>ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini</userinput></screen>
      <para>Due to a packaging bug, the Open vSwitch agent initialization
        script explicitly looks for the Open vSwitch plug-in configuration
        file rather than a symbolic link
        <filename>/etc/neutron/plugin.ini</filename> pointing to the ML2
        plug-in configuration file. Run the following commands to resolve this
        issue:</para>
      <screen><prompt>#</prompt> <userinput>cp /usr/lib/systemd/system/neutron-openvswitch-agent.service \
  /usr/lib/systemd/system/neutron-openvswitch-agent.service.orig</userinput>
<prompt>#</prompt> <userinput>sed -i 's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g' \
  /usr/lib/systemd/system/neutron-openvswitch-agent.service</userinput></screen>
    </step>
    <step os="sles;opensuse">
      <para>The Networking service initialization scripts expect the
        variable <literal>NEUTRON_PLUGIN_CONF</literal> in the
        <filename>/etc/sysconfig/neutron</filename> file to
        reference the ML2 plug-in configurarion file. Edit the
        <filename>/etc/sysconfig/neutron</filename> file and add the
        following:</para>
      <programlisting>NEUTRON_PLUGIN_CONF="/etc/neutron/plugins/ml2/ml2_conf.ini"</programlisting>
    </step>
    <step os="rhel;centos;fedora;sles;opensuse">
      <para>Start the Networking services and configure them to start
        when the system boots:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl enable neutron-openvswitch-agent.service neutron-l3-agent.service \
  neutron-dhcp-agent.service neutron-metadata-agent.service \
  neutron-ovs-cleanup.service</userinput>
<prompt>#</prompt> <userinput>systemctl start neutron-openvswitch-agent.service neutron-l3-agent.service \
  neutron-dhcp-agent.service neutron-metadata-agent.service</userinput></screen>
      <note os="rhel;centos;fedora">
        <para>Do not explictly start the
          <systemitem class="service">neutron-ovs-cleanup</systemitem>
          service.</para>
      </note>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openstack-neutron-openvswitch-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-l3-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-dhcp-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-metadata-agent start</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-openvswitch-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-l3-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-dhcp-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-metadata-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-ovs-cleanup on</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl enable openstack-neutron-openvswitch-agent.service openstack-neutron-l3-agent.service \
  openstack-neutron-dhcp-agent.service openstack-neutron-metadata-agent.service \
  openstack-neutron-ovs-cleanup.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openstack-neutron-openvswitch-agent.service openstack-neutron-l3-agent.service \
  openstack-neutron-dhcp-agent.service openstack-neutron-metadata-agent.service</userinput></screen>
      <note os="sles;opensuse">
        <para>Do not explictly start the
          <systemitem class="service">openstack-neutron-ovs-cleanup</systemitem>
          service.</para>
      </note>
    </step>
    <step os="ubuntu;debian">
      <para>Restart the Networking services:</para>
      <screen><prompt>#</prompt> <userinput>service neutron-plugin-openvswitch-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-l3-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-dhcp-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-metadata-agent restart</userinput></screen>
    </step>
  </procedure><commit_msg>Typo "explictly" should be "explicitly"<commit_after><?xml version="1.0" encoding="UTF-8"?>
<section xmlns="http://docbook.org/ns/docbook"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  version="5.0"
  xml:id="neutron-network-node">
  <title>Install and configure network node</title>
  <para>The network node primarily handles internal and external routing
    and <glossterm>DHCP</glossterm> services for virtual networks.</para>
  <procedure>
    <title>To configure prerequisites</title>
    <para>Before you install and configure OpenStack Networking, you
      must configure certain kernel networking parameters.</para>
    <step>
      <para>Edit the <filename>/etc/sysctl.conf</filename> file to
        contain the following parameters:</para>
      <programlisting>net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0</programlisting>
    </step>
    <step>
      <para>Implement the changes:</para>
      <screen><prompt>#</prompt> <userinput>sysctl -p</userinput></screen>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To install the Networking components</title>
    <step>
      <screen os="ubuntu"><prompt>#</prompt> <userinput>apt-get install neutron-plugin-ml2 neutron-plugin-openvswitch-agent \
  neutron-l3-agent neutron-dhcp-agent</userinput></screen>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-openvswitch</userinput></screen>
      <screen os="sles;opensuse"><prompt>#</prompt> <userinput>zypper install --no-recommends openstack-neutron-openvswitch-agent openstack-neutron-l3-agent \
  openstack-neutron-dhcp-agent openstack-neutron-metadata-agent ipset</userinput></screen>
      <note os="sles;opensuse">
        <para>SUSE does not use a separate ML2 plug-in package.</para>
      </note>
    </step>
  </procedure>
  <procedure os="debian">
    <title>To install and configure the Networking components</title>
    <step>
      <screen><prompt>#</prompt> <userinput>apt-get install neutron-plugin-openvswitch-agent openvswitch-datapath-dkms \
  neutron-l3-agent neutron-dhcp-agent</userinput></screen>
      <note>
        <para>Debian does not use a separate ML2 plug-in package.</para>
      </note>
    </step>
    <step>
      <para>Respond to prompts for
        <link linkend="debconf-dbconfig-common">database management</link>,
        <link linkend="debconf-keystone_authtoken">Identity service
        credentials</link>,
        <link linkend="debconf-api-endpoints">service endpoint
        registration</link>, and
        <link linkend="debconf-rabbitmq">message broker
        credentials</link>.</para>
    </step>
    <step>
       <para>Select the ML2 plug-in:</para>
       <informalfigure>
        <mediaobject>
          <imageobject>
            <imagedata scale="50"
              fileref="figures/debconf-screenshots/neutron_1_plugin_selection.png"
            />
          </imageobject>
        </mediaobject>
      </informalfigure>
      <note>
        <para>Selecting the ML2 plug-in also populates the
          <option>service_plugins</option> and
          <option>allow_overlapping_ips</option> options in the
          <filename>/etc/neutron/neutron.conf</filename> file with the
          appropriate values.</para>
      </note>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To configure the Networking common components</title>
    <para>The Networking common component configuration includes the
      authentication mechanism, message broker, and plug-in.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/neutron.conf</filename> file
        and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[database]</literal> section, comment out
            any <literal>connection</literal> options because network nodes
            do not directly access the database.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            <application>RabbitMQ</application> message broker access:</para>
          <programlisting language="ini">[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = <replaceable>controller</replaceable>
rabbit_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>RABBIT_PASS</replaceable> with the
            password you chose for the <literal>guest</literal> account in
            <application>RabbitMQ</application>.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> and
            <literal>[keystone_authtoken]</literal> sections,
            configure Identity service access:</para>
          <programlisting language="ini">[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri = http://<replaceable>controller</replaceable>:5000/v2.0
identity_uri = http://<replaceable>controller</replaceable>:35357
admin_tenant_name = service
admin_user = neutron
admin_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>NEUTRON_PASS</replaceable> with the
            password you chose or the <literal>neutron</literal> user in the
            Identity service.</para>
          <note>
            <para>Comment out any <literal>auth_host</literal>,
              <literal>auth_port</literal>, and
              <literal>auth_protocol</literal> options because the
              <literal>identity_uri</literal> option replaces them.</para>
          </note>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section,
           enable the Modular Layer 2 (ML2) plug-in,
           router service, and overlapping IP addresses:</para>
          <programlisting language="ini">[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True</programlisting>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the Modular Layer 2 (ML2) plug-in</title>
    <para>The ML2 plug-in uses the
      <glossterm baseform="Open vSwitch">Open vSwitch (OVS)</glossterm>
      mechanism (agent) to build the virtual networking framework for
      instances.</para>
    <step>
      <para>Edit the
        <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename>
        file and complete the following actions:</para>
      <substeps>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[ml2]</literal> section, enable the
            <glossterm baseform="flat network">flat</glossterm> and
            <glossterm>generic routing encapsulation (GRE)</glossterm>
            network type drivers, GRE tenant networks, and the OVS
            mechanism driver:</para>
          <programlisting language="ini">[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch</programlisting>
        </step>
        <step>
          <para>In the <literal>[ml2_type_flat]</literal> section,
           configure the external flat provider network:</para>
          <programlisting language="ini">[ml2_type_flat]
...
flat_networks = external</programlisting>
        </step>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[ml2_type_gre]</literal> section,
           configure the tunnel identifier (id) range:</para>
          <programlisting language="ini">[ml2_type_gre]
...
tunnel_id_ranges = 1:1000</programlisting>
        </step>
        <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
          <para>In the <literal>[securitygroup]</literal>
           section, enable security groups, enable
           <glossterm>ipset</glossterm>, and configure
           the OVS <glossterm>iptables</glossterm> firewall
           driver:</para>
          <programlisting language="ini">[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver</programlisting>
        </step>
        <step>
          <para>In the <literal>[ovs]</literal> section, enable tunnels,
            configure the local tunnel endpoint, and map the external flat
            provider network to the <literal>br-ex</literal> external
            network bridge:</para>
          <programlisting language="ini">[ovs]
...
local_ip = <replaceable>INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS</replaceable>
enable_tunneling = True
bridge_mappings = external:br-ex</programlisting>
          <para>Replace
            <replaceable>INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS</replaceable>
            with the IP address of the instance
            tunnels network interface on your network node.</para>
        </step>
        <step>
          <para>In the <literal>[agent]</literal> section, enable GRE
            tunnels:</para>
          <programlisting language="ini">[agent]
...
tunnel_types = gre</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure os="ubuntu;rhel;centos;fedora;sles;opensuse">
    <title>To configure the Layer-3 (L3) agent</title>
    <para>The <glossterm>Layer-3 (L3) agent</glossterm> provides
      routing services for virtual networks.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/l3_agent.ini</filename>
       file and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            the driver, enable
            <glossterm baseform="network namespace">network
            namespaces</glossterm>, configure the external network bridge
            and enable deletion of defunct router namespaces:</para>
          <programlisting language="ini">[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br-ex
router_delete_namespaces = True</programlisting>
          <note os="sles">
            <para>Due to an issue with old versions of the
              <application>iproute2</application> utility, we recommend
              that you do not configure the
              <option>router_delete_namespaces</option> option on SLES 11
              SP3.</para>
            </note>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the DHCP agent</title>
    <para>The <glossterm>DHCP agent</glossterm> provides DHCP
      services for virtual networks.</para>
    <step os="ubuntu;rhel;centos;fedora;sles;opensuse">
      <para>Edit the
       <filename>/etc/neutron/dhcp_agent.ini</filename> file
       and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            the drivers, enable namespaces and enable deletion of defunct
            DHCP namespaces:</para>
          <programlisting language="ini">[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
dhcp_delete_namespaces = True</programlisting>
          <note os="sles">
            <para>Due to an issue with old versions of the
              <application>iproute2</application> utility, we recommend
              that you do not configure the
              <option>dhcp_delete_namespaces</option> option on SLES 11
              SP3.</para>
            </note>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
    <step>
      <para>(Optional)</para>
      <para>Tunneling protocols such as GRE include additional packet
        headers that increase overhead and decrease space available for the
        payload or user data. Without knowledge of the virtual network
        infrastructure, instances attempt to send packets using the default
        Ethernet <glossterm>maximum transmission unit (MTU)</glossterm> of
        1500 bytes. <glossterm>Internet protocol (IP)</glossterm> networks
        contain the <glossterm>path MTU discovery (PMTUD)</glossterm>
        mechanism to detect end-to-end MTU and adjust packet size
        accordingly. However, some operating systems and networks block or
        otherwise lack support for PMTUD causing performance degradation
        or connectivity failure.</para>
      <para>Ideally, you can prevent these problems by enabling
        <glossterm baseform="jumbo frame">jumbo frames</glossterm> on the
        physical network that contains your tenant virtual networks.
        Jumbo frames support MTUs up to approximately 9000 bytes which
        negates the impact of GRE overhead on virtual networks. However,
        many network devices lack support for jumbo frames and OpenStack
        administrators often lack control over network infrastructure.
        Given the latter complications, you can also prevent MTU problems
        by reducing the instance MTU to account for GRE overhead.
        Determining the proper MTU value often takes experimentation,
        but 1454 bytes works in most environments. You can configure the
        DHCP server that assigns IP addresses to your instances to also
        adjust the MTU.</para>
      <note>
        <para>Some cloud images ignore the DHCP MTU option in which case
          you should configure it using metadata, a script, or another suitable
          method.</para>
      </note>
      <substeps>
        <step>
          <para>Edit the <filename>/etc/neutron/dhcp_agent.ini</filename>
            file and complete the following action:</para>
          <substeps>
            <step>
              <para>In the <literal>[DEFAULT]</literal> section, enable the
                <glossterm>dnsmasq</glossterm> configuration file:</para>
              <programlisting language="ini">[DEFAULT]
...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf</programlisting>
            </step>
          </substeps>
        </step>
        <step>
          <para>Create and edit the
            <filename>/etc/neutron/dnsmasq-neutron.conf</filename> file and
            complete the following action:</para>
          <substeps>
            <step>
              <para>Enable the DHCP MTU option (26) and configure it to
                1454 bytes:</para>
              <programlisting language="ini">dhcp-option-force=26,1454</programlisting>
            </step>
          </substeps>
        </step>
        <step>
          <para>Kill any existing
            <systemitem role="process">dnsmasq</systemitem> processes:</para>
            <screen><prompt>#</prompt> <userinput>pkill dnsmasq</userinput></screen>
        </step>
      </substeps>
    </step>
  </procedure>
  <procedure>
    <title>To configure the metadata agent</title>
    <para>The <glossterm baseform="Metadata agent">metadata agent</glossterm>
      provides configuration information such as credentials to
      instances.</para>
    <step>
      <para>Edit the <filename>/etc/neutron/metadata_agent.ini</filename>
        file and complete the following actions:</para>
      <substeps>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure
            access parameters:</para>
          <programlisting language="ini">[DEFAULT]
...
auth_url = http://<replaceable>controller</replaceable>:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = <replaceable><PASSWORD></replaceable></programlisting>
          <para>Replace <replaceable>NEUTRON_PASS</replaceable> with the
            password you chose for the <literal>neutron</literal> user in
            the Identity service.</para>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure the
            metadata host:</para>
          <programlisting language="ini">[DEFAULT]
...
nova_metadata_ip = <replaceable>controller</replaceable></programlisting>
        </step>
        <step>
          <para>In the <literal>[DEFAULT]</literal> section, configure the
            metadata proxy shared secret:</para>
          <programlisting language="ini">[DEFAULT]
...
metadata_proxy_shared_secret = <replaceable>METADATA_SECRET</replaceable></programlisting>
          <para>Replace <replaceable>METADATA_SECRET</replaceable> with a
            suitable secret for the metadata proxy.</para>
        </step>
        <step>
          <para>(Optional) To assist with troubleshooting,
            enable verbose logging in the <literal>[DEFAULT]</literal>
            section:</para>
          <programlisting language="ini">[DEFAULT]
...
verbose = True</programlisting>
        </step>
      </substeps>
    </step>
    <step>
      <para>On the <emphasis>controller</emphasis> node, edit the
        <filename>/etc/nova/nova.conf</filename> file and complete the
        following action:</para>
      <substeps>
        <step>
          <para>In the <literal>[neutron]</literal> section, enable the
            metadata proxy and configure the secret:</para>
          <programlisting language="ini">[neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = <replaceable>METADATA_SECRET</replaceable></programlisting>
          <para>Replace <replaceable>METADATA_SECRET</replaceable> with
            the secret you chose for the metadata proxy.</para>
        </step>
      </substeps>
    </step>
    <step>
      <para>On the <emphasis>controller</emphasis> node, restart the
        Compute <glossterm>API</glossterm> service:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl restart openstack-nova-api.service</userinput></screen>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openstack-nova-api restart</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl restart openstack-nova-api.service</userinput></screen>
      <screen os="ubuntu;debian"><prompt>#</prompt> <userinput>service nova-api restart</userinput></screen>
    </step>
  </procedure>
  <procedure>
    <title>To configure the Open vSwitch (OVS) service</title>
    <para>The OVS service provides the underlying virtual networking
      framework for instances. The integration bridge
      <literal>br-int</literal> handles internal instance network
      traffic within OVS. The external bridge <literal>br-ex</literal>
      handles external instance network traffic within OVS. The
      external bridge requires a port on the physical external network
      interface to provide instances with external network access. In
      essence, this port connects the virtual and physical external
      networks in your environment.</para>
    <step os="rhel;centos;fedora;sles;opensuse">
      <para>Start the OVS service and configure it to start when the
        system boots:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl enable openvswitch.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openvswitch.service</userinput></screen>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openvswitch-switch start</userinput>
<prompt>#</prompt> <userinput>chkconfig openvswitch-switch on</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl enable openvswitch.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openvswitch.service</userinput></screen>
    </step>
    <step os="debian;ubuntu">
      <para>Restart the OVS service:</para>
      <screen><prompt>#</prompt> <userinput>service openvswitch-switch restart</userinput></screen>
    </step>
    <step>
      <para>Add the external bridge:</para>
      <screen><prompt>#</prompt> <userinput>ovs-vsctl add-br br-ex</userinput></screen>
    </step>
    <step>
      <para>Add a port to the external bridge that connects to the
        physical external network interface:</para>
      <para>Replace <replaceable>INTERFACE_NAME</replaceable> with the
        actual interface name. For example, <emphasis>eth2</emphasis>
        or <emphasis>ens256</emphasis>.</para>
      <screen><prompt>#</prompt> <userinput>ovs-vsctl add-port br-ex <replaceable>INTERFACE_NAME</replaceable></userinput></screen>
      <note>
        <para>Depending on your network interface driver, you may need
          to disable <glossterm>generic receive offload
            (GRO)</glossterm> to achieve suitable throughput between
          your instances and the external network.</para>
        <para>To temporarily disable GRO on the external network
          interface while testing your environment:</para>
        <screen><prompt>#</prompt> <userinput>ethtool -K <replaceable>INTERFACE_NAME</replaceable> gro off</userinput></screen>
      </note>
    </step>
  </procedure>
  <procedure>
    <title>To finalize the installation</title>
    <step os="rhel;centos;fedora">
      <para>The Networking service initialization scripts expect a
        symbolic link <filename>/etc/neutron/plugin.ini</filename>
        pointing to the ML2 plug-in configuration file,
        <filename>/etc/neutron/plugins/ml2/ml2_conf.ini</filename>.
        If this symbolic link does not exist, create it using the
        following command:</para>
      <screen><prompt>#</prompt> <userinput>ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini</userinput></screen>
      <para>Due to a packaging bug, the Open vSwitch agent initialization
        script explicitly looks for the Open vSwitch plug-in configuration
        file rather than a symbolic link
        <filename>/etc/neutron/plugin.ini</filename> pointing to the ML2
        plug-in configuration file. Run the following commands to resolve this
        issue:</para>
      <screen><prompt>#</prompt> <userinput>cp /usr/lib/systemd/system/neutron-openvswitch-agent.service \
  /usr/lib/systemd/system/neutron-openvswitch-agent.service.orig</userinput>
<prompt>#</prompt> <userinput>sed -i 's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g' \
  /usr/lib/systemd/system/neutron-openvswitch-agent.service</userinput></screen>
    </step>
    <step os="sles;opensuse">
      <para>The Networking service initialization scripts expect the
        variable <literal>NEUTRON_PLUGIN_CONF</literal> in the
        <filename>/etc/sysconfig/neutron</filename> file to
        reference the ML2 plug-in configurarion file. Edit the
        <filename>/etc/sysconfig/neutron</filename> file and add the
        following:</para>
      <programlisting>NEUTRON_PLUGIN_CONF="/etc/neutron/plugins/ml2/ml2_conf.ini"</programlisting>
    </step>
    <step os="rhel;centos;fedora;sles;opensuse">
      <para>Start the Networking services and configure them to start
        when the system boots:</para>
      <screen os="rhel;centos;fedora"><prompt>#</prompt> <userinput>systemctl enable neutron-openvswitch-agent.service neutron-l3-agent.service \
  neutron-dhcp-agent.service neutron-metadata-agent.service \
  neutron-ovs-cleanup.service</userinput>
<prompt>#</prompt> <userinput>systemctl start neutron-openvswitch-agent.service neutron-l3-agent.service \
  neutron-dhcp-agent.service neutron-metadata-agent.service</userinput></screen>
      <note os="rhel;centos;fedora">
        <para>Do not explicitly start the
          <systemitem class="service">neutron-ovs-cleanup</systemitem>
          service.</para>
      </note>
      <para os="sles">On SLES:</para>
      <screen os="sles"><prompt>#</prompt> <userinput>service openstack-neutron-openvswitch-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-l3-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-dhcp-agent start</userinput>
<prompt>#</prompt> <userinput>service openstack-neutron-metadata-agent start</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-openvswitch-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-l3-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-dhcp-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-metadata-agent on</userinput>
<prompt>#</prompt> <userinput>chkconfig openstack-neutron-ovs-cleanup on</userinput></screen>
      <para os="opensuse">On openSUSE:</para>
      <screen os="opensuse"><prompt>#</prompt> <userinput>systemctl enable openstack-neutron-openvswitch-agent.service openstack-neutron-l3-agent.service \
  openstack-neutron-dhcp-agent.service openstack-neutron-metadata-agent.service \
  openstack-neutron-ovs-cleanup.service</userinput>
<prompt>#</prompt> <userinput>systemctl start openstack-neutron-openvswitch-agent.service openstack-neutron-l3-agent.service \
  openstack-neutron-dhcp-agent.service openstack-neutron-metadata-agent.service</userinput></screen>
      <note os="sles;opensuse">
        <para>Do not explicitly start the
          <systemitem class="service">openstack-neutron-ovs-cleanup</systemitem>
          service.</para>
      </note>
    </step>
    <step os="ubuntu;debian">
      <para>Restart the Networking services:</para>
      <screen><prompt>#</prompt> <userinput>service neutron-plugin-openvswitch-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-l3-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-dhcp-agent restart</userinput>
<prompt>#</prompt> <userinput>service neutron-metadata-agent restart</userinput></screen>
    </step>
  </procedure>
{'fraction_non_alphanumeric': 0.11902523410176376, 'fraction_numerical': 0.004738445338648415, 'mean_word_length': 3.150706313899945, 'pattern_counts': {'":': 0, '<': 1619, '<?xml version=': 2, '>': 1619, 'https://': 0, 'lorem ipsum': 0, 'www.': 4, 'xml': 10}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4377451', 'n_tokens_mistral': 15667, 'n_tokens_neox': 15016, 'n_words': 3627}