How to recover tags

Il problema

Uno dei motivi possibili quando ci sono problemi di rete all'interno di una cloud e` che il sistema di vlan locale si sia rovinato. Verificarlo e` facile, dai network e dai compute node si usa il comando ovs-vsctl show.

[root@compute ~]# ovs-vsctl show
874fc576-86c4-4933-b18a-2add7bd295ab
    Bridge br-int
        Port "qvo88806e42-19"
            tag: 3
            Interface "qvo88806e42-19"
        Port "qvo0c4337ad-fd"
            tag: 59
            Interface "qvo0c4337ad-fd"
        Port "qvof645ca47-20"
            tag: 1
            Interface "qvof645ca47-20"
        Port "qvob9f354cb-cf"
            tag: 59
            Interface "qvob9f354cb-cf"
...........

Ogni porta del bridge br-int il cui nome non sia patch-… e non sia br-int, deve avere la linea tag:<numero>, se non ce l'ha c'e` un problema. br-int puo` essere considerato come uno switch di livello due con tante porte, a ogni porta e` assegnata una vlan il cui id e` indicato dal tag. Nel caso di un compute node a ogni porta di br-int e` virtualmente connessa una virtual machine, nel network node alle porte sono connessi i dhcp server e i gateway. Vm della stessa rete sullo stesso compute node saranno connesse a porte con lo stesso tag, stesso discorso sui network per il gateway e il dhcp server della stessa rete. Per recuperare i tag scomparsi bisogna risalire alla rete ip connessa alla porta in questione. Una volta individuata la rete si puo` conoscere il "segmentation_id" che rappresenta il numero che identifica i pacchetti all'interno del tunnel gre e da qui individuare il tag.

Individuare il segmentation-id

Virtual Machine

Le virtual machine sono connesse a porte il cui nome inizia per qvo.

[root@compute ~]# ovs-vsctl show
874fc576-86c4-4933-b18a-2add7bd295ab
    Bridge br-int
        Port "qvo0c4337ad-fd"
            Interface "qvo0c4337ad-fd"

Devo risalire al mac-address della vm e da li` alla sua rete. Cerco l'interfaccia sostituendo qvo con tag. Il mac-address vero comincia con fa anziche' fe come compare da ifconfig, l'ip si puo` cercare sia sul database mysql che da command line

[root@compute ~]# ifconfig | grep tap0c4337ad-fd
tap0c4337ad-fd Link encap:Ethernet  HWaddr FE:16:3E:32:9B:7E  

mysql> use neutron_prod
mysql> select network_id from ports where mac_address="fa:16:3e:32:9b:7e";
+--------------------------------------+
| network_id                           |
+--------------------------------------+
| ec58b394-f1ea-4af9-b233-5664128bb9ed |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select segmentation_id from ovs_network_bindings where network_id="ec58b394-f1ea-4af9-b233-5664128bb9ed";
+-----------------+
| segmentation_id |
+-----------------+
|              11 |
+-----------------+
1 row in set (0.00 sec)

Oppure

[root@controller ~]# neutron port-list | grep fa:16:3e:32:9b:7e
| 0c4337ad-fdc0-4b83-8444-3b713104c50d |      | fa:16:3e:32:9b:7e | {"subnet_id": "a4bafbd8-4275-4786-acc0-12515b794c86", "ip_address": "10.64.11.16"}   |

[root@controller ~]# neutron net-list | grep 10.64.11.
| ec58b394-f1ea-4af9-b233-5664128bb9ed | Guest-lan           | a4bafbd8-4275-4786-acc0-12515b794c86 10.64.11.0/24  |

[root@controller ~]# neutron net-show ec58b394-f1ea-4af9-b233-5664128bb9ed | grep segmentation_id
| provider:segmentation_id  | 11 |                                 |
Dhcp server

I dhcp server sui network node sono connessi a porte il cui nome inizia per tap.

[root@network ~]# ovs-vsctl show
bf049d01-0798-4d8b-9568-464fcbae2b96
    Bridge br-int
        Port "tapcdb55ed4-85"
            Interface "tapcdb55ed4-85"
                type: internal

La rete ip si trova facilmente con un ps

[root@network ~]# ps aux | grep tapcdb55ed4-85
nobody    4947  0.0  0.0  12888   660 ?        S    Feb12   0:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tapcdb55ed4-85 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/09934abe-4170-46b2-afa1-8a2b3533dba8/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/09934abe-4170-46b2-afa1-8a2b3533dba8/host --dhcp-optsfile=/var/lib/neutron/dhcp/09934abe-4170-46b2-afa1-8a2b3533dba8/opts --leasefile-ro --dhcp-range=tag0,10.64.14.0,static,86400s --dhcp-lease-max=256 --conf-file= --domain=openstacklocal

La rete e` la 10.64.14.0

mysql> select network_id from subnets where cidr="10.64.14.0/24";
+--------------------------------------+
| network_id                           |
+--------------------------------------+
| 09934abe-4170-46b2-afa1-8a2b3533dba8 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select segmentation_id from ovs_network_bindings where network_id="09934abe-4170-46b2-afa1-8a2b3533dba8";
+-----------------+
| segmentation_id |
+-----------------+
|              10 |
+-----------------+
1 row in set (0.00 sec)

Oppure

[root@controller ~]# neutron subnet-list | grep 10.64.14.0
| 2d399746-45a9-4835-b773-22de630195f4 | sub-first-lan    | 10.64.14.0/24  | {"start": "10.64.14.2", "end": "10.64.14.254"}     |

[root@controller ~]# neutron subnet-show 2d399746-45a9-4835-b773-22de630195f4 | grep network_id
| network_id       | 09934abe-4170-46b2-afa1-8a2b3533dba8 

[root@controller ~]# neutron net-show 09934abe-4170-46b2-afa1-8a2b3533dba8 | grep segmentation_id
| provider:segmentation_id  | 10                                   |
Gateway

I gateway sui network node sono connessi a porte il cui nome inizia per qr.

[root@network ~]# ovs-vsctl show
bf049d01-0798-4d8b-9568-464fcbae2b96
    Bridge br-int
        Port "qr-91e6cdf7-bc"
            Interface "qr-91e6cdf7-bc"
                type: internal

Bisogna cercare l'indirizzo ip nei namespace dei router, fino a che non si trova una risposta.

[root@network ~]# ip netns | grep qrouter
qrouter-1450abf3-5513-4916-aa96-254c66f96888
qrouter-231d199c-d768-4e00-9099-c163df8b3230

[root@network ~]# ip netns exec qrouter-1450abf3-5513-4916-aa96-254c66f96888 ifconfig | grep -A1 qr-91e6cdf7-bc
[root@network ~]# ip netns exec qrouter-231d199c-d768-4e00-9099-c163df8b3230 ifconfig | grep -A1 qr-91e6cdf7-bc
qr-91e6cdf7-bc Link encap:Ethernet  HWaddr FA:16:3E:D4:54:84  
          inet addr:10.64.14.1  Bcast:10.64.14.255  Mask:255.255.255.0         

Il resto del procedimento e` uguale al precedente.

Individuare il tag e assegnarlo

Il passaggio dal segmentation_id al tag e` uguale per tutti i tipi di nodo. Si cerca nella tabella dei flussi la corrispondenza tra vlan_vid, che e` quello che si sta cercando e il tun_id che e` il segmentation_id espresso in esadecimale.

[root@compute ~]# ovs-ofctl dump-flows br-tun | grep table=2, | grep tun_id=0xb
 cookie=0x0, duration=603456.297s, table=2, n_packets=218540, n_bytes=285300291, idle_age=474, hard_age=65534, priority=1,tun_id=0xb actions=mod_vlan_vid:59,resubmit(,10)

risulta che il tag per la porta qvo0c4337ad-fd del compute node e` 59 e si puo` riassegnare

[root@compute ~]# ovs-vsctl set port qvo0c4337ad-fd tag=59