aboutsummaryrefslogtreecommitdiffstats
path: root/deploy/network.sh
blob: b74a1b40e40626d1b920a667afd1e12e4d099891 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#!/bin/bash
##############################################################################
# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
function clear_forward_rejct_rules()
{
    while sudo iptables -nL FORWARD --line-number|grep -E 'REJECT +all +-- +0.0.0.0/0 +0.0.0.0/0 +reject-with icmp-port-unreachable'|head -1|awk '{print $1}'|xargs sudo iptables -D FORWARD; do :; done
    ip_forward=$(cat /proc/sys/net/ipv4/ip_forward)
    if [ $ip_forward -eq 0 ]; then
        sysctl -w net.ipv4.ip_forward=1
    fi
}

function setup_bridge_net()
{
    net_name=$1
    nic=$2

    sudo ifconfig $nic up

    sudo virsh net-destroy $net_name
    sudo virsh net-undefine $net_name

    sed -e "s/REPLACE_NAME/$net_name/g" \
        -e "s/REPLACE_NIC/$nic/g" \
    $COMPASS_DIR/deploy/template/network/bridge_nic.xml \
    > $WORK_DIR/network/$net_name.xml

    sudo virsh net-define $WORK_DIR/network/$net_name.xml
    sudo virsh net-start $net_name
    sudo virsh net-autostart $net_name
}

function recover_bridge_net()
{
    net_name=$1

    sudo virsh net-start $net_name
}

function save_network_info()
{
    sudo ovs-vsctl list-br |grep br-external
    br_exist=$?
    external_nic=`ip route |grep '^default'|awk '{print $5F}'`
    route_info=`ip route |grep -Eo '^default via [^ ]+'`
    ip_info=`ip addr show $external_nic|grep -Eo '[^ ]+ brd [^ ]+ '`
    if [ $br_exist -eq 0 ]; then
        if [ "$external_nic" != "br-external" ]; then
            sudo ip link set br-external up
            sudo ovs-vsctl --may-exist add-port br-external $external_nic
            sudo ip addr flush $external_nic
            sudo ip addr add $ip_info dev br-external
            sudo ip route add $route_info dev br-external
        fi
    else
        sudo ovs-vsctl add-br br-external
        sudo ip link set br-external up
        sudo ovs-vsctl add-port br-external $external_nic
        sudo ip addr flush $external_nic
        sudo ip addr add $ip_info dev br-external
        sudo ip route add $route_info dev br-external
    fi

    # Configure OS_MGMT_NIC when openstack external network and mgmt network use different nics
    if [[ x"$OS_MGMT_NIC" != "x" ]]; then
        sudo ovs-vsctl --may-exist add-port br-external $OS_MGMT_NIC
        sudo ip link set $OS_MGMT_NIC up
        sudo ip addr flush $OS_MGMT_NIC
    fi
}

function setup_bridge_external()
{
    sudo virsh net-destroy external
    sudo virsh net-undefine external

    save_network_info
    sed -e "s/REPLACE_NAME/external/g" \
        -e "s/REPLACE_OVS/br-external/g" \
    $COMPASS_DIR/deploy/template/network/bridge_ovs.xml \
    > $WORK_DIR/network/external.xml

    sudo virsh net-define $WORK_DIR/network/external.xml
    sudo virsh net-start external
    sudo virsh net-autostart external

}

function recover_bridge_external()
{
    sudo virsh net-start external

}

function setup_nat_net() {
    net_name=$1
    gw=$2
    mask=$3
    ip_start=$4
    ip_end=$5

    sudo virsh net-destroy $net_name
    sudo virsh net-undefine $net_name
    # create install network
    sed -e "s/REPLACE_BRIDGE/br_$net_name/g" \
        -e "s/REPLACE_NAME/$net_name/g" \
        -e "s/REPLACE_GATEWAY/$gw/g" \
        -e "s/REPLACE_MASK/$mask/g" \
        -e "s/REPLACE_START/$ip_start/g" \
        -e "s/REPLACE_END/$ip_end/g" \
        $COMPASS_DIR/deploy/template/network/nat.xml \
        > $WORK_DIR/network/$net_name.xml

    sudo virsh net-define $WORK_DIR/network/$net_name.xml
    sudo virsh net-start $net_name
    sudo virsh net-autostart $net_name
}

function recover_nat_net() {
    net_name=$1

    sudo virsh net-start $net_name
}

function setup_virtual_net() {
  setup_nat_net install $INSTALL_GW $INSTALL_NETMASK

  if [[ "$NAT_EXTERNAL"  == "false" ]]; then
     setup_bridge_external
  else
      setup_nat_net external_nat $EXT_NAT_GW $EXT_NAT_MASK $EXT_NAT_IP_START $EXT_NAT_IP_END
  fi
}

function recover_virtual_net() {
  recover_nat_net install
}

function setup_baremetal_net() {
  if [[ -z $INSTALL_NIC ]]; then
    exit 1
  fi
  sudo ifconfig $INSTALL_NIC up
  sudo ifconfig $INSTALL_NIC promisc
  sudo ifconfig $INSTALL_NIC $INSTALL_GW netmask $INSTALL_NETMASK
}

function recover_baremetal_net() {
  if [[ -z $INSTALL_NIC ]]; then
    exit 1
  fi
  recover_bridge_net install
}

function setup_network_boot_scripts() {
    sudo cp $COMPASS_DIR/deploy/network.sh /usr/sbin/network_setup
    sudo chmod +777 /usr/sbin/network_setup
    sudo cat << EOF >> /usr/sbin/network_setup

sleep 2
#save_network_info
clear_forward_rejct_rules
EOF
    sudo chmod 755 /usr/sbin/network_setup

    egrep -R "^/usr/sbin/network_setup" /etc/rc.local
    if [[ $? != 0 ]]; then
        sudo sed -i '/^exit 0/i\/usr\/sbin\/network_setup' /etc/rc.local
    fi
}

function create_nets() {

    # create install network
    setup_"$TYPE"_net

    # create external network
    # setup_bridge_external
    clear_forward_rejct_rules

    setup_network_boot_scripts
}

function recover_nets() {
    recover_nat_net mgmt

    # recover install network
    recover_"$TYPE"_net

    # recover external network
    recover_bridge_external
    clear_forward_rejct_rules
}