aboutsummaryrefslogtreecommitdiffstats
path: root/extraconfig/pre_network/contrail/compute_pre_network.yaml
blob: a30330f9b29f4e71515f5b72d2c3922c169b3723 (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
heat_template_version: pike

# NOTE: You don't need to pass the parameter explicitly from the
# parent template, it can be specified via the parameter_defaults
# in the resource_registry instead, if you want to override the default
# and/or share values with other templates in the tree.
parameters:
  ContrailRepo:
    type: string
    default: ''
  ContrailVrouterPhysicalInterface:
    default: 'eth0'
    description: vRouter physical interface
    type: string
  ContrailVlanParentInterface:
    default: ''
    description: Parent interface of vlan interface
    type: string
  ContrailBondInterface:
    default: ''
    description: Bond interface name
    type: string
  ContrailBondInterfaceMembers:
    default: ''
    description: Bond interface members
    type: string
  ContrailBondMode:
    default: '4'
    description: Bond Mode
    type: string
  ContrailBondPolicy:
    default: '1'
    description: Bond Policy
    type: string
  RoleParameters:
    type: json
    description: Role Specific parameters
    default: {}
  ServiceNames:
    type: comma_delimited_list
    default: []
  server:
    type: string

description: >
  This template installs the Contrail kernel module  packages in order
  to bring vhost0 interface up. Vhost0 interface must be up before
  os-net-config takes over.

resources:

  ContrailVrouterModuleDeployment:
    type: OS::Heat::SoftwareDeployment
    properties:
      name: ContrailVrouterModuleDeployment
      server:  {get_param: server}
      config: {get_resource: ContrailVrouterModuleConfig}
      input_values:
        phy_int: {get_param: ContrailVrouterPhysicalInterface}
        bond_int: {get_param: ContrailBondInterface}
        bond_int_members: {get_param: ContrailBondInterfaceMembers}
        vlan_parent: {get_param: ContrailVlanParentInterface}
        contrail_repo: {get_param: ContrailRepo}
        bond_mode: {get_param: ContrailBondMode}
        bond_policy: {get_param: ContrailBondPolicy}
      actions: ['CREATE'] # Only do this on CREATE

  ContrailVrouterModuleConfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      inputs:
      - name: phy_int
      - name: bond_int
      - name: bond_int_members
      - name: vlan_parent
      - name: contrail_repo
      - name: bond_mode
      - name: bond_policy
      config: |
        #!/bin/bash
        phy_int=$phy_int
        bond_int=$bond_int
        bond_int_members=$bond_int_members
        bond_mode=$bond_mode
        bond_policy=$bond_policy
        vlan_parent=$vlan_parent
        contrail_repo=$contrail_repo
        if [[ ${contrail_repo} ]]; then
          yum install -y contrail-vrouter-utils
        fi
        function pkt_setup () {
            for f in /sys/class/net/$1/queues/rx-*
            do
                q="$(echo $f | cut -d '-' -f2)"
                r=$(($q%32))
                s=$(($q/32))
                ((mask=1<<$r))
                str=(`printf "%x" $mask`)
                if [ $s -gt 0 ]; then
                    for ((i=0; i < $s; i++))
                    do
                        str+=,00000000
                    done
                fi
                echo $str > $f/rps_cpus
            done
            ifconfig $1 up
        }
        function insert_vrouter() {
            if [ -f /sys/class/net/pkt1/queues/rx-0/rps_cpus ]; then
                pkt_setup pkt1
            fi
            if [ -f /sys/class/net/pkt2/queues/rx-0/rps_cpus ]; then
                pkt_setup pkt2
            fi
            if [ -f /sys/class/net/pkt3/queues/rx-0/rps_cpus ]; then
                pkt_setup pkt3
            fi
            DEV_MAC=$(cat /sys/class/net/${phy_int}/address)
            vif --create vhost0 --mac $DEV_MAC
            vif --add ${phy_int} --mac $DEV_MAC --vrf 0 --vhost-phys --type physical
            vif --add vhost0 --mac $DEV_MAC --vrf 0 --type vhost --xconnect ${phy_int}
            ip link set vhost0 up
            return 0
        }
        if [[ ${bond_int} ]]; then
           bond_int_member_list=$(echo ${bond_int_members} | tr "," "\n")
           ip link add name ${bond_int} type bond
           echo ${bond_mode} > /sys/class/net/${bond_int}/bonding/mode
           echo ${bond_policy} > /sys/class/net/${bond_int}/bonding/xmit_hash_policy
           for member in ${bond_int_member_list}; do
               ip link set dev $member master ${bond_int}
           done
        fi
        if [[ ${vlan_parent} ]]; then
            vlanId=`echo ${phy_int} | awk -F"vlan" '{print $2}'`
            ip link add name ${phy_int} link ${vlan_parent} type vlan id ${vlanId}
        fi
        if [[ ${contrail_repo} ]]; then
          yumdownloader contrail-vrouter --destdir /tmp
          cd /tmp
          rpm2cpio /tmp/contrail-vrouter*.rpm | cpio -idmv
          cp `find /tmp/lib/modules -name vrouter.ko |tail -1` /tmp
          insmod /tmp/vrouter.ko
        else
          modprobe vrouter
        fi
        insert_vrouter
        if [[ `ifconfig ${phy_int} |grep "inet "` ]]; then
          def_gw=''
          if [[ `ip route show |grep default|grep ${phy_int}` ]]; then
            def_gw=`ip route show |grep default|grep ${phy_int}|awk '{print $3}'`
          fi
          ip=`ifconfig ${phy_int} |grep "inet "|awk '{print $2}'`
          mask=`ifconfig ${phy_int} |grep "inet "|awk '{print $4}'`
          ip address delete $ip/$mask dev ${phy_int}
          ip address add $ip/$mask dev vhost0
          if [[ $def_gw ]]; then
            ip route add default via $def_gw
          fi
        fi