OpenStack-Install: openstack-neuca-0.1.patch

File openstack-neuca-0.1.patch, 8.1 kB (added by pruth, 7 years ago)

NEuca patch for OpenStack?

  • nova-2011.3/nova/virt/libvirt.xml.template

     
    134134    #else 
    135135        <interface type='bridge'> 
    136136            <source bridge='${nic.bridge_name}'/> 
     137        #if $nic.neuca == False 
    137138            <mac address='${nic.mac_address}'/> 
     139        #end if 
    138140#if $getVar('use_virtio_for_bridges', True) 
    139141            <model type='virtio'/> 
    140142#end if 
     143        #if $nic.neuca == False 
    141144            <filterref filter="nova-instance-${name}-${nic.id}"> 
    142145                <parameter name="IP" value="${nic.ip_address}" /> 
    143146                <parameter name="DHCPSERVER" value="${nic.dhcp_server}" /> 
     
    148151                <parameter name="RASERVER" value="${nic.gateway_v6}" /> 
    149152#end if 
    150153            </filterref> 
     154        #end if 
    151155        </interface> 
    152156    #end if 
    153157 
  • nova-2011.3/nova/virt/libvirt/connection.py

     
    3636:allow_same_net_traffic:  Whether to allow in project network traffic 
    3737 
    3838""" 
    39  
     39import base64 
     40import ConfigParser 
     41         
    4042import hashlib 
    4143import functools 
    4244import multiprocessing 
     
    613615    @exception.wrap_exception() 
    614616    def spawn(self, context, instance, network_info, 
    615617              block_device_info=None): 
    616         xml = self.to_xml(instance, network_info, False, 
     618         
     619        #pruth@renci.org 
     620        #Add neuca intervfaces to a temp network_info  
     621        #After xml is created use old network_info 
     622        #Probably should add neuca interfaces to the db so that they are already in the list 
     623        network_info_neuca = network_info[:]       
     624        network_info_neuca = self._add_neuca_to_network_info(instance, network_info_neuca) 
     625         
     626        xml = self.to_xml(instance, network_info_neuca, False, 
    617627                          block_device_info=block_device_info) 
     628         
    618629        self.firewall_driver.setup_basic_filtering(instance, network_info) 
    619630        self.firewall_driver.prepare_instance_filter(instance, network_info) 
     631         
    620632        self._create_image(context, instance, xml, network_info=network_info, 
    621633                           block_device_info=block_device_info) 
    622  
     634     
    623635        domain = self._create_new_domain(xml) 
     636         
    624637        LOG.debug(_("instance %s: is running"), instance['name']) 
    625638        self.firewall_driver.apply_instance_filter(instance, network_info) 
    626639 
     
    11701184            xml_info['disk'] = xml_info['basepath'] + "/disk" 
    11711185        return xml_info 
    11721186 
     1187    def _add_neuca_to_network_info(self, instance, network_info): 
     1188 
     1189        #pruth@renci.org 
     1190        # Add neuca interfaces to network info 
     1191        # The necua interfaces do not require network filters and other things needed by nova interfaces. 
     1192        # Therefore we only need the neuca interfaces in network_info until the bridges and vlans are  
     1193        # configured.  
     1194         
     1195        #Set existing nics to neuca=False and collect list of interfaces used by nova 
     1196        nova_ifaces=[] 
     1197        for nic in network_info: 
     1198            nic[0]['neuca']=False 
     1199            nova_ifaces.append(nic[0]['bridge_interface']) 
     1200         
     1201        class TempFile(file): 
     1202            """Copyright (c) 2010 Alon Swartz <alon@turnkeylinux.org> - all rights reserved""" 
     1203            def __init__(self, prefix='tmp', suffix=''): 
     1204                fd, path = tempfile.mkstemp(suffix, prefix) 
     1205                os.close(fd) 
     1206                self.path = path 
     1207                self.pid = os.getpid() 
     1208                file.__init__(self, path, "w") 
     1209         
     1210                def __del__(self): 
     1211                    if self.pid == os.getpid(): 
     1212                        os.remove(self.path) 
     1213 
     1214        # Parse userdata 
     1215        self.user_data=base64.b64decode(instance['user_data']) 
     1216        fh = TempFile(prefix='euca-n-userdata') 
     1217        fh.write(self.user_data) 
     1218        fh.close() 
     1219     
     1220        self.config = ConfigParser.RawConfigParser() 
     1221        self.config.read(fh.path) 
     1222 
     1223 
     1224        #return network_info 
     1225        if not self.config.has_section('interfaces'): 
     1226                return network_info 
     1227         
     1228         
     1229        iflist = self.config.items('interfaces') 
     1230        iflist.reverse() 
     1231 
     1232        for iface in iflist: 
     1233            elem = iface[1].split(':') 
     1234         
     1235            #Sanity check(s) for neuca interface 
     1236            # Interface specification has the form of either 
     1237            # eth1=vlan:[host ethX]:[vlan tag on ethX]{:guest ip address} or 
     1238            # eth1=phys:[host ethX]{:guest ip address} 
     1239            # interfaces must start at eth1 and can be named in any order, however numbering gaps are not allowed 
     1240            # e.g. if configuration file specified eth1, eth2 and eth4 only eth1 and eth2 will be processed 
     1241            # eth1=vlan:eth1:901:172.16.42.10/24 ; eth1 attaches to vlan901 on host and has IP 172.16.42.10/24 
     1242            # eth2=vlan:eth0:19:172.16.43.10/24 ; eth2 attaches to vlan19 on host and has IP 172.16.43.10/24 
     1243            if not iface: 
     1244                LOG.info(_("Neuca: empty interface string")) 
     1245                continue  
     1246            if elem[0] == 'phys': 
     1247                LOG.info(_("Neuca: phy connection not yet supported")) 
     1248                continue 
     1249            if not elem[0] == 'vlan': 
     1250                LOG.info(_("Neuca: unrecognized network type: %s.  Expected phys or vlan"),elem[0]) 
     1251                continue 
     1252            if not len(elem) == 4: 
     1253                LOG.info(_("Neuca: incorrect format for vlan network type")) 
     1254                continue  
     1255            if elem[1] in nova_ifaces: 
     1256                LOG.info(_("Neuca: can not use iface %s because nova already is using it"), elem[1]) 
     1257                break 
     1258             
     1259            #Add neuca nics 
     1260            new_network={} 
     1261            new_network['bridge']='brv-' + elem[1] + '-' + elem[2] 
     1262            new_network['multi_host']=False 
     1263            new_network['bridge_interface']=elem[1] 
     1264            new_network['cidr_v6']=None 
     1265            new_network['vlan']=int(elem[2]) 
     1266            new_network['injected']=False 
     1267            new_network['cidr']=elem[3] 
     1268            new_network['neuca']=True 
     1269     
     1270            new_mapping={} 
     1271            new_mapping['should_create_bridge']=True 
     1272            new_mapping['should_create_vlan']=True 
     1273             
     1274            network_info.append([new_network, new_mapping]) 
     1275         
     1276        return network_info 
     1277 
    11731278    def to_xml(self, instance, network_info, rescue=False, 
    11741279               block_device_info=None): 
     1280         
    11751281        # TODO(termie): cache? 
    11761282        LOG.debug(_('instance %s: starting toXML method'), instance['name']) 
    11771283        xml_info = self._prepare_xml_info(instance, network_info, rescue, 
    11781284                                          block_device_info) 
     1285                 
    11791286        xml = str(Template(self.libvirt_xml, searchList=[xml_info])) 
     1287         
    11801288        LOG.debug(_('instance %s: finished toXML method'), instance['name']) 
    11811289        return xml 
    11821290 
  • nova-2011.3/nova/virt/libvirt/vif.py

     
    6565            'ip_address': mapping['ips'][0]['ip'], 
    6666            'dhcp_server': mapping['dhcp_server'], 
    6767            'extra_params': extra_params, 
     68            'neuca': network['neuca'], 
    6869        } 
    6970 
    7071        if gateway6: 
     
    8990                linux_net.LinuxBridgeInterfaceDriver.ensure_bridge( 
    9091                                        network['bridge'], 
    9192                                        network['bridge_interface']) 
     93        if (network.get('neuca')): 
     94            return { 'bridge_name': network['bridge'], 'neuca': network['neuca']  } 
     95        else: 
     96            return self._get_configurations(network, mapping) 
    9297 
    93         return self._get_configurations(network, mapping) 
    94  
    9598    def unplug(self, instance, network, mapping): 
    9699        """No manual unplugging required.""" 
    97100        pass