..
   SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org>
   SPDX-License-Identifier: Apache-2.0

Site Planning
=============

Planning an edge site generally happens in three phases:

1. A BoM of equipment is defined, then purchased.

2. The equipment is delivered and inventoried. This usually is done by the edge
   site, and involves collecting information like the serial numbers, MAC
   addresses and other details about the specific pieces of equipment being
   installed.

3. ONF Staff enters this information into Netbox, which is used to generate
   configuration for the edge site and document the configuration.

This document describes the 3rd phase, and exists primarily as a reference for
ONF Staff.

Site Design in Netbox
---------------------

The Aether project uses Netbox as source of truth, and the automation script
uses the Netbox API to create input files for Ansible Playbooks which are used
to configure each site.

Once the hardware has been ordered, the installation can be planned.  The
following information needs to be added to `NetBox
<https://netbox.readthedocs.io/en/stable>`_ to describe each edge site:

.. note::
   The **bold** words represent the models in Netbox.

1. Add a **Site** for the edge (if one doesn't already exist), which has the
   physical location and contact information for the Aether Edge.

2. Add equipment Racks to the Site (if they don't already exist).

3. Add a **Tenant** for the edge (who owns/manages it), assigned to the ``Pronto``
   or ``Aether`` Tenant Group.

4. Add a **VRF** (Routing Table) for the edge site. This is usually just the name
   of the site.  Make sure that ``Enforce unique space`` is checked, so that IP
   addresses within the VRF are forced to be unique, and that the Tenant Group
   and Tenant are set.

5. Add a **VLAN Group** to the edge site, which groups the site's VLANs and
   requires that they have a unique VLAN number.

6. Add **VLANs** for the edge site.  These VLAN objects should be assigned a VLAN
   Group, a Site, and a Tenant.

   There can be multiple of the same VLAN in NetBox (VLANs are layer 2, and
   local to the site), but not within the VLAN group.

   The minimal list of VLANs:

     * ADMIN 1
     * UPLINK 10
     * MGMT 800
     * FAB 801

   If you have multiple deployments at a site using the same management server,
   add additional VLANs incremented by 10 for the MGMT/FAB - for example, you
   can create the VLANs for development server as follows:

     * DEVMGMT 810
     * DEVFAB 801

7. Add IP **Prefixes** for the site. This should have the Tenant and VRF assigned.

   All IP prefixes of Aether Edge will fit into a ``/22`` sized block.

   The Prefix description field is used to create DNS names for IP addresses in the Prefix.
   The DNS A records for each IP address start with the name of the Device, and end with
   the Prefix description.

   For example, if we have a management server named ``mgmtserver`` in **Prefix**
   ``prod1.menlo.aetherproject.net``, and the management server's DNS name will be
   ``mgmtserver.prod1.menlo.aetherproject.net``.

   Here is an example using the ``10.0.0.0/22`` block. Let's name our deployment
   as "prod1", and name our site as "menlo". Then we define 4 **Prefixes**
   with different purposes.

.. note::
   NOTE: You should replace the **prod1** and **menlo** to your deployment name and
   site name.
..

     * ADMIN Prefix - ``10.0.0.0/25`` (for Lights-out management)

        * Has the Server BMC/LOM and Management Switch
        * Assign with the ADMIN 1 VLAN
        * Set the description to ``admin.prod1.menlo.aetherproject.net`` (or
          ``prontoproject.net``).

     * MGMT Prefix -  ``10.0.0.128/25`` (for infrastructure control plane)

        * Has the Server Management plane, Fabric Switch Management/BMC
        * Assign with MGMT 800 VLAN
        * Set the description to ``prod1.menlo.aetherproject.net`` (or
          ``prontoproject.net``).

     * FABRIC1 Prefix - ``10.0.1.0/25``

        * Compute Nodes' qsfp0 port which connects to Fabric switches,
          and other devices (eNB, ...) connect to the Fabric switches.
        * Assign with FAB 801 VLAN
        * Set the description to ``fab1.prod1.menlo.aetherproject.net`` (or
          ``prontoproject.net``).

     * FABRIC2 Prefix - ``10.0.1.128/25``

        * Compute Nodes' qsfp1 port which connects to Fabric switches
        * Assign FAB 801 VLAN
        * Set the description to ``fab2.prod1.menlo.aetherproject.net`` (or
          ``prontoproject.net``).

   And we will have an additional parent prefix includes 2 FABRIC Prefix.

     * ``10.0.1.0/24``

        * This is used to configure the correct routes, DNS, and TFTP servers
          provided by DHCP to the equipment that is connected to the fabric
          leaf switch that the management server (which provides those
          services) is not connected to.

   Additionally, these edge prefixes are used for Kubernetes but don't need to
   be created in NetBox:

     * ``10.0.2.0/24``

        * Kubernetes Pod IP's

     * ``10.0.3.0/24``

        * Kubernetes Cluster IP's

8. Add **Devices** to the site, for each piece of equipment. These are named with a
   scheme similar to the DNS names used for the pod, given in this format::

     <devname>.<deployment>.<site>

   Examples::

     mgmtserver1.ops1.tucson
     node1.stage1.menlo

   Note that these names are transformed into DNS names using the Prefixes, and
   may have additional components - ``admin`` or ``fabric`` may be added after
   the ``<devname>`` for devices on those networks.

   Set the following fields when creating a device:

     * Site
     * Tenant
     * Rack & Rack Position
     * Serial number

   If a specific Device Type doesn't exist for the device, it must be created,
   which is detailed in the NetBox documentation, or ask the OPs team for help.

   See `Rackmount of Equipment`_ below for guidance on how equipment should be
   mounted in the Rack.

9. Add **Service** to the management server:

    * name: ``dns``
      protocol: UDP
      port: 53

    * name: ``tftp``
      protocol: UDP
      port: 69

   These are used by the DHCP and DNS config to know which servers offer
   DNS or TFTP service.

10. Set the MAC address for the physical interfaces on the device.

   You may also need to add physical network interfaces if they aren't already
   created by the Device Type.  An example would be if additional add-in
   network cards were installed.

11. Add any virtual interfaces to the **Devices**. When creating a virtual
    interface, it should have it's ``label`` field set to the name of the
    physical interface that it is assigned

    These are needed for two cases of the Pronto deployment:

     1. On the Management Server, there should bet (at least) two VLAN
        interfaces created attached to the ``eno2`` network port, which
        are used to provide connectivity to the management plane and fabric.
        These interfaces should be named ``<name of vlan><vlan ID>``, so the
        MGMT 800 VLAN would become a virtual interface named ``mgmt800``, with
        the label ``eno2``.

     2. On the Fabric switches, the ``eth0`` port is shared between the OpenBMC
        interface and the ONIE/ONL installation.  Add a ``bmc`` virtual
        interface with a label of ``eth0`` on each fabric switch, and have the
        ``OOB Management`` checkbox checked.

12. Create **IP addresses** for the physical and virtual interfaces.  These should
    have the Tenant and VRF set.

    The Management Server should always have the first IP address in each
    range, and they should be incremental, in this order. Examples are given as
    if there was a single instance of each device - adding additional devices
    would increment the later IP addresses.

      * Management Server

          * ``eno1`` - site provided public IP address, or blank if DHCP
            provided

          * ``eno2`` - 10.0.0.1/25 (first of ADMIN) - set as primary IP
          * ``bmc`` - 10.0.0.2/25 (next of ADMIN)
          * ``mgmt800`` - 10.0.0.129/25 (first of MGMT)
          * ``fab801`` - 10.0.1.1/25 (first of FAB)

      * Management Switch

          * ``gbe1`` - 10.0.0.3/25 (next of ADMIN) - set as primary IP

      * Fabric Switch

          * ``eth0`` - 10.0.0.130/25 (next of MGMT), set as primary IP
          * ``bmc`` - 10.0.0.131/25

      * Compute Server

          * ``eth0`` - 10.0.0.132/25 (next of MGMT), set as primary IP
          * ``bmc`` - 10.0.0.4/25 (next of ADMIN)
          * ``qsfp0`` - 10.0.1.2/25 (next of FAB)
          * ``qsfp1`` - 10.0.1.3/25

      * Other Fabric devices (eNB, etc.)

          * ``eth0`` or other primary interface - 10.0.1.4/25 (next of FAB)

13. Add **IP address** to the **Prefix** to represent reserved DHCP ranges.
    We use a single IP address which ``Status`` is set to ``DHCP``  to stand
    for the DHCP range, the DHCP server will consume the entire range of IP
    address in the CIDR mask (includes first and last IP addresses).

    For example, IP ``10.0.0.32/27`` with ``DHCP`` status in Prefix
    ``10.0.0.0/25``, the IP will be a DHCP block, and allocate IP address from
    ``10.0.0.32`` to ``10.0.0.63``.

14. Add **IP address** to the **Prefix** to represent route IP reservations for
    both Fabric prefixes.  These are IP addresses used by ONOS to route traffic
    to the other leaf, and have the following attributes:

    - Have the last usable address in range (in the ``/25`` fabric examples
      above, these would be ``10.0.1.126/25`` and ``10.0.1.254/25``)

    - Have a ``Status`` of ``Reserved``, and the VRF, Tenant Group, and Tenant
      set.

    - The Description must start with the word ``router``, such as: ``router
      for leaf1 Fabric``

    - A custom field named ``RFC3442 Routes`` is set to the CIDR IP address of
      the opposite leaf - if the leaf's prefix is ``10.0.1.0/25`` and the
      router IP is ``10.0.1.126/25`` then ``RFC3442 Routes`` should be set to
      ``10.0.1.128\25`` (and the reverse - on ``10.0.1.254/25`` the ``RFC3442
      Routes`` would be set to be ``10.0.1.0/25``).  This creates an `RFC3442
      Classless Static Route Option <https://tools.ietf.org/html/rfc3442>`_
      for the subnet in DHCP.

15. Add Cables between physical interfaces on the devices

    The topology needs to match the logical diagram presented in the
    :ref:`Production Environments <edge_deployment/overview:Production
    Environments>`.  Note that many of the management interfaces need to be
    located either on the MGMT or ADMIN VLANs, and the management switch is
    used to provide that separation.

Rackmount of Equipment
----------------------

Most of the switch and server equipment used for Aether is available in the 19"
rackmount form factor, but care needs to be taken in mounting this equipment to
ensure proper airflow. Please follow these guidelines:

- The EdgeCore Wedge Switches have a front-to-back (aka "port-to-power") fan
  configuration, so hot air exhaust is out the back of the switch near the
  power inlets, away from the 32 QSFP network ports on the front of the switch.

- The full-depth servers (such as the 1U and 2U Supermicro servers used in
  Pronto) also have front-to-back airflow but have most of their ports on the
  rear of the device.

- Airflow through the rack should be in one direction to avoid heat being
  pulled from one device into another.  This means that to connect the QSFP
  network ports from the servers to the switches, cabling should be routed
  through the rack from front (switch) to back (server).  Empty rack spaces
  should be reserved for this purpose.

- The short-depth management switches and management servers should be mounted
  on the rear of the rack.  They don't generate an appreciable amount of heat,
  so the airflow direction isn't a significant factor in racking them.

Inventory
---------

Once equipment arrives, any device needs to be recorded in inventory if it:

1. Connects to the network (has a MAC address)
2. Has a serial number
3. Isn't a subcomponent (disk, add-in card, linecard, etc.) of a larger device.

The following information should be recorded for every device:

- Manufacturer
- Model
- Serial Number
- MAC address (for the primary and any management/BMC/IPMI interfaces)

This information should be be added to the corresponding Devices within the ONF
NetBox instance.  The accuracy of this information is very important as it is
used in bootstrapping the compute systems, which is currently done by Serial
Number, as reported to iPXE by SMBIOS.

Once inventory has been completed, let the Infra team know, and the pxeboot
configuration will be generated to have the OS preseed files corresponding to the
new servers based on their serial numbers.
