Merge "Add support for standalone network configuration"
This commit is contained in:
672
specs/backlog/standalone-networking.rst
Normal file
672
specs/backlog/standalone-networking.rst
Normal file
@@ -0,0 +1,672 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Standalone Networking Configuration
|
||||||
|
===================================
|
||||||
|
|
||||||
|
https://bugs.launchpad.net/ironic/+bug/2113769
|
||||||
|
|
||||||
|
This document proposes a mechanism for configuring switch port attributes
|
||||||
|
during the management of baremetal nodes. The aim is to enable Ironic to
|
||||||
|
support this functionality without delegating networking tasks to Neutron.
|
||||||
|
This new mechanism, initiated by the existing network driver interface in the
|
||||||
|
Conductor, would delegate actual switch port configuration to a standalone
|
||||||
|
service. This service could be co-located with existing Ironic services or
|
||||||
|
managed independently, on a separate server, by an operator group dedicated
|
||||||
|
to network equipment.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Operators seek to automate network configuration to enable node deployment
|
||||||
|
without manual pre-configuration of switch ports. Nodes connect to
|
||||||
|
switches via one or more network interfaces, each requiring specific
|
||||||
|
neighboring switch configurations for their intended use. These interfaces
|
||||||
|
may require access port or trunk port configurations. Additionally, link
|
||||||
|
aggregation might be required to enhance a node's networking capacity or
|
||||||
|
redundancy. Normally, the configuration operations must be completed manually
|
||||||
|
before the nodes can be deployed by Ironic.
|
||||||
|
|
||||||
|
Managing nodes and networking equipment often falls to separate organizational
|
||||||
|
groups. This division of responsibility introduces security concerns regarding
|
||||||
|
who can modify switch configurations and to what extent. Since fine-grained
|
||||||
|
authorization varies across switch vendors, this service should offer basic
|
||||||
|
controls to address operator security concerns; thereby limiting what
|
||||||
|
operations could be attempted by Ironic.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
The implementation proposed is to introduce a new standalone service to execute
|
||||||
|
the interactions with the network switch equipment. This new service includes
|
||||||
|
a JSON RPC front end API to be accessed by a network driver running within the
|
||||||
|
context of the Conductor. During the normal management lifecycle of baremetal
|
||||||
|
nodes, any ports defined on a node will be processed by the network driver as
|
||||||
|
is already the case in the current implementation.
|
||||||
|
|
||||||
|
It is the responsibility of the driver to ensure that related switch
|
||||||
|
configurations are updated according to the ``switchport`` and
|
||||||
|
``portchannel`` information contained within the ``extra`` property of the
|
||||||
|
port. Existing network drivers can interface with the Neutron subsystem to
|
||||||
|
manage switch configurations, but the solution proposed in this design
|
||||||
|
eliminates the need to include other OpenStack components and instead provides
|
||||||
|
an end-to-end Ironic only solution.
|
||||||
|
|
||||||
|
.. note:: The usage of the ``extra`` property is an interim approach to enable the new
|
||||||
|
functionality. The long term goal is to replace these properties with a new
|
||||||
|
set of API models and endpoints that are specific to the new functionality.
|
||||||
|
The intent is to explore the use of this new functionality using the
|
||||||
|
``extra`` property as a means to validate the new functionality. Once the
|
||||||
|
usecases are validated and better understood we can promote the new contents
|
||||||
|
of the ``extra`` property to a new set of API models and endpoints.
|
||||||
|
|
||||||
|
.. note:: The standalone service may need to consider the implications of
|
||||||
|
issuing commands concurrently to the same switch. This could lead to
|
||||||
|
unexpected results under certain circumstances. The standalone service
|
||||||
|
should be designed to handle this scenario gracefully.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
┌──────────────────────┐
|
||||||
|
│ │
|
||||||
|
│ Ironic API │
|
||||||
|
│ │
|
||||||
|
└──────────┬───────────┘
|
||||||
|
│
|
||||||
|
│ ┌────────────────────────┐
|
||||||
|
┌──────────▼───────────┐ │ │
|
||||||
|
│ │ │ Ironic Standalone │
|
||||||
|
│ Ironic Conductor │ │ Networking Service │ ┌───────────────┐
|
||||||
|
│ ┌───────────┤ │ ┌────────────┤ │ │
|
||||||
|
│ │ Network ┼─────► │ Switch ┼─────► TOR Switch │
|
||||||
|
│ │ Driver │ │ │ Driver │ │ │
|
||||||
|
└──────────└───────────┘ └───────────└────────────┘ └───────────────┘
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
If we could assume that all network switches implemented some form of fine
|
||||||
|
grained access controls that could be applied to specific user credentials then
|
||||||
|
we could forgo building an access control mechanism and instead rely on the
|
||||||
|
access rights granted to the user credentials assigned to the Ironic service.
|
||||||
|
This would eliminate the need to implement this mechanism as a standalone
|
||||||
|
service and instead we could simply embed the functionality directly into the
|
||||||
|
Conductor by way of a custom network driver that could directly interact with
|
||||||
|
the network switches.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
┌──────────────────────┐
|
||||||
|
│ │
|
||||||
|
│ Ironic API │
|
||||||
|
│ │
|
||||||
|
└──────────┬───────────┘
|
||||||
|
│
|
||||||
|
│
|
||||||
|
┌──────────▼───────────┐
|
||||||
|
│ │
|
||||||
|
│ Ironic Conductor │ ┌───────────────────┐
|
||||||
|
│ ┌───────────┤ │ │
|
||||||
|
│ │ Network ┼────────►─ TOR Switch │
|
||||||
|
│ │ Driver │ │ │
|
||||||
|
└──────────└───────────┘ └───────────────────┘
|
||||||
|
|
||||||
|
Of course, the access control requirement is only one reason for having a
|
||||||
|
separate service and we would need to assess whether other requirements would
|
||||||
|
also push us towards a standalone service (e.g., would it be beneficial to
|
||||||
|
have the actual switch interactions performed on a separate service for
|
||||||
|
performance/scalability reasons? Assuming the driver operations are
|
||||||
|
synchronous to this other service presumably performance/scalability would
|
||||||
|
not be improved by having a separate service).
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
There are no planned changes to existing data models. Switch port
|
||||||
|
configuration details are to be stored in the ``extra`` property of existing
|
||||||
|
port objects; therefore, existing port related data model schemas can be used
|
||||||
|
without modification.
|
||||||
|
|
||||||
|
State Machine Impact
|
||||||
|
--------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
There are no planned changes to existing API schemas or endpoints. Switch port
|
||||||
|
configuration details are stored in the ``extra`` property of a port or
|
||||||
|
portgroup; therefore, existing port and portgroup related API endpoints and
|
||||||
|
schemas can be used without modification. The ``extra`` property should be
|
||||||
|
populated with a dictionary conforming to this schema when related to a port
|
||||||
|
object.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Switchport Configuration",
|
||||||
|
"description": "Schema for defining switchport configurations based on
|
||||||
|
mode (trunk or access)",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"switchport": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"mode": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["trunk", "access"]
|
||||||
|
},
|
||||||
|
"native_vlan": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1,
|
||||||
|
"description": "The native VLAN ID for the switchport. If not
|
||||||
|
supplied then the switch global default VLAN ID is used."
|
||||||
|
},
|
||||||
|
"allowed_vlans": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"minItems": 1,
|
||||||
|
"description": "List of allowed VLANs for trunk mode. Only
|
||||||
|
applicable, and is mandatory, if mode=trunk."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"mode",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"switchport",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
For example, the following data is stored in the ``extra`` property of a port
|
||||||
|
to specify that its switch port must be configured as a trunk port having a
|
||||||
|
specific default VLAN and a set of allowed VLANs.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{'switchport':
|
||||||
|
{'mode': 'trunk',
|
||||||
|
'native_vlan': 1,
|
||||||
|
'allowed_vlans': [2, 3, 4]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
The following data is stored in the ``extra`` property of a port to specify
|
||||||
|
that its switch port must be configured as an access port having a specific
|
||||||
|
default VLAN.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{'switchport':
|
||||||
|
{'mode': 'access',
|
||||||
|
'native_vlan': 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
If related to a portgroup object then a similar schema is supported but with
|
||||||
|
differences applicable to switch port channels only.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Switchport Configuration",
|
||||||
|
"description": "Schema for defining switch port channel configurations
|
||||||
|
based on mode (e.g., trunk or access) and aggregation mode (e.g., LACP
|
||||||
|
or static)",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"portchannel": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"mode": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["trunk", "access"]
|
||||||
|
},
|
||||||
|
"native_vlan": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1,
|
||||||
|
"description": "The native VLAN ID for the switchport. If not
|
||||||
|
supplied then the switch global default VLAN ID is used."
|
||||||
|
},
|
||||||
|
"allowed_vlans": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"minItems": 1,
|
||||||
|
"description": "List of allowed VLANs for trunk mode. Only
|
||||||
|
applicable, and is mandatory, if mode=trunk."
|
||||||
|
},
|
||||||
|
"aggregation_mode": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["lacp", "static"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"mode",
|
||||||
|
"aggregation_mode",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"portchannel",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
For example, the following data is stored in the ``extra`` property of a
|
||||||
|
portgroup to specify that a corresponding portchannel must be created and
|
||||||
|
managed on the switch. The portchannel should be configured as a trunk port
|
||||||
|
having a specific default VLAN and a set of allowed VLANs, and operate in the
|
||||||
|
LACP link aggregation mode.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{'portchannel':
|
||||||
|
{'mode': 'trunk',
|
||||||
|
'native_vlan': 1,
|
||||||
|
'allowed_vlans': [2, 3, 4],
|
||||||
|
'aggregation_mode': 'lacp'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
The following data is stored in the ``extra`` property of a portgroup to
|
||||||
|
specify that a corresponding portchannel must be created and managed on the
|
||||||
|
switch. The portchannel must be configured as an access port having a specific
|
||||||
|
default VLAN, and operation in the static link aggregation mode.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
{'portchannel':
|
||||||
|
{'mode': 'access',
|
||||||
|
'native_vlan': 1,
|
||||||
|
'aggregation_mode': 'static'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Client (CLI) impact
|
||||||
|
-------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
"openstack baremetal" CLI
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
None
|
||||||
|
|
||||||
|
"openstacksdk"
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
None
|
||||||
|
|
||||||
|
RPC API impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
1. Conductor RPC API:
|
||||||
|
None
|
||||||
|
|
||||||
|
2. Standalone Service API:
|
||||||
|
The RPC API used between the driver and the standalone networking service
|
||||||
|
can be defined as follows
|
||||||
|
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| Method | Signature |
|
||||||
|
+==============================+=============================================+
|
||||||
|
| update_port | .. code-block:: |
|
||||||
|
| | |
|
||||||
|
| | {"switch_id": "xx:xx:xx:xx:xx:xx", |
|
||||||
|
| | "port_name": "xxx", |
|
||||||
|
| | "description": "xxx", |
|
||||||
|
| | "mode": "[access|trunk]", |
|
||||||
|
| | "default_vlan": n, |
|
||||||
|
| | "allowed_vlans": [x, y, z], |
|
||||||
|
| | "portchannel_name": "xxx"} |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| reset_port | .. code-block:: |
|
||||||
|
| | |
|
||||||
|
| | {"switch_id": "xx:xx:xx:xx:xx:xx", |
|
||||||
|
| | "port_name": "xxx"} |
|
||||||
|
| | |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| disable_port | .. code-block:: |
|
||||||
|
| | |
|
||||||
|
| | {"switch_id": "xx:xx:xx:xx:xx:xx", |
|
||||||
|
| | "port_name": "xxx"} |
|
||||||
|
| | |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| create_portchannel | .. code-block:: |
|
||||||
|
| | |
|
||||||
|
| | {"switch_ids": ["xx:xx:xx:xx:xx:xx",...] |
|
||||||
|
| | "portchannel_name": "xxx", |
|
||||||
|
| | "description": "xxx", |
|
||||||
|
| | "mode": "[access|trunk]", |
|
||||||
|
| | "default_vlan": {1 to 4094}, |
|
||||||
|
| | "allowed_vlans": [x, y, z], |
|
||||||
|
| | "aggregation_mode": "[lacp|static]"} |
|
||||||
|
| | |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| delete_portchannel | .. code-block:: |
|
||||||
|
| | |
|
||||||
|
| | {"switch_ids": ["xx:xx:xx:xx:xx:xx",...], |
|
||||||
|
| | "port_name": "xxx"} |
|
||||||
|
| | |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
Driver API impact
|
||||||
|
-----------------
|
||||||
|
No changes to the existing driver interfaces. It is expected that this
|
||||||
|
functionality can be implemented within the existing definition of the
|
||||||
|
Networking Driver API. This means that the existing Conductor workflow does
|
||||||
|
need to be modified. The new networking driver must implement the defined
|
||||||
|
abstract interfaces of the base network interface in a way that ensures that
|
||||||
|
switch port configurations are updated correctly as the baremetal node
|
||||||
|
transitions through the full management life cycle state machine.
|
||||||
|
|
||||||
|
Proper operation of the driver depends on the port being populated with LLDP
|
||||||
|
information in the form of the ``link_local_connection`` property. This
|
||||||
|
ensures that the driver can associate the configuration to the correct port on
|
||||||
|
the switch.
|
||||||
|
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| Interface | Actions |
|
||||||
|
+==============================+=============================================+
|
||||||
|
| port_changed | Update switch port configuration to match |
|
||||||
|
| | if necessary. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| portgroup_changed | Update switch port configuration to match |
|
||||||
|
| | if necessary. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| vif_attach | N/A. VIF attachments not expected or |
|
||||||
|
| | supported by this driver. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| vif_detach | N/A. VIF attachments not expected or |
|
||||||
|
| | supported by this driver. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| vif_list | N/A. VIF attachments not expected or |
|
||||||
|
| | supported by this driver. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| get_current_vif | N/A. VIF attachments not expected or |
|
||||||
|
| | supported by this driver. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| add_provisioning_network | Configure each ports according to the |
|
||||||
|
| | provisioning network configured in the |
|
||||||
|
| | config file; otherwise, configure according |
|
||||||
|
| | to its defined switchport ``extra`` |
|
||||||
|
| | property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| remove_provisioning_network | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| configure_tenant_networks | Configure each ports according to the |
|
||||||
|
| | ``switchport`` configuration defined in its |
|
||||||
|
| | ``extra`` property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| unconfigure_tenant_networks | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| add_cleaning_network | Configure each ports according to the |
|
||||||
|
| | cleaning network configured in the |
|
||||||
|
| | config file; otherwise, configure according |
|
||||||
|
| | to its defined switchport ``extra`` |
|
||||||
|
| | property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| remove_cleaning_network | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| validate_rescue | N/A |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| add_rescuing_network | Configure each ports according to the |
|
||||||
|
| | rescuing network configured in the |
|
||||||
|
| | config file; otherwise, configure according |
|
||||||
|
| | to its defined switchport ``extra`` |
|
||||||
|
| | property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| remove_rescuing_network | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| validate_inspection | N/A |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| add_inspection_network | Configure each ports according to the |
|
||||||
|
| | inspection network configured in the |
|
||||||
|
| | config file; otherwise, configure according |
|
||||||
|
| | to its defined switchport ``extra`` |
|
||||||
|
| | property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| remove_inspection_network | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| need_power_on | False |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| get_node_network_data | Build network data from configured ports |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| add_servicing_network | Configure each ports according to the |
|
||||||
|
| | servicing network configured in the |
|
||||||
|
| | config file; otherwise, configure according |
|
||||||
|
| | to its defined switchport ``extra`` |
|
||||||
|
| | property. |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
| remove_servicing_network | Reset port back to switch port defaults |
|
||||||
|
+------------------------------+---------------------------------------------+
|
||||||
|
|
||||||
|
Nova driver impact
|
||||||
|
------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Ramdisk impact
|
||||||
|
--------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
* RPC API Authentication/Authorization: The intent of this design is to create
|
||||||
|
a standalone service that exists as part of the Ironic subsystem but that
|
||||||
|
could be run and managed separately by a group dedicated to managing
|
||||||
|
networking equipment. In this capacity the process must have sufficient
|
||||||
|
security controls such that only authorized users have access to its
|
||||||
|
configuration file and RPC API. A discussion is needed to settle on the
|
||||||
|
approach to be used.
|
||||||
|
|
||||||
|
* Access control over switch resources: Ideally, an ACL mechanism native to the
|
||||||
|
switch operating system would be used to restrict access to switch resources
|
||||||
|
for the user entity assigned to the standalone networking service, but since
|
||||||
|
an objective of this design is to not assume that all switch vendors support
|
||||||
|
fine grained control over access to resources it may be beneficial to add
|
||||||
|
the ability to control access to resources directly from configuration data
|
||||||
|
stored in the configuration file for the standalone service.
|
||||||
|
|
||||||
|
Resources to be controlled could include:
|
||||||
|
|
||||||
|
1. Allowed/Denied VLAN IDs
|
||||||
|
2. Allowed/Denied port list
|
||||||
|
3. Allowed port channel management
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Scalability impact
|
||||||
|
------------------
|
||||||
|
Needing to perform switch operations as part of the management of baremetal
|
||||||
|
nodes will no doubt increase the time required to complete node operations.
|
||||||
|
Exactly how much additional time will depend entirely on the responsiveness of
|
||||||
|
the management software running on the networking switch. Having switch ports
|
||||||
|
configured before booting the node is a definite requirement; therefore, it is
|
||||||
|
likely not feasible to decouple the Conductor process from the configuration
|
||||||
|
of the switch by making it an asynchronous operation.
|
||||||
|
|
||||||
|
This will have to be evaluated as the implementation progresses.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
See "Scalability impact" above.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
To define the switch port configuration details to be used for provider
|
||||||
|
networks the following config file attributes must be used. For each of the
|
||||||
|
network classes if no value is provided in the config file then the port's
|
||||||
|
``extra.switchport`` or ``extra.portchannel`` property will be used, if the
|
||||||
|
port or portgroup does not contain any such attribute then it will be ignored
|
||||||
|
by the driver. The following attributes can be added to the main
|
||||||
|
``ironic.conf`` file.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
[standalone_networking]
|
||||||
|
enabled = <[true|false]>
|
||||||
|
provisioning_network = <[access|trunk]/vlan-id={1 to 4094}>
|
||||||
|
cleaning_network = <[access|trunk]/vlan-id={1 to 4094}>
|
||||||
|
servicing_network = <[access|trunk]/vlan-id={1 to 4094}>
|
||||||
|
# Optionally, for inspection if a separate network is used
|
||||||
|
# inspection_network = <[access|trunk]/vlan-id={1 to 4094}>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
[standalone_networking]
|
||||||
|
enabled = true
|
||||||
|
provisioning_network = access/vlan-id=10
|
||||||
|
cleaning_network = access/vlan-id=11
|
||||||
|
servicing_network = trunk/vlan-id=12
|
||||||
|
# Optionally, for inspection if a separate network is used
|
||||||
|
# inspection_network = access/vlan-id=13
|
||||||
|
|
||||||
|
To propagate switch port configuration details to switches, the new networking
|
||||||
|
service must be provided with details needed to access and configure the
|
||||||
|
switches. This includes user credentials, network address, and any other
|
||||||
|
attributes required to access the switch.
|
||||||
|
|
||||||
|
The following example is a hybrid based on the configuration requirements of
|
||||||
|
two Neutron ML2 mechanism drivers ([1], [2]) combined with some additional
|
||||||
|
access control information to limit access to switch resources. It contains
|
||||||
|
provisions for eventually allowing different types of driver implementations to
|
||||||
|
interact with switches. These attributes can be added to the config file
|
||||||
|
supplied to the standalone networking service.
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[DEFAULT]
|
||||||
|
enabled_devices = <list of switch names>
|
||||||
|
allowed_vlans = <list of allowed vlans, takes precedence over denied_vlans
|
||||||
|
if provided>
|
||||||
|
denied_vlans = <list of denied vlans, superseded by allowed_vlans if
|
||||||
|
provided>
|
||||||
|
allowed_ports = <list of allowed port names, takes precedence over
|
||||||
|
denied_ports if provided>
|
||||||
|
denied_ports = <list of denied port names, superseded by allowed_ports if
|
||||||
|
provided>
|
||||||
|
portchannels_allowed = [true/false]
|
||||||
|
|
||||||
|
[<switch name>]
|
||||||
|
driver = <driver name>
|
||||||
|
switch_id = <switch mac address>
|
||||||
|
host = <switch management ip address>
|
||||||
|
username = <username>
|
||||||
|
password = <password, if driver support basic auth>
|
||||||
|
key_filename = <ssh private key file absolute path, if driver supports ssh>
|
||||||
|
hostkey_verify = <[true|false]>
|
||||||
|
allowed_vlans = <list of allowed vlans, takes precedence over denied_vlans
|
||||||
|
if provided. Overrides global value if supplied>
|
||||||
|
denied_vlans = <list of denied vlans, superseded by allowed_vlans if
|
||||||
|
provided. Overrides global value if supplied>
|
||||||
|
allowed_ports = <list of allowed port names, takes precedence over
|
||||||
|
denied_ports if provided. Overrides global value if supplied>
|
||||||
|
denied_ports = <list of denied port names, superseded by allowed_ports if
|
||||||
|
provided, Overrides global value if supplied>
|
||||||
|
portchannels_allowed = [true/false, Overrides global value if supplied]
|
||||||
|
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[DEFAULT]
|
||||||
|
enabled_devices = netconf-based-device.example.net,cli-based-device.example.net
|
||||||
|
allowed_vlans = 3,4,5
|
||||||
|
denied_vlans = 6,7,8
|
||||||
|
|
||||||
|
[netconf-based-device.example.net]
|
||||||
|
driver = netconf-openconfig
|
||||||
|
switch_id = <switch mac address>
|
||||||
|
host = <switch management ip address>
|
||||||
|
username = user
|
||||||
|
key_filename = /etc/ironic/ssh_keys/device_a_sshkey
|
||||||
|
hostkey_verify = false
|
||||||
|
|
||||||
|
[cli-based-device.example.net]
|
||||||
|
driver = netmiko_cisco_ios
|
||||||
|
switch_id = <switch mac address>
|
||||||
|
host = <switch management ip address>
|
||||||
|
username = user
|
||||||
|
password = secret
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
alegacy
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
n/a
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
* Define RPC API for standalone service
|
||||||
|
|
||||||
|
* Split networking-generic-switch into a reusable library without any Neutron
|
||||||
|
entanglements.
|
||||||
|
|
||||||
|
* Implement standalone service
|
||||||
|
|
||||||
|
* Implement network driver to interface with standalone service
|
||||||
|
|
||||||
|
* Implement switch driver (using refactored parts of the
|
||||||
|
networking-generic-switch package, see above) to interface with networking
|
||||||
|
equipment
|
||||||
|
|
||||||
|
* Revisit the use of the ``extra`` properties and replace with new API models
|
||||||
|
and endpoints.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
* The network-generic-switch library contains code to implement interactions
|
||||||
|
with network switches. Unfortunately, that code is entangled with Neutron
|
||||||
|
API dependencies. It is desirable to reuse as much of that library as
|
||||||
|
possible to implement part of this service, but the Neutron specific aspects
|
||||||
|
of its API and implementation must be removed. A possible path forward is to
|
||||||
|
refactor that library so that the Neutron specific parts remain in the actual
|
||||||
|
networking-generic-switch library while the switch specific parts get moved
|
||||||
|
into a new library that can be referenced from the networking-generic-switch
|
||||||
|
project and this new standalone service separately.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
* Unit testing
|
||||||
|
* Possibly a Devstack setup with a stubbed-out driver to simulate switch
|
||||||
|
configurations.
|
||||||
|
|
||||||
|
Upgrades and Backwards Compatibility
|
||||||
|
====================================
|
||||||
|
None
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
TBD
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
* [0] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/mercury.html
|
||||||
|
* [1] https://etherpad.opendev.org/p/ironic-standalone-networking
|
||||||
|
* [2] https://docs.openstack.org/networking-baremetal/latest/index.html
|
||||||
|
* [3] https://docs.openstack.org/networking-generic-switch/latest/index.html
|
Reference in New Issue
Block a user