-
Notifications
You must be signed in to change notification settings - Fork 294
Merge feature/host-network-device-ordering into master #6724
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Signed-off-by: Ming Lu <ming.lu@cloud.com>
Signed-off-by: Ming Lu <ming.lu@cloud.com>
This part sorts host network devices in xcp-networkd. Previously, the ordering was handled by the interface-rename functionality. This will now be replaced by an equivalent function in xcp-networkd, but without renaming the network devices. The renmaing performed by the interface-rename was used to record the sorting result as the name of the NICs like "eth<N>". Now the sorting result will be saved in xcp-networkd database. Signed-off-by: Ming Lu <ming.lu@cloud.com>
The "test_network_device_order_inherited.ml" is inherited from the interface-rename functionality. Signed-off-by: Ming Lu <ming.lu@cloud.com>
This part sorts host network devices in xcp-networkd. Previously, the ordering was handled by the interface-rename functionality. This will now be replaced by an equivalent function in xcp-networkd, but without renaming the network devices. The renmaing performed by the interface-rename was used to record the sorting result as the name of the NICs like "eth<N>". Now the sorting result will be recorded as internal files.
These IBFT devices are not managed by Toolstack and therefore are not involved in the ordering process. Signed-off-by: Ming Lu <ming.lu@cloud.com>
…6453) These IBFT devices are not managed by Toolstack and therefore are not involved in the ordering process.
`Network_utils.is_sorted_by_script` checks interface-rename-data dir. When true: Follow the legacy behavior, the new added interface_order field is always None. When false: Use `Network_device_order.sort` to sort the interfaces, store the result in config.interface_order. Signed-off-by: Changlei Li <changlei.li@cloud.com>
When xapi start, networkd config will be reset, see Xapi_pif.start_of_day_best_effort_bring_up. In fact, the interface_order is only maintained by networkd, it shouldn't be cleared. Signed-off-by: Changlei Li <changlei.li@cloud.com>
If networkd config.interface_order is None, then sort based on the renamed interfaces name "ethx" to indicate its position, else get positions from config.interface_order. Signed-off-by: Changlei Li <changlei.li@cloud.com>
Xapi get interface position from `get_interface_positions`, instead of getting position from "ethx" name. Signed-off-by: Changlei Li <changlei.li@cloud.com>
Some devices like ibft may not be in networkd sort result but need to build pif, network for it. So the devices need be got by `get_all`. Signed-off-by: Changlei Li <changlei.li@cloud.com>
Pif device name maybe change. Look up device_to_position table to get the new device name in pif refresh. Then update to db. This function is called by pif.scan and resynchronise_pif_params. Signed-off-by: Changlei Li <changlei.li@cloud.com>
This PR is the adaption of #6381 in networkd and xapi. Legacy: Keep the legacy behaviour, use host-installer, sort-script to sort and rename the network interfaces to `ethx`. New: Use `Network_device_order.sort` to sort the interfaces, store the result in networkd `config.interface_order`. Compatibility is offered by check the sort-script `interface-rename-data` dir. Add new interface [Interface.get_interface_positions](b2e7113) to pass interfaces and positions from networkd to xapi.
Signed-off-by: Changlei Li <changlei.li@cloud.com>
As pool.eject_self calls interface-rename script to rename the network interfaces, this behavior should be done compatibly. So, move the interface-rename to networkd with compatibility check. Signed-off-by: Changlei Li <changlei.li@cloud.com>
As pool.eject_self calls interface-rename script to rename the network interfaces, this behaviour should be done compatibly. So, move the interface-rename to networkd with compatibility check. When reset networkd state legacy: use interface-rename script to sort and rename new: use networkd network_device_order with initial empty order to sort
With interface-rename functionality, the host network devices are ordered and renamed like "eth<N>". So they can be filtered by hard-coded "eth" and added into the networkd monitor list and rrdd collecting list. While the interface-rename is being replaced by the ordering function in networkd. Unlike the interface-rename, the networkd will not rename the host network devices anymore. Instead, the naming of them are left to the built-in systemd and Kernel. In both cases, the networkd's Interface.get_interface_positions can return the managed (ordered) host network devices: when the interface-rename functionality is still working, it returns the list of "eth<N>"; when networkd takes the place to perform the ordering, it returns the names generated by systemd and Kernel. Signed-off-by: Ming Lu <ming.lu@cloud.com>
…#6480) With interface-rename functionality, the host network devices are ordered and renamed like "eth<N>". So they can be filtered by hard-coded "eth" and added into the networkd monitor list and rrdd collecting list. While the interface-rename is being replaced by the ordering function in networkd. Unlike the interface-rename, the networkd will not rename the host network devices anymore. Instead, the naming of them are left to the built-in systemd and Kernel. In both cases, the networkd's Interface.get_interface_position can return the managed (ordered) host network devices: when the interface-rename functionality is still working, it returns the list of "eth<N>"; when networkd takes the place to perform the ordering, it returns the names generated by systemd and Kernel.
When networkd sort the interfaces, host-installer will not write management interface and managemnt address type. Then networkd need to write management interface to inventory according to firstboot management conf. Signed-off-by: Changlei Li <changlei.li@cloud.com>
This hard code in rename_network_label is used to find NIC position by ethN. Change to use bridge name to find the position. Signed-off-by: Changlei Li <changlei.li@cloud.com>
1. network-init script need read inventory and get management address type. This item should be written to inventory by networkd, the same as management interface item. Because host-installer will not write it from the new netdev ordering, see xenserver/host-installer@33aa793. 2. networl-init renames network name label under common criteria. There was hard code ethx to determine the interface position. Now change to get position from the bridge which is right both on legacy and new ordering method.
The host installer uses this utility to get the management interface from the management bridge. Now it changes to use MAC address(es) to find out the management interface(s). This is because the interface-rename functionality will be deprecated and the names of the network interfaces are not guaranteed to be the same between dom0 and host installer's running environment. Note that this change must be delivered to a host before upgrading to a new version in which the interface-rename is deprecated because the host installer is built from the new version and it will not be able to find the management network interface by name if the networkd_db command returns only names generated by interface-rename. Specifically, the "interface_order" field is only available when the networkd takes place of interface-rename to generate order. Before that, only the "bridge_mac" can be used because at that time, the host installer only uses one interface to setup its own networking during installation and no MAC addresses are recorded in networkd.db for individual interfaces. The "bridge_mac" is just the MAC address of one of the interfaces which construct the management bridge. Signed-off-by: Ming Lu <ming.lu@cloud.com>
The host installer uses this utility to get the management interface from the management bridge. Now it changes to use MAC address(es) to find out the management interface(s). This is because the interface-rename functionality will be deprecated and the names of the network interfaces are not guaranteed to be the same between dom0 and host installer's running environment. Note that this change must be delivered to a host before upgrading to a new version in which the interface-rename is deprecated because the host installer is built from the new version and it will not be able to find the management network interface by name if the networkd_db command returns only names generated by interface-rename. Specifically, the "interface_order" field is only available when the networkd takes place of interface-rename to generate order. Before that, only the "bridge_mac" can be used because at that time, the host installer only uses one interface to setup its own networking during installation and no MAC addresses are recorded in networkd.db for individual interfaces. The "bridge_mac" is just the MAC address of one of the interfaces which construct the management bridge.
On XS 8, `service xapi stop` redirect to `systemctl`. On XS 9, `service` is not supported. So use `systemctl` to stop xapi service. Signed-off-by: Changlei Li <changlei.li@cloud.com>
If interface-rename script doesn't exist, networkd will - handle the interfaces sorting - write inventory when first boot So, when interface-rename doesn't exist, xe-reset-networking should: - NOT call interface-rename script - Delete MANAGEMENT_INTERFACE value in inventory. BTW, the current bridge name conversion method rely on hardcode 'eth' which is correct only when interface-rename script exists.
Get a stricter check for eth<N> with sscanf or re rather than start_with "eth" Signed-off-by: Changlei Li <changlei.li@cloud.com>
Do not use the device name in the new created network name_label if the device has a position. Given the fact that device names may be different on different hosts of the pool, even they are of the same position. So it is more proper to just use the position in the network name_label. Also this will be good for interface name change scenario as this change will not reflect in this default network name_label. Signed-off-by: Changlei Li <changlei.li@cloud.com>
1. Unify the behaviour when converting interface name to bridge name. Get a stricter check for eth<N> with sscanf or re rather than start_with "eth". 2. Construct the default name_label for new created network only with position.
The bus-info of a USB-based network device follows the format "usb-<PCI address of USB controller>-<USB port path>". To determine the device's order when sorting, use the PCI address of the USB controller. Signed-off-by: Changlei Li <changlei.li@cloud.com>
The bus-info of a USB-based network device follows the format `usb-<PCI address of USB controller>-<USB port path>`. To determine the device's order when sorting, use the PCI address of the USB controller.
After RPU from legacy network device name, the name in PIF object should be updated. The new network device name is in interface_tables.device_to_position_table. The position of old device name in PIF object can be get by its associated bridge and then correspond with the new name. In this procedure, a exsiting bridge is used to get the position. However, the bridge is used to update MTU. It is specially handled when the device is under a bond. The bridge is actually the parent bond bridge. This leads to no position is found for old device name and then device name is not updated correctly. Fix: use the associated bridge to find the position. Signed-off-by: Changlei Li <changlei.li@cloud.com>
After RPU from legacy network device name, the name in PIF object should be updated. The new network device name is in interface_tables.device_to_position_table. The position of old device name in PIF object can be get by its associated bridge and then correspond with the new name. In this procedure, an existing bridge is used to get the position. However, the bridge is used to update MTU. It is specially handled when the device is under a bond. The bridge is actually the parent bond bridge. This leads to no position is found for old device name and then device name is not updated correctly. Fix: use the associated bridge to find the position.
For pif which is vlan-master or sriov-logic-pif, its pif.device comes from its vlan-slave or sriov-physical-pif pif.device. After RPU, the network interface name may change. Its corresponding physical pif.device is synced already. The vlan or sriov non-physical pif.device should be synced accordingly. For non-physical and unattached pifs (like vlan, sriov pifs that are not used), the pif.device need to be updated too. So, refresh_all get all pifs on the host and in refresh_internal the pif fields physical and currently-attached are carefully distinguished to keep the original logic not changed. Signed-off-by: Changlei Li <changlei.li@cloud.com>
Signed-off-by: Changlei Li <changlei.li@cloud.com>
For pif which is vlan-master or sriov-logic-pif, its pif.device comes
from its vlan-slave or sriov-physical-pif pif.device.
For example:
```
uuid ( RO) : 00bfb6be-041b-2d16-4118-e98d4f4758a1
device ( RO): eth1
physical ( RO): false
currently-attached ( RO): false
VLAN ( RO): 12
vlan-master-of ( RO): 7efb4476-95d7-e27e-6646-983e33ef9a67
vlan-slave-of ( RO):
uuid ( RO) : 32073526-d992-3a2f-9653-f5f5b368680f
device ( RO): eth1
physical ( RO): true
currently-attached ( RO): true
VLAN ( RO): -1
vlan-master-of ( RO): <not in database>
vlan-slave-of ( RO): 7efb4476-95d7-e27e-6646-983e33ef9a67
```
Their names are both eth1. In this feature branch, the interface name
may change after RPU. The physical pif.device is synced in
refresh_internal. But the vlan or sriov non-physical pif.device is not
handled.
This PR syncs the vlan or sriov pif.device by finding its corresponding
physical pif device and get the real device name.
What's more, for all the pif types:
- Physical: maybe change, need to lookup device_to_position_table to get
new device
- VLAN_untagged: get the underlying physical PIF device
- Network_sriov_logical: get the underlying physical PIF device
- Tunnel_access: tunnelN, no need to change
- Bond_master: bondN, no need to change
The function `get_pif_device` is extracted to handle the pif.device by
its type.
At last, the currently-attached:false and nonphysical pif.device need to
be updated too. The refresh_all function is changed to handle all the
pifs on the host.
Signed-off-by: Changlei Li <changlei.li@cloud.com>
Signed-off-by: Changlei Li <changlei.li@cloud.com>
Signed-off-by: Changlei Li <changlei.li@cloud.com>
For pool join procedure, the slave host will go through 1 pre_join_check 2 update_non_vm_metadata: in this step, create pif objects for physical pifs of slave host on master host db. 3 on slave xapi start: copy_bonds_from_master, copy_network_sriovs_from_master, copy_vlans_from_master, copy_tunnels_from_master This issue happens on step 3 when copy bonds from master. for every bond on master - get the bond master pif on master - get the bond slave pifs on master - confirm the primary bond slaves via comparing the bond master pif mac - find the corresponding pifs on slave host - decide if create bond on slave host In `find the corresponding pifs on slave host`, the previous method is to compare the pif.device on master and slave hosts. Now we should compare the position of pif device. Because the network device name is no longer renamed to ethx, which x is actually the position. It's similar for copy_network_sriovs_from_master. For vlans and tunnels, they are based the underneath network, no pif.device compare. So, this issue doesn't exist.
Signed-off-by: Changlei Li <changlei.li@cloud.com>
| if [ -z "${bridge}" ]; then | ||
| continue | ||
| fi | ||
| device_id=$(echo ${bridge} | sed 's/^xenbr//') |
Check warning
Code scanning / shellcheck
SC2001 Warning
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Previous PR #6483 didn't check this. New check rule?
Can replace with device_id="${bridge#xenbr}".
Test
# bridge=xenbr1
# device_id="${bridge#xenbr}"
# echo $device_id
1
| if [ -z "${bridge}" ]; then | ||
| continue | ||
| fi | ||
| device_id=$(echo ${bridge} | sed 's/^xenbr//') |
Check warning
Code scanning / shellcheck
SC2086 Warning
See xapi-project#6724 Signed-off-by: Changlei Li <changlei.li@cloud.com>
|
New PR: #6725 |
No conflict. Add two commits to 1. update datamodel_lifecycle 2. Make CI shellcheck happy, see #6724
No description provided.