Exemple #1
0
def InitQos(topospec):
    global QosCosAllocator
    global QosDscpAllocator
    qos = getattr(topospec, "qos", False)
    if qos is False:
        QosCosAllocator = objects.TemplateFieldObject("range/7/7")
        QosDscpAllocator = objects.TemplateFieldObject("range/7/7")
    QosCosAllocator.EnableWrapAround()
    QosDscpAllocator.EnableWrapAround()
Exemple #2
0
    def __init__(self):
        ''' Class which will give the next hash-value to use according to the 
            policy
        '''

        self.hash_lsb = objects.TemplateFieldObject('range/0x0/0x1fffff')
        self.hash_msb = objects.TemplateFieldObject('range/0x0/0x7ff')
        # For 32 bit collision, hints should be 1
        self.hash_policy = [
            # 2 Flows - 1 recirc
            {
                'name': '32BIT F1',
                'hints': 0,
                'hint_depth': 1,
                'skip': 1
            },
            # 3 Flows - 2 recirc
            {
                'name': '32BIT F2',
                'hints': 0,
                'hint_depth': 2,
                'skip': 1
            },
            # 5 Flows - 4 recirc
            {
                'name': '32BIT F3',
                'hints': 0,
                'hint_depth': 4,
                'skip': 1
            },
            # 2 Flows - 1 recirc
            {
                'name': '21BIT F1',
                'hints': 1,
                'hint_depth': 1,
                'skip': 1
            },
            # 3 Flows - 1 recirc
            {
                'name': '21BIT F2',
                'hints': 2,
                'hint_depth': 1,
                'skip': 1
            },
            # 15 Flows - 2/3 recircs
            {
                'name': '21BIT F3',
                'hints': 7,
                'hint_depth': 2,
                'skip': 1
            },
        ]
        self.cur_hash_lsb = self.hash_lsb.get()
        self.cur_hash_msb = self.hash_msb.get()
        self.cur_iter = 0
        self.cur_step = 0
Exemple #3
0
 def CreateSlabs(self):
     logger.debug("In CreateSlabs, NVMe LIF %s" % (self.GID()))
     self.slab_allocator = objects.TemplateFieldObject("range/0/2048")
     self.slabs = objects.ObjectDatabase()
     self.obj_helper_slab = slab.SlabObjectHelper()
     self.obj_helper_slab.Generate2(self, self.total_slabs, self.spec.host_page_size, self.spec.host_page_size)
     self.obj_helper_slab.Configure()
     self.slabs.SetAll(self.obj_helper_slab.slabs)
Exemple #4
0
 def CreateSlabs(self, spec):
     logger.debug("In CreateSlabs, Endpoint %s" % (self.GID()))
     self.slab_allocator = objects.TemplateFieldObject("range/0/2048")
     self.slabs = objects.ObjectDatabase()
     self.mr_slabs = objects.ObjectDatabase()
     self.obj_helper_slab = slab.SlabObjectHelper()
     self.obj_helper_slab.Generate(self.intf.lif, spec)
     self.slabs.SetAll(self.obj_helper_slab.slabs)
     self.mr_slabs.SetAll(self.obj_helper_slab.slabs)
     self.total_mr_slabs += len(self.mr_slabs)
Exemple #5
0
    def ChangeSubnet(self, vnic, new_subnet):
        logger.info(
            f"Changing subnet for {vnic} {vnic.SUBNET} => {new_subnet}")
        # Handle child/parent relationship
        old_subnet = vnic.SUBNET
        old_subnet.DeleteChild(vnic)
        new_subnet.AddChild(vnic)
        vnic.SUBNET = new_subnet
        vnic.Vnid = vnic.SUBNET.Vnid

        if not utils.IsDryRun():
            node_uuid = EzAccessStoreClient[new_subnet.Node].GetNodeUuid(
                new_subnet.Node)
            vnic.HostIfIdx = vnic.SUBNET.HostIfIdx[0]
            vnic.HostIfUuid = utils.PdsUuid(vnic.HostIfIdx,
                                            node_uuid=node_uuid)

        # Handle node change scenario
        if old_subnet.Node != new_subnet.Node:
            # Delete VNIC from old node
            del self.Objs[vnic.Node][vnic.VnicId]
            del self.__l2mapping_objs[vnic.Node][(vnic.MACAddr.getnum(),
                                                  vnic.SUBNET.UUID.GetUuid(),
                                                  vnic.VlanId())]
            vnic.Node = new_subnet.Node
            self.Objs[vnic.Node].update({vnic.VnicId: vnic})
            self.__l2mapping_objs[vnic.Node].update({
                (vnic.MACAddr.getnum(), vnic.SUBNET.UUID.GetUuid(),
                 vnic.VlanId()):
                vnic
            })

            # Move children to new Node
            for lmap in vnic.Children:
                # Operate only on lmapping objects
                if lmap.GetObjectType() != api.ObjectTypes.LMAPPING:
                    continue

                # Move lmap entry to new Node
                lmapping.client.ChangeNode(lmap, new_subnet.Node)

                # Destroy rmap entry in new subnet
                rmap = new_subnet.GetRemoteMappingObjectByIp(lmap.IP)
                assert (rmap)
                rmap.Destroy()

                # Add rmap entry in old subnet
                mac = "macaddr/%s" % vnic.MACAddr.get()
                rmap_spec = {}
                rmap_spec['rmacaddr'] = objects.TemplateFieldObject(mac)
                rmap_spec['ripaddr'] = lmap.IP
                ipversion = utils.IP_VERSION_6 if lmap.AddrFamily == 'IPV6' else utils.IP_VERSION_4
                rmapClient.GenerateObj(old_subnet.Node, old_subnet, rmap_spec,
                                       ipversion)
        return
Exemple #6
0
    def Init(self, lif, spec):
        self.GID(spec.id)
        self.lif        = lif
        self.spec       = spec
        self.id         = spec.id
        self.type       = spec.type
        self.purpose    = spec.purpose.upper()
        self.size       = spec.size
        self.count      = spec.count
        self.entries    = None

        self.queueid_allocator = objects.TemplateFieldObject("range/0/16384")

        self.queues = objects.ObjectDatabase()
        self.need_type_specific_configure = True
        if spec.id in eth_queue_type_ids:
            self.obj_helper_q = eth_queue.EthQueueObjectHelper()
            if GlobalOptions.rtl and not GlobalOptions.skipverify:
                if self.purpose == "LIF_QUEUE_PURPOSE_RX":
                    # Ring the doorbell, don't increment the PI and don't set
                    # the scheduler bit.
                    # The PI will be incremented by directly writing to QState.
                    self.upd = 0x0
                elif self.purpose == "LIF_QUEUE_PURPOSE_TX":
                    # Ring the doorbell, don't increment the PI and but set
                    # the scheduler bit.
                    # The PI will be incremented by directly writing to QState.
                    self.upd = 0x1
                else:
                    self.upd = 0x0
            else:
                if self.purpose == "LIF_QUEUE_PURPOSE_RX":
                    # Ring the doorbell, set PI=index and the scheduler bit.
                    self.upd = 0x9
                elif self.purpose == "LIF_QUEUE_PURPOSE_TX":
                    # Ring the doorbell, set PI=index and the scheduler bit.
                    self.upd = 0x9
                else:
                    self.upd = 0x0
            self.doorbell = doorbell.Doorbell()
            self.doorbell.Init(self, self.spec)
        elif spec.id in rdma_queue_type_ids:
            self.obj_helper_q = rdma_queue.RdmaQueueObjectHelper()
        elif spec.id in nvme_queue_type_ids:
            logger.info("nvme queue type %s" %(self.id))
            self.obj_helper_q = nvme_queue.NvmeQueueObjectHelper()
        else:
            self.need_type_specific_configure = False
            return

        self.obj_helper_q.Generate(self, spec)
        if len(self.obj_helper_q.queues) > 0:
            self.queues.SetAll(self.obj_helper_q.queues)

        self.Show()
Exemple #7
0
def __mapping_entry_handler(vnic, ep_ip_prefixes):
    """
    Generate/Destroy the lmap and rmap entries associated with vnic
    based on input EP IP entries.

    """
    api.Logger.info(
        f"Fixing local and remote mapping for {vnic}, ip prefixes {ep_ip_prefixes} "
    )
    ep_ips = set()
    for prefix in ep_ip_prefixes:
        ep_ips.add(__ip_from_prefix(prefix))
    api.Logger.info(f"IP address set: {ep_ips}")

    # Delete lmap entries
    for lmap in vnic.Children.copy():
        api.Logger.info(f"Handling lmap {lmap} {lmap.IP}")
        if lmap.IP in ep_ips:
            ep_ips.remove(lmap.IP)
        else:
            lmap.Delete()
            lmap.Destroy()
            # Delete rmap entries on other nodes
            for node in api.GetNaplesHostnames():
                if node != vnic.Node:
                    node_subnet = subnet_client.GetSubnetObject(
                        node, vnic.SUBNET.SubnetId)
                    rmap = node_subnet.GetRemoteMappingObjectByIp(lmap.IP)
                    assert (rmap)
                    rmap.Delete()
                    rmap.Destroy()

    # Add new lmap entries
    for ep_ip in ep_ips:
        lmap_spec = dict()
        lmap_spec['origin'] = 'discovered'
        lmap_spec['lipaddr'] = ep_ip
        vnic_spec = parser.Dict2Object({'lmap': [lmap_spec]})
        lmap_client.GenerateObjects(vnic.Node, vnic, vnic_spec)

        # Add rmap entries on other nodes
        for node in api.GetNaplesHostnames():
            if node != vnic.Node:
                mac = "macaddr/%s" % vnic.MACAddr.get()
                rmap_spec = dict()
                rmap_spec['rmacaddr'] = objects.TemplateFieldObject(mac)
                rmap_spec['ripaddr'] = ep_ip
                ipversion = utils.IP_VERSION_6 if lmap.AddrFamily == 'IPV6' else utils.IP_VERSION_4
                node_subnet = subnet_client.GetSubnetObject(
                    node, vnic.SUBNET.SubnetId)
                rmap_client.GenerateObj(node, node_subnet, rmap_spec,
                                        ipversion)
Exemple #8
0
def MoveEpMACEntry(workload, target_subnet, ep_mac_addr, ep_ip_prefixes):
    """
    Moves workload to target subnet.

    """
    vnic = workload.vnic
    old_subnet = vnic.SUBNET

    # Update vnic information from target subnet
    vnic_client.ChangeMacAddr(
        vnic, objects.TemplateFieldObject(f"macaddr/{ep_mac_addr}"))

    # Move vnic to target subnet
    vnic_client.ChangeSubnet(vnic, target_subnet)

    # Move around mapping entries
    __mapping_entry_handler(vnic, ep_ip_prefixes)

    # Delete the workload.
    wl_api.DeleteWorkload(workload)

    # Update workload object with new information
    workload.node_name = target_subnet.Node
    workload.ip_prefix = ep_ip_prefixes[0]
    workload.ip_address = __ip_from_prefix(ep_ip_prefixes[0])
    workload.sec_ip_prefixes = ep_ip_prefixes[1:]
    workload.sec_ip_addresses = [
        __ip_from_prefix(prefix) for prefix in ep_ip_prefixes[1:]
    ]
    if api.GlobalOptions.dryrun:
        workload.parent_interface = 'dryrun'
    else:
        workload.parent_interface = intf_client.FindHostInterface(
            target_subnet.Node, target_subnet.HostIfIdx[0]).GetInterfaceName()
    workload.interface = workload.parent_interface
    workload.mac_address = vnic.MACAddr.get()
    workload.vlan = vnic.VlanId()

    # Set workload in running state, otherwise command trigger on workload will fail.
    store.SetWorkloadRunning(workload.workload_name)

    # Re add workload
    wl_api.ReAddWorkload(workload)

    # Add routes
    __add_routes(workload)

    # Send Grat ARP
    arp.SendGratArp([workload])

    return api.types.status.SUCCESS
Exemple #9
0
 def __process_list(self, elem_list):
     fobj = []
     for elem in elem_list:
         if isinstance(elem, objects.FrameworkObject):
             elemobj = self.__process_yml_obj(elem)
         elif isinstance(elem, list):
             logger.verbose("Processing LIST %s" % elem)
             elemobj = self.__process_list(elem)
         elif utils.IsTemplateField(elem):
             logger.verbose("Processing TEMPLATE FIELD %s" % elem)
             elemobj = objects.TemplateFieldObject(elem)
         else:
             elemobj = elem
         fobj.append(elemobj)
     return fobj
Exemple #10
0
def __generate_rmappings_from_lmappings():
    nodes = api.GetNaplesHostnames()
    lmapClient = config_api.GetObjClient('lmapping')
    rmapClient = config_api.GetObjClient('rmapping')
    rmapSpec = dict()
    for targetNode in nodes:
        isOverlayRoutingEnabled = EzAccessStoreClient[targetNode].IsDeviceOverlayRoutingEnabled()
        if isOverlayRoutingEnabled:
            rmapSpec['origin'] = 'discovered'
        else:
            rmapSpec['origin'] = 'fixed'
        if rmapClient.GetNumObjects(targetNode) != 0:
            # Skip since Remote mapping configs are already generated from cfgspec
            api.Logger.verbose(f"Skipping Remote mapping generation "
                               f"since they already exist")
            continue
        for srcNode in nodes:
            num = 0
            if targetNode == srcNode:
                continue
            lmappings = lmapClient.Objects(srcNode)
            for lmap in lmappings:
                if lmap.VNIC.IsIgwVnic():
                    api.Logger.verbose(f"Skipping Remote mapping generation "
                                       f"for IgwVnic's lmapping {lmap.GID()}")
                    continue
                mac = "macaddr/%s" %lmap.VNIC.MACAddr.get()
                rmapSpec['rmacaddr'] = objects.TemplateFieldObject(mac)
                rmapSpec['ripaddr'] = lmap.IP
                if lmap.AddrFamily == 'IPV6':
                    ipversion = utils.IP_VERSION_6
                else:
                    ipversion = utils.IP_VERSION_4
                parent = config_api.GetObjClient('subnet').GetSubnetObject(targetNode, lmap.VNIC.SUBNET.SubnetId)
                rmapClient.GenerateObj(targetNode, parent, rmapSpec, ipversion)
                num += 1
            api.Logger.info(f"Generated {num} RMAPPING Objects in {targetNode}")
        # Create the generated objects if their origin is fixed.
        if not isOverlayRoutingEnabled:
            if not rmapClient.CreateObjects(targetNode):
                api.Logger.error(f"Failed to create remote mappings on "
                                 f"{targetNode}, Aborting!!!")
                return False
            if not rmapClient.ReadObjects(targetNode):
                api.Logger.error(f"Failed to read remote mappings on "
                                 f"{targetNode}, Aborting!!!")
                return False
    return True
Exemple #11
0
def __get_mff(tc, prefix, default):
    lkplabel = __get_lookup_label(tc, prefix)
    if lkplabel in MFFS:
        val = MFFS[lkplabel]
    else:
        val = default

    if type(val) is not str:
        return val

    if objects.IsTemplateFieldString(val):
        obj = objects.TemplateFieldObject(val)
        if objects.IsReference(obj):
            return obj.Get(tc)
        else:
            assert (0)
    return val
Exemple #12
0
 def __process_yml_obj(self, yobj):
     obj = objects.FrameworkTemplateObject()
     for fname, fval in yobj.__dict__.items():
         if isinstance(fval, list):
             logger.verbose("Processing LIST %s" % fname)
             fobj = self.__process_list(fval)
         elif isinstance(fval, objects.FrameworkObject):
             logger.verbose("Processing OBJECT %s" % fname)
             fobj = self.__process_yml_obj(fval)
         elif utils.IsTemplateField(fval):
             logger.verbose("Processing TEMPLATE FIELD %s = %s" %
                            (fname, fval))
             fobj = objects.TemplateFieldObject(fval)
         else:
             logger.verbose("Processing basic FIELD %s =" % fname, fval)
             fobj = fval
         obj.__dict__[fname] = fobj
     return obj
Exemple #13
0
    def Init(self, lif, spec):
        self.GID(spec.id)
        self.lif = lif
        self.spec = spec
        self.id = spec.id
        self.type = spec.type
        self.purpose = spec.purpose.upper()
        self.size = spec.size
        self.count = spec.count
        self.entries = None

        self.queueid_allocator = objects.TemplateFieldObject("range/0/16384")

        self.queues = objects.ObjectDatabase()
        self.need_type_specific_configure = True
        if spec.id in eth_queue_type_ids:
            self.obj_helper_q = eth_queue.EthQueueObjectHelper()
            if self.purpose == "LIF_QUEUE_PURPOSE_RX":
                # Ring the doorbell, set PI=index and the scheduler bit.
                self.upd = 0x9
            elif self.purpose == "LIF_QUEUE_PURPOSE_TX":
                # Ring the doorbell, set PI=index and the scheduler bit.
                self.upd = 0x9
            else:
                self.upd = 0x0
            self.doorbell = doorbell.Doorbell()
            self.doorbell.Init(self, self.spec)
        else:
            self.need_type_specific_configure = False
            return

        self.obj_helper_q.Generate(self, spec)
        if len(self.obj_helper_q.queues) > 0:
            self.queues.SetAll(self.obj_helper_q.queues)

        self.Show()
Exemple #14
0
    def __generate_host_interfaces_dol(self, node, ifspec):
        if not ifspec:
            return
        spec = InterfaceSpec_()
        spec.ifadminstatus = 'UP'
        spec.lifspec = ifspec.lif.Get(EzAccessStoreClient[node])
        spec.txpolicer = False
        for obj in ResmgrClient[node].HostIfs.values():
            spec = utils.CopySpec(spec, ifspec)
            spec.ifname = obj.IfName
            spec.lifinfo = obj
            lifstart = obj.LifBase
            lifend = lifstart + obj.LifCount - 1
            spec.lifns = objects.TemplateFieldObject("range/%d/%d" %
                                                     (lifstart, lifend))

            spec = utils.CopySpec(spec, ifspec)
            hostif_obj = HostInterfaceObject(node, spec)
            self.__hostifs[node].update({hostif_obj.InterfaceId: hostif_obj})

        if self.__hostifs[node]:
            self.__hostifs_iter[node] = utils.rrobiniter(
                self.__hostifs[node].values())
        return
Exemple #15
0
def CreateIpv6AddrPool(subnet):
    allocator = objects.TemplateFieldObject("ipv6step/" + subnet + "/::1")
    # Dont use the Subnet/128 address
    allocator.get()
    return allocator
Exemple #16
0
    def Init(self, tenant, spec, namespace=None):
        if namespace:
            self.id = namespace.get()
        else:
            self.id = resmgr.LifIdAllocator.get()
        self.GID("Lif%d" % self.id)
        self.status = haldefs.interface.IF_STATUS_UP
        self.hw_lif_id = -1
        self.qstate_base = {}
        self.promiscuous = False
        self.allmulticast = False
        self.pds = []

        self.c_lib_name = getattr(spec, 'c_lib', None)
        if self.c_lib_name:
            self.c_lib = clibs.LoadCLib(self.c_lib_name)
            if self.c_lib:
                self.c_lib_config = self.c_lib[self.c_lib_name + '_config']
                self.c_lib_config.argtypes = [ctypes.POINTER(QInfoStruct)]
                self.c_lib_config.restype = None
        else:
            self.c_lib = None

        if hasattr(spec, 'rdma') and spec.rdma.enable:
            self.enable_rdma = spec.rdma.enable
            self.rdma_max_pt_entries = spec.rdma.max_pt_entries
            self.rdma_max_keys = spec.rdma.max_keys
            self.rdma_max_ahs = spec.rdma.max_ahs
            self.hostmem_pg_size = spec.rdma.hostmem_pg_size
            self.hbm_barmap_entries = (int(spec.rdma.hbm_barmap_size /
                                           spec.rdma.hostmem_pg_size))
            self.rdma_tbl_pos = BitArray(length=self.rdma_max_pt_entries)
            self.hbm_tbl_pos = BitArray(length=self.hbm_barmap_entries)
            self.rdma_async_eq_id = 0
            self.rdma_admin_aq_id = 1
            self.rdma_admin_cq_id = 0
        else:
            self.enable_rdma = False
            self.rdma_max_pt_entries = 0
            self.rdma_max_keys = 0
            self.rdma_max_ahs = 0
            self.hbm_barmap_entries = 0
            self.hostmem_pg_size = 0
        self.rdma_pt_base_addr = 0
        self.rdma_kt_base_addr = 0
        self.rdma_dcqcn_profile_base_addr = 0
        self.rdma_at_base_addr = 0

        if hasattr(spec, 'nvme') and spec.nvme.enable:
            self.enable_nvme = spec.nvme.enable
            self.nvme_lif = nvme_lif.NvmeLifObject(self, spec.nvme)
        else:
            self.enable_nvme = False

        self.vlan_strip_en = False
        self.vlan_insert_en = False

        self.queue_types = objects.ObjectDatabase()
        self.obj_helper_q = queue_type.QueueTypeObjectHelper()
        self.obj_helper_q.Generate(self, spec)
        self.queue_types.SetAll(self.obj_helper_q.queue_types)
        self.queue_types_list = self.obj_helper_q.queue_types
        self.queue_list = []
        for q_type in self.queue_types_list:
            for queue in q_type.queues.GetAll():
                self.queue_list.append(queue)

        # RDMA per LIF allocators
        if self.enable_rdma:
            # QP 0, 1 are special QPs
            self.qpid_allocator = objects.TemplateFieldObject(
                "range/2/" + str(spec.rdma.max_qp))
            # AQ ID 0 is owned by ETH
            self.aqid_allocator = objects.TemplateFieldObject(
                "range/1/" + str(spec.rdma.max_aq))
            # Reserve CQ 0, 1 for special QPs, AQ
            self.cqid_allocator = objects.TemplateFieldObject(
                "range/2/" + str(spec.rdma.max_cq))
            self.eqid_allocator = objects.TemplateFieldObject(
                "range/0/" + str(spec.rdma.max_eq))
            self.pd_allocator = objects.TemplateFieldObject(
                "range/0/" + str(spec.rdma.max_pd))
            self.mr_key_allocator = objects.TemplateFieldObject(
                "range/1/" + str(spec.rdma.max_mr))
            self.slab_allocator = objects.TemplateFieldObject("range/0/2048")
            self.kslab_allocator = objects.TemplateFieldObject("range/0/2048")

            # Generate RDMA LIF owned resources
            self.slabs = objects.ObjectDatabase()

            # Generate KernelSlab of 4KB and 10 MB for FRPMR
            self.kslab_4KB = slab.SlabObject(self, 4096, True)

            self.obj_helper_slab = slab.SlabObjectHelper()
            #slab_spec = spec.rdma.slab.Get(Store)
            #self.obj_helper_slab.Generate(self, slab_spec)
            #self.slabs.SetAll(self.obj_helper_slab.slabs)

            # Create EQs for RDMA LIF
            self.eqs = objects.ObjectDatabase()
            self.obj_helper_eq = eq.EqObjectHelper()
            self.obj_helper_eq.Generate(self, spec.rdma.max_eq,
                                        spec.rdma.max_eqe)
            if len(self.obj_helper_eq.eqs):
                self.eqs.SetAll(self.obj_helper_eq.eqs)

            # Create CQ 0 for adminQ
            logger.info("Creating 1 Cqs. for LIF:%s" % (self.GID()))
            # Hardcode CQ 0 for AQ
            # Page size is calculated as max_cqe * cqe_size by the CQ for privileged resources
            cq_id = 0
            self.cq = cqs.CqObject(None, cq_id, spec.rdma.max_cqe, 0, True,
                                   self)

            # Create AdminQ
            logger.info("Creating 1 Aqs. for LIF:%s" % (self.GID()))
            aq_id = self.GetAqid()
            self.aq = aqs.AqObject(self, aq_id, spec.rdma.max_aqe,
                                   spec.rdma.hostmem_pg_size)

            self.dcqcn_config_spec = spec.rdma.dcqcn_config.Get(Store)

        if hasattr(spec, 'rss'):
            self.rss_type = (
                haldefs.interface.LifRssType.Value("RSS_TYPE_IPV4")
                | haldefs.interface.LifRssType.Value("RSS_TYPE_IPV4_TCP")
                | haldefs.interface.LifRssType.Value("RSS_TYPE_IPV4_UDP")
                | haldefs.interface.LifRssType.Value("RSS_TYPE_IPV6")
                | haldefs.interface.LifRssType.Value("RSS_TYPE_IPV6_TCP")
                | haldefs.interface.LifRssType.Value("RSS_TYPE_IPV6_UDP"))
            self.rss_key = array.array('B', toeplitz.toeplitz_msft_key)
            self.rss_indir = array.array('B', [0] * 128)
        else:
            self.rss_type = haldefs.interface.LifRssType.Value("RSS_TYPE_NONE")
            self.rss_key = array.array('B', toeplitz.toeplitz_msft_key)
            self.rss_indir = array.array('B', [0] * 128)

        self.tenant = tenant
        self.spec = spec

        self.tx_qos_class = None
        self.rx_qos_class = None
        if self.tenant.IsQosEnabled():
            self.tx_qos_class = getattr(spec, 'tx_qos_class', None)
            self.rx_qos_class = getattr(spec, 'rx_qos_class', None)
            if self.tx_qos_class:
                self.tx_qos_class = Store.objects.Get(self.tx_qos_class)
            if self.rx_qos_class:
                self.rx_qos_class = Store.objects.Get(self.rx_qos_class)

        self.Show()
Exemple #17
0
#! /usr/bin/python3

from infra.common.glopts import GlobalOptions

import infra.common.objects as objects

HostMemoryAllocator     = None

FlowIdAllocator         = objects.TemplateFieldObject("range/1/65535")
GftFlowIdAllocator         = objects.TemplateFieldObject("range/1/65535")
L4LbServiceIdAllocator  = objects.TemplateFieldObject("range/1/4096")
L4LbBackendIdAllocator  = objects.TemplateFieldObject("range/1/16384")
InterfaceIdAllocator    = objects.TemplateFieldObject("range/128/32768")
LifIdAllocator          = objects.TemplateFieldObject("range/1025/2047")
QueueIdAllocator        = objects.TemplateFieldObject("range/0/16384")
TenIdAllocator          = objects.TemplateFieldObject("range/11/1000")
SegIdAllocator          = objects.TemplateFieldObject("range/1/8192")
OifListIdAllocator      = objects.TemplateFieldObject("range/1/65535")
RdmaOifListIdAllocator  = objects.TemplateFieldObject("range/1/65535")
MulticastGroupIdAllocator   = objects.TemplateFieldObject("range/1/65535")

SegVlanAllocator            = objects.TemplateFieldObject("range/2/1000")
SegProviderVlanAllocator    = objects.TemplateFieldObject("range/1001/2000")
EncapVlanAllocator          = objects.TemplateFieldObject("range/3001/4000")
SegVxlanAllocator           = objects.TemplateFieldObject("range/0xFF0000/0xFFFFFF")

BlackHoleSegVlanAllocator   = objects.TemplateFieldObject("range/4090/4095")
BlackHoleSegVxlanAllocator  = objects.TemplateFieldObject("range/0xDDDDD0/0xDDDDDF")

AclIdAllocator          = objects.TemplateFieldObject("range/100/512")
QosClassIdAllocator     = objects.TemplateFieldObject("range/1/16")
Exemple #18
0
class Constraints(Enum):
    Assignment = 1
    Equality = 2


def proto_eval(expr):
    expr = expr.split('.')
    module = importlib.import_module(expr[0])
    ret = module
    for val in expr[1:]:
        ret = getattr(ret, val)
    return ret


IpSubnetAllocator = objects.TemplateFieldObject("ipstep/64.0.0.0/0.1.0.0")
Ipv6SubnetAllocator = objects.TemplateFieldObject(
    "ipv6step/2000::0:0/0::1:0:0")
KeyIdAllocator = objects.TemplateFieldObject("range/1/65535")


class GrpcReqRspMsg:
    def __init__(self, message):
        self._message_type = type(message)

    @staticmethod
    def split_repeated_messages(message):
        requests = getattr(message, 'request')
        messages = []
        for request in requests:
            sub_message = type(message)()
Exemple #19
0
def CreateIpv4AddrPool(subnet):
    allocator = objects.TemplateFieldObject("ipstep/" + subnet + "/0.0.0.1")
    # Dont use the Subnet/32 address
    allocator.get()
    return allocator
Exemple #20
0
class Resmgr(base.ConfigObjectBase):
    #TODO: read from PDS header files / naples mem & init
    MAX_OPER = 1
    MAX_UPGRADE = 1
    MAX_DEVICE = 1
    MAX_INTERFACE = 4
    MAX_TUNNEL = 2048 if utils.IsPipelineApulu() else 1023
    MAX_NEXTHOP = 4095
    MAX_NEXTHOPGROUP = 2048
    MAX_LMAPPING = 131072
    MAX_RMAPPING = 2097152
    MAX_VPC = 64
    MAX_VNIC = 128 if utils.IsPipelineArtemis() or utils.IsPipelineApulu(
    ) else 64
    MAX_HOST_INTERFACES = 8 if utils.IsPipelineApulu() else 2
    # Apulu supports 8 lif for now and therefore cfg cannot have more than 8 subnets
    MAX_SUBNET = MAX_HOST_INTERFACES if utils.IsPipelineApulu() else 64
    MAX_RULES_PER_V4_POLICY = 1023
    MAX_RULES_PER_V6_POLICY = 15
    if utils.IsPipelineArtemis():
        MAX_POLICY = 1023
        MAX_ROUTE_TABLE = 128
        MAX_ROUTES_PER_ROUTE_TBL = 63
    elif utils.IsPipelineApulu():
        # TODO: init based on mem
        # 32 vnics, 32 subnets, 5 policies per vnic per direction, 1 policy per subnet per direction
        # ((32 * 5) * 2) + ((32 * 1) * 2) = 384
        MAX_POLICY = 384  # 384 (8G) and 32 (4G)
        MAX_RULES_PER_V4_POLICY = 256
        MAX_ROUTE_TABLE = 1024  # 1024 (8G) and 8 (4G)
        MAX_ROUTES_PER_ROUTE_TBL = 16383  # 1023 (8G) and 16383 (4G)
    else:
        MAX_POLICY = 1023
        MAX_ROUTE_TABLE = 1024
        MAX_ROUTES_PER_ROUTE_TBL = 1023
    MAX_POLICY_PER_VNIC = 2
    MAX_POLICER_PER_DIRECTION = 1024
    MAX_SECURITY_PROFILE = 1
    MAX_MIRROR = 8
    MAX_TAG = 1
    MAX_METER = 64
    MAX_UNDERLAY_NHS = 2
    MAX_OVERLAY_NHS = 8
    MAX_DHCP_RELAY = 16
    MAX_DHCP_PROXY = 16
    MAX_NAT_PB = 1024
    MAX_BGP_SESSIONS = 5
    MAX_BGP_PEER_AF_SESSIONS = 5
    MAX_BGP_PEERS = 10
    MAX_BGP_EVPN_EVI = 50
    MAX_BGP_EVPN_EVI_RT = 50
    MAX_BGP_EVPN_IP_VRF = 50
    MAX_BGP_EVPN_IP_VRF_RT = 50
    MAX_IPSEC_SA = 1024

    NICMGR_HOST_LIF_BASE = 72
    NICMGR_HOST_LIF_COUNT = 1

    # Starts VPC prefixes from 10/8 to 42/8
    VPC_V4_PREFIX_BASE = 10
    # Create overlapping prefixes for every 32 VPCs
    VPC_V4_PREFIX_OVERLAP_DIST = 32
    # Starts VPC prefixes from aaaa:0001:0010/48 to aaaa:0001:00042/48
    VPC_V6_BASE = 'aaaa:0001'
    VPC_V6_PREFIX_BASE = 10
    # Create overlapping prefixes for every 32 VPCs
    VPC_V6_PREFIX_OVERLAP_DIST = 128

    InvalidMplsSlotIdAllocator = iter(irange(50001, 90000))
    InvalidVxlanIdAllocator = iter(irange(10001, 12000))
    # This will be used to avoid overlap between topology and resource manager id allocation
    # used only for Tunnel, Nexthop and Interface objects
    BaseDuplicateIdAllocator = 100000

    # TCP/UDP ports for flow and service mapping. Right now keeping it in resmgr.
    TransportSrcPort = 100  # For VNET packets
    TransportDstPort = 200  # For VNET packets
    TransportSvcPort = 400  # For VIP, Underlay tcp/udp port
    TransportSrcLBPort = 101  # Local backend service port, 101 mapped to 400

    # Subnet address pools for multi node topology where same subnet exists on many nodes
    SubnetIPv4AddrPool = dict()
    SubnetIPv6AddrPool = dict()
    SubnetVRIPv4 = dict()
    SubnetVRIPv6 = dict()

    LocalMappingIdAllocator = iter(irange(1, 128 * 1024))
    RemoteMappingIdAllocator = iter(irange(1, 16 * 1024 * 1024))

    LocalMappingV4TagIdAllocator = iter(irange(1, 2 * 1024 * 1024))
    LocalMappingV6TagIdAllocator = iter(irange(1, 2 * 1024 * 1024))
    RemoteMappingV4TagIdAllocator = iter(irange(1, 2 * 1024 * 1024))
    RemoteMappingV6TagIdAllocator = iter(irange(1, 2 * 1024 * 1024))

    VnicMacAllocator = objects.TemplateFieldObject(
        "macstep/00DD.0000.0001/0000.0000.0001")

    def __init__(self, node):
        super().__init__()
        self.Node = node
        self.EpochAllocator = iter(irange(1, 4096))
        # tunnel id=1 is mytep
        self.TunnelIdAllocator = iter(irange(2, 4096))
        self.VpcIdAllocator = iter(irange(1, 1024))
        self.SubnetIdAllocator = iter(irange(1, 1024))
        self.FlowIdAllocator = iter(irange(1, 1 * 1024 * 1024))
        self.VnicVlanIdAllocator = iter(irange(1, 1024))
        self.VnicMplsSlotIdAllocator = iter(irange(10000, 11024))
        self.VnicIdAllocator = iter(irange(1, 1024))
        self.InterfaceIdAllocator = iter(irange(1, 66))
        self.V4RouteTableIdAllocator = iter(irange(1, 1024))
        self.V6RouteTableIdAllocator = iter(irange(10001, 11024))
        self.RouteIdAllocator = iter(irange(1, 1024 * 1023))
        self.V4SecurityPolicyIdAllocator = iter(irange(1, 2048))
        self.V6SecurityPolicyIdAllocator = iter(irange(10001, 12048))
        self.RuleIdAllocator = iter(irange(1, 1023 * 1023))
        self.SecurityPolicyIdAllocator = iter(irange(1, 4 * 1024 * 1024))
        self.VirtualRouterMacAllocator = objects.TemplateFieldObject(
            "macstep/00CC.0000.0001/0000.0000.0001")
        self.RemoteMappingMacAllocator = objects.TemplateFieldObject(
            "macstep/00EE.0000.0001/0000.0000.0001")
        self.TepIpAddressAllocator = ipaddress.IPv4Network(
            '172.16.0.0/16').hosts()
        self.TepIpv6AddressAllocator = ipaddress.IPv6Network(
            'ffff::100:0/104').hosts()
        self.IGWMplsSlotIdAllocator = iter(irange(30001, 31024))
        self.RemoteInternetNonNatTunAllocator = None
        self.RemoteInternetNatTunAllocator = None
        self.RemoteMplsVnicTunAllocator = None
        self.PublicIpAddressAllocator = ipaddress.IPv4Network(
            '200.0.0.0/16').hosts()
        self.PublicIpv6AddressAllocator = ipaddress.IPv6Network(
            'eeee:0:0:0::/64').hosts()
        self.IGWVxlanIdAllocator = iter(irange(50001, 51024))
        self.VxlanIdAllocator = iter(irange(80001, 81024))
        self.MirrorSessionIdAllocator = iter(irange(1, 8))
        self.PortIdAllocator = iter(irange(1, 4))
        self.DhcpIdAllocator = iter(irange(1, 32))
        self.NatPoolIdAllocator = iter(irange(1, 1000))
        self.PolicerIdAllocator = iter(irange(1, 2048))
        self.EvpnEviIdAllocator = iter(irange(1, 50))
        self.EvpnEviRtIdAllocator = iter(irange(1, 50))
        self.EvpnIpVrfIdAllocator = iter(irange(1, 50))
        self.EvpnIpVrfRtIdAllocator = iter(irange(1, 50))
        self.IpsecTunAllocator = None
        self.IpsecTunnelModeTunAllocator = None
        self.IpsecTransportModeTunAllocator = None
        self.IpsecEncryptSAIdAllocator = iter(irange(1, 1000))
        self.IpsecDecryptSAIdAllocator = iter(irange(1, 1000))
        self.IpsecTunnelAddressAllocator = ipaddress.IPv4Network(
            '205.10.0.0/16').hosts()

        # ---------------------------------------------------------------------------------
        # Artemis specific configs
        # Nexthop IP allocator. Curently unique IP (globally)
        # TODO : Can have same IP across VPCs.
        self.NexthopIdAllocator = iter(irange(1, 1 * 1024 * 1024))
        self.NexthopIpV4AddressAllocator = ipaddress.IPv4Network(
            '210.0.0.0/16').hosts()
        self.NexthopIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:eeee:0:0::/64').hosts()
        self.NexthopMacAllocator = objects.TemplateFieldObject(
            "macstep/0055.0000.0001/0000.0000.0001")
        self.NexthopGroupIdAllocator = iter(irange(1, 1 * 1024))
        self.V4TagIdAllocator = iter(irange(1, 1))
        self.V6TagIdAllocator = iter(irange(2, 2))
        self.NexthopVxlanIdAllocator = iter(irange(90001, 91024))
        self.V4MeterIdAllocator = iter(irange(1, 64))
        self.V6MeterIdAllocator = iter(irange(65, 129))
        # Currently one to one mapping with CA-IP. TODO. Many to one
        self.SvcMappingPublicIpV4AddressAllocator = ipaddress.IPv4Network(
            '150.0.0.0/16').hosts()
        self.SvcMappingPublicIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:dddd:dddd:0::/64').hosts()
        self.NexthopVlanIdAllocator = iter(irange(4001, 5124))
        # Provider IP for local and remote. One to One mapping now. Many to one can be done later
        self.ProviderIpV4Network = '220.0.0.0/8'
        self.ProviderIpV6Network = 'eeee:eeee:eee0:0::/64'
        self.ProviderIpV4Network = ipaddress.IPv4Network(
            self.ProviderIpV4Network)
        self.ProviderIpV6Network = ipaddress.IPv6Network(
            self.ProviderIpV6Network)
        self.ProviderIpV4AddressAllocator = ipaddress.IPv4Network(
            self.ProviderIpV4Network).hosts()
        self.ProviderIpV6AddressAllocator = ipaddress.IPv6Network(
            self.ProviderIpV6Network).hosts()
        self.VpcVxlanIdAllocator = iter(irange(50000, 51024))
        self.Nat46Address = ipaddress.IPv6Network('aaaa:aaaa:0:0::/64')
        self.TepMacAllocator = objects.TemplateFieldObject(
            "macstep/0065.0000.0001/0000.0000.0001")
        # Public IP adddress in the underlay VC
        self.SvcMappingPublicIpV4AddressAllocator = ipaddress.IPv4Network(
            '150.0.0.0/16').hosts()
        self.SvcMappingPublicIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:dddd:dddd:0::/64').hosts()
        # -------------------------------------------------------------------
        self.SvcTunAllocator = None
        self.RemoteSvcTunAllocator = None
        self.UnderlayTunAllocator = None
        self.UnderlayECMPTunAllocator = None
        self.OverlayNhGroupAllocator = None
        self.RemoteSvcTunIPv4Addr = ipaddress.IPv4Network(
            '30.0.0.0/24').hosts()

        #Apulu specific configs
        self.UnderlayNHAllocator = None
        self.OverlayNHAllocator = None
        self.DualEcmpNhAllocator = None
        self.UnderlayNhGroupAllocator = None
        self.DualEcmpNhGroupAllocator = None
        self.DhcpRelayAllocator = None
        self.IpsecEncryptSAAllocator = None
        self.IpsecDecryptSAAllocator = None
        self.DeviceMacAllocator = objects.TemplateFieldObject(
            "macstep/0002.0100.0000/0000.0000.0001")
        self.NumVnicPolicyAllocator = utils.rrobiniter(
            range(Resmgr.MAX_POLICY_PER_VNIC + 1))
        self.UnderlayNumNexthopsAllocator = utils.rrobiniter(
            range(1, Resmgr.MAX_UNDERLAY_NHS + 1))
        self.OverlayNumNexthopsAllocator = utils.rrobiniter(
            range(1, Resmgr.MAX_OVERLAY_NHS + 1))

        self.L3InterfaceIPv4PfxPool = iter(
            ipaddress.IPv4Network('40.40.0.0/16').subnets(new_prefix=24))

        # Host interface configs
        self.HostMemoryAllocator = None
        self.HostIfs = dict()
        # Host interface index allocator for IOTA.
        # Ifindices 72 and 73 (0x48, 0x49) are reserved, so we have a non-contiuous list
        #TODO: Fix it properly later
        HostIfIdxList = [
            0x80000047, 0x8000004A, 0x8000004B, 0x8000004C, 0x8000004D,
            0x8000004E, 0x8000004F, 0x80000050
        ]

        self.HostIfIdxAllocator = iter(HostIfIdxList)
        self.LoopbackIfIdAllocator = iter(irange(1, 16))

        # Metaswitch
        self.BgpIdAllocator = iter(irange(1, 10))
        self.BgpPeerIdAllocator = iter(irange(1, 10))
        self.BgpPeerAfIdAllocator = iter(irange(1, 10))

        return

    def Show(self):
        return

    def ReadHostInterfaceInfo(self):
        if utils.IsDryRun(): return
        # reads nicmgr.log and get interface info
        nicmgrlog = utils.GetNicmgrLogPath()
        f = open(nicmgrlog, "r")
        for ifobj in self.HostIfs.values():
            # get lifbase and count
            pattern = ' %s: lif_base (\w+) lif_count (\w+)' % (ifobj.IfName)
            for line in f:
                match = re.search(pattern, line)
                if match is None:
                    continue
                lifbase = int(match.groups()[0])
                lifcount = int(match.groups()[1])
                ifobj.SetLifBase(lifbase)
                ifobj.SetLifCount(lifcount)
                break

            # get devcmd addr
            pattern = ' %s: regs_mem_addr (\w+) devcmd_mem_addr (\w+)' % (
                ifobj.IfName)
            for line in f:
                match = re.search(pattern, line)
                if match is None:
                    continue
                devcmdaddr = int(match.groups()[1], base=16)
                ifobj.SetDevCmdAddr(devcmdaddr)
                break

            # get qstate addr for all lifs under this device
            for i in range(lifcount):
                lif_id = lifbase + i
                pattern = ' lif-%d: qtype: (\d{1}), qstate_base: (\w+)' % (
                    lif_id)
                for line in f:
                    match = re.search(pattern, line)
                    if match is None:
                        continue
                    q_type = int(match.groups()[0])
                    qstate_base = int(match.groups()[1], base=16)
                    qstateaddr_list = ifobj.Lif2QstateMap.get(lif_id, [])
                    qstateaddr_list.insert(q_type, qstate_base)
                    ifobj.Lif2QstateMap.update({lif_id: qstateaddr_list})
                    if (q_type == 7):
                        break
        f.close()
        return

    def InitializeHostMemMgr(self):
        if utils.IsDryRun(): return
        self.HostMemoryAllocator = objects.GetHostMemMgrObject()
        assert self.HostMemoryAllocator is not None

    def InitializeHostInterfaces(self):
        if not utils.IsDol(): return
        with open(utils.GetDeviceJsonPath(), 'r') as fp:
            obj = json.load(fp)
        lifbase = Resmgr.NICMGR_HOST_LIF_BASE
        lifcount = Resmgr.NICMGR_HOST_LIF_COUNT
        # read host interface info from device.json
        for ethdev in obj["eth_dev"]:
            if ethdev["type"] != 'host':
                continue
            ifname = ethdev["name"]
            intf = NicmgrInterface(ifname)
            intf.SetLifBase(lifbase)
            self.HostIfs.update({ifname: intf})
            lifbase += lifcount
        if utils.IsInterfaceSupported():
            self.InitializeHostMemMgr()
            self.ReadHostInterfaceInfo()

    def Initialize(self):
        self.InitializeHostInterfaces()

    def CreateInternetTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetIgwNonNatTunnels()
        if len(objs) != 0:
            self.RemoteInternetNonNatTunAllocator = utils.rrobiniter(objs)
        objs = EzAccessStoreClient[self.Node].GetIgwNatTunnels()
        if len(objs) != 0:
            self.RemoteInternetNatTunAllocator = utils.rrobiniter(objs)

    def CollectSvcTunnels(self):
        if utils.IsPipelineArtemis():
            objs = EzAccessStoreClient[self.Node].GetSvcTunnels()
            if len(objs) != 0:
                self.SvcTunAllocator = utils.rrobiniter(objs)
            objs = EzAccessStoreClient[self.Node].GetSvcTunnels(True)
            if len(objs) != 0:
                self.RemoteSvcTunAllocator = utils.rrobiniter(objs)

    def CreateVnicTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetWorkloadTunnels()
        if len(objs) != 0:
            self.RemoteMplsVnicTunAllocator = utils.rrobiniter(objs)

    def CreateUnderlayTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetUnderlayTunnels()
        if len(objs) != 0:
            self.UnderlayTunAllocator = utils.rrobiniter(objs)
        objs = EzAccessStoreClient[self.Node].GetUnderlayTunnels(ecmp=True)
        if len(objs) != 0:
            self.UnderlayECMPTunAllocator = utils.rrobiniter(objs)

    def CreateUnderlayNHAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetUnderlayNexthops()
        if len(objs) != 0:
            self.UnderlayNHAllocator = utils.rrobiniter(objs)

    def CreateOverlayNHAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetOverlayNexthops()
        if len(objs) != 0:
            self.OverlayNHAllocator = utils.rrobiniter(objs)

    def CreateDualEcmpNhAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetDualEcmpNexthops()
        if len(objs) != 0:
            self.DualEcmpNhAllocator = utils.rrobiniter(objs)

    def CreateUnderlayNhGroupAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetUnderlayNhGroups()
        if len(objs) != 0:
            self.UnderlayNhGroupAllocator = utils.rrobiniter(objs)

    def CreateOverlayNhGroupAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetOverlayNhGroups()
        if len(objs) != 0:
            self.OverlayNhGroupAllocator = utils.rrobiniter(objs)

    def CreateDualEcmpNhGroupAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetDualEcmpNhGroups()
        if len(objs) != 0:
            self.DualEcmpNhGroupAllocator = utils.rrobiniter(objs)

    def CreateDHCPRelayAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetDhcpRelayObjects()
        if len(objs) != 0:
            self.DhcpRelayAllocator = utils.rrobiniter(objs)

    def CreateDHCPProxyAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetDhcpProxyObjects()
        if len(objs) != 0:
            self.DhcpProxyAllocator = utils.rrobiniter(objs)

    def CreateIpsecTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetIpsecTunnels()
        if len(objs) != 0:
            self.IpsecTunAllocator = utils.rrobiniter(objs)

    def CreateIpsecTunnelModeTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetIpsecTunnelModeTunnels()
        if len(objs) != 0:
            self.IpsecTunnelModeTunAllocator = utils.rrobiniter(objs)

    def CreateIpsecTransportModeTunnels(self):
        objs = EzAccessStoreClient[self.Node].GetIpsecTransportModeTunnels()
        if len(objs) != 0:
            self.IpsecTransportModeTunAllocator = utils.rrobiniter(objs)

    def CreateIpsecEncryptSAAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetIpsecEncryptSAs()
        if len(objs) != 0:
            self.IpsecEncryptSAAllocator = utils.rrobiniter(objs)

    def CreateIpsecDecryptSAAllocator(self):
        objs = EzAccessStoreClient[self.Node].GetIpsecDecryptSAs()
        if len(objs) != 0:
            self.IpsecDecryptSAAllocator = utils.rrobiniter(objs)

    # Create subnets from base prefix
    # - base is a prefix in the form of '10.0.0.0/16'
    # - sublen is the subnet length, gt base prefix length.
    # - poolid , subnet pool index with in a vpc
    @staticmethod
    def CreateIPv4SubnetPool(base, sublen, poolid):
        assert (isinstance(base, ipaddress.IPv4Network))
        assert (sublen >= 10)
        assert (poolid < 16)
        addr = base.network_address + (poolid << (32 - 8))
        pfxstr = "%s/8" % (str(ipaddress.IPv4Address(addr)))
        base = ipaddress.IPv4Network(pfxstr)
        return iter(base.subnets(new_prefix=sublen))

    @staticmethod
    def CreateIPv6SubnetPool(base, sublen, poolid):
        assert (isinstance(base, ipaddress.IPv6Network))
        assert (sublen >= 64)
        assert (poolid < 16)
        addr = base.network_address + (poolid << (128 - 56))
        pfxstr = "%s/56" % (str(ipaddress.IPv6Address(addr)))
        base = ipaddress.IPv6Network(pfxstr)
        return iter(base.subnets(new_prefix=sublen))

    @staticmethod
    def CreateIpv4AddrPool(subnet):
        assert (isinstance(subnet, ipaddress.IPv4Network))
        return iter(subnet.hosts())

    @staticmethod
    def CreateIpv6AddrPool(subnet):
        assert (isinstance(subnet, ipaddress.IPv6Network))
        return iter(subnet.hosts())

    @staticmethod
    def CreateIPv4AddrPoolForSubnet(subnet_id, prefix):
        if subnet_id in Resmgr.SubnetIPv4AddrPool:
            return
        assert (isinstance(prefix, ipaddress.IPv4Network))
        Resmgr.SubnetIPv4AddrPool[subnet_id] = iter(prefix.hosts())
        # store first IP as VRIP
        Resmgr.SubnetVRIPv4[subnet_id] = next(
            Resmgr.SubnetIPv4AddrPool[subnet_id])
        return

    @staticmethod
    def CreateIPv6AddrPoolForSubnet(subnet_id, prefix):
        if subnet_id in Resmgr.SubnetIPv6AddrPool:
            return
        assert (isinstance(prefix, ipaddress.IPv6Network))
        Resmgr.SubnetIPv6AddrPool[subnet_id] = iter(prefix.hosts())
        # store first IP as VRIP
        Resmgr.SubnetVRIPv6[subnet_id] = next(
            Resmgr.SubnetIPv6AddrPool[subnet_id])
        return

    @staticmethod
    def GetIPv4AddrFromSubnetPool(subnet_id):
        if subnet_id in Resmgr.SubnetIPv4AddrPool:
            return next(Resmgr.SubnetIPv4AddrPool[subnet_id])
        else:
            return None

    @staticmethod
    def GetIPv6AddrFromSubnetPool(subnet_id):
        if subnet_id in Resmgr.SubnetIPv6AddrPool:
            return next(Resmgr.SubnetIPv6AddrPool[subnet_id])
        else:
            return None

    @staticmethod
    def GetSubnetVRIPv4(subnet_id):
        if subnet_id in Resmgr.SubnetVRIPv4:
            return Resmgr.SubnetVRIPv4[subnet_id]
        else:
            return None

    @staticmethod
    def GetSubnetVRIPv6(subnet_id):
        if subnet_id in Resmgr.SubnetVRIPv6:
            return Resmgr.SubnetVRIPv6[subnet_id]
        else:
            return None

    # The below function will be called for every Remote TEP
    @staticmethod
    def CreateRemoteVnicMplsSlotAllocator():
        mplsbase = 20000
        return iter(irange(mplsbase,
                           mplsbase + 1027))  # 1M Remote Mappings/1022 Teps

    # The below function will be called for every Remote TEP
    @staticmethod
    def CreateRemoteVnicVxlanIdAllocator():
        vxlanbase = 30000
        return iter(irange(vxlanbase,
                           vxlanbase + 1027))  # 1M Remote Mappings/1022 Teps

    @staticmethod
    def GetVpcIPv4Prefix(vpcid):
        pfxstr = '%d.0.0.0/8' % ((vpcid % Resmgr.VPC_V4_PREFIX_OVERLAP_DIST) +
                                 Resmgr.VPC_V4_PREFIX_BASE)
        return ipaddress.IPv4Network(pfxstr)

    @staticmethod
    def GetVpcIPv6Prefix(vpcid):
        pfxstr = '%s:%04x::/48' % (Resmgr.VPC_V6_BASE, (
            (vpcid % Resmgr.VPC_V6_PREFIX_OVERLAP_DIST) +
            Resmgr.VPC_V6_PREFIX_BASE))
        return ipaddress.IPv6Network(pfxstr)

    @staticmethod
    def GetVpcInternetNatPoolPfx(vpcid):
        pfxstr = '50.5.%d.0/24' % (vpcid)
        return ipaddress.IPv4Network(pfxstr)

    @staticmethod
    def GetVpcInfraNatPoolPfx(vpcid):
        pfxstr = '10.%d.199.0/24' % (vpcid)
        return ipaddress.IPv4Network(pfxstr)

    @staticmethod
    def GetNatPoolPortRange(proto):
        if proto == 'icmp':
            return 0, 0
        return 10000, 20000
Exemple #21
0
    def UpdateFromTCConfig(self, flow, sep, dep, segment, tenant):

        if self.ConfigFlowMiss():
            # Generate configs with locally generated values
            smac = resmgr.AclMacAllocator.get()
            dmac = resmgr.AclMacAllocator.get()
            etype = resmgr.AclEtypeAllocator.get()
            if flow.IsIPV4():
                sip = resmgr.AclIPv4Allocator.get()
                dip = resmgr.AclIPv4Allocator.get()
            elif flow.IsIPV6():
                sip = resmgr.AclIPv6Allocator.get()
                dip = resmgr.AclIPv6Allocator.get()
            sport = resmgr.AclL4PortAllocator.get()
            dport = resmgr.AclL4PortAllocator.get()
            icmpcode = resmgr.AclICMPTypeCodeAllocator.get()
            icmptype = resmgr.AclICMPTypeCodeAllocator.get()
        else:
            # Update the config with values from the flow
            if flow.IsMAC():
                smac = sep.macaddr
                dmac = dep.macaddr
                etype = flow.ethertype
            if flow.IsIP():
                sip = flow.sip
                dip = flow.dip
            if flow.IsTCP() or flow.IsUDP():
                sport = flow.sport
                dport = flow.dport
            if flow.IsICMP():
                icmpcode = flow.icmpcode
                icmptype = flow.icmptype

        if self.MatchOnSIF():
            self.fields.match.src_if = sep.intf

        if self.MatchOnDIF():
            self.fields.match.dst_if = dep.intf

        if self.MatchOnTenant():
            self.fields.match.tenant = tenant

        if self.MatchOnSegment():
            self.fields.match.segment = segment

        if self.MatchOnEtherType():
            self.fields.match.eth.ethertype = \
                    objects.TemplateFieldObject("const/%d" % etype)
        if self.MatchOnMacSA():
            self.fields.match.eth.src = smac
        if self.MatchOnMacDA():
            self.fields.match.eth.dst = dmac

        if self.MatchOnSIP():
            self.fields.match.ip.src_ip = sip
        if self.MatchOnDIP():
            self.fields.match.ip.dst_ip = dip
        if self.MatchOnTCPSport():
            self.fields.match.l4.tcp.src_port_range = \
                    objects.TemplateFieldObject("range/%d/%d" % (sport, sport))
        if self.MatchOnTCPDport():
            self.fields.match.l4.tcp.dst_port_range = \
                    objects.TemplateFieldObject("range/%d/%d" % (dport, dport))
        if self.MatchOnUDPSport():
            self.fields.match.l4.udp.src_port_range = \
                    objects.TemplateFieldObject("range/%d/%d" % (sport, sport))
        if self.MatchOnUDPDport():
            self.fields.match.l4.udp.dst_port_range = \
                    objects.TemplateFieldObject("range/%d/%d" % (dport, dport))
        if self.MatchOnICMPCode():
            self.fields.match.l4.icmp.code = \
                    objects.TemplateFieldObject("const/%d" % icmpcode)
        if self.MatchOnICMPType():
            self.fields.match.l4.icmp.type = \
                    objects.TemplateFieldObject("const/%d" % icmptype)

        if self.ActionSupRedirect():
            self.fields.action.redirect_if = Store.objects.Get('Cpu1')
        elif self.ActionTunnelRedirect():
            self.fields.action.redirect_if = \
                    (set(Store.GetTunnelsVxlan()) - set([dep.intf])).pop()
            self.fields.action.encap_id = 30
            self.fields.action.macsa = resmgr.AclMacAllocator.get()
            self.fields.action.macda = resmgr.AclMacAllocator.get()
        elif self.ActionUplinkRedirect():
            self.fields.action.redirect_if = \
                    (set(Store.GetTrunkingUplinks()) - set([dep.intf])).pop()
            self.fields.action.encap_id = 20
            self.fields.action.macsa = resmgr.AclMacAllocator.get()
            self.fields.action.macda = resmgr.AclMacAllocator.get()
Exemple #22
0
import infra.common.defs as defs
import infra.common.utils as utils
import infra.common.logging as logging
import infra.common.objects as objects
import infra.common.loader as loader
import infra.factory.testspec as testspec
import infra.factory.testcase as testcase
import infra.factory.factory as factory

from infra.factory.store import FactoryStore as FactoryStore
from infra.common.logging import logger
from infra.common.glopts import GlobalOptions
from infra.config.store import ConfigStore as ConfigStore
from infra.misc import coverage

ModuleIdAllocator = objects.TemplateFieldObject("range/1/8192")
TestCaseIdAllocator = objects.TemplateFieldObject("range/1/65535")

MODULE_CB_INIT_TRACKER = 'InitTracker'
MODULE_CB_SETUP = 'Setup'
MODULE_CB_TEARDOWN = 'Teardown'


class ModuleStats:
    def __init__(self):
        self.Reset()
        return

    def Reset(self):
        self.passed = 0
        self.failed = 0
Exemple #23
0
    def __init__(self, node):
        super().__init__()
        self.Node = node
        self.EpochAllocator = iter(irange(1, 4096))
        # tunnel id=1 is mytep
        self.TunnelIdAllocator = iter(irange(2, 4096))
        self.VpcIdAllocator = iter(irange(1, 1024))
        self.SubnetIdAllocator = iter(irange(1, 1024))
        self.FlowIdAllocator = iter(irange(1, 1 * 1024 * 1024))
        self.VnicVlanIdAllocator = iter(irange(1, 1024))
        self.VnicMplsSlotIdAllocator = iter(irange(10000, 11024))
        self.VnicIdAllocator = iter(irange(1, 1024))
        self.InterfaceIdAllocator = iter(irange(1, 66))
        self.V4RouteTableIdAllocator = iter(irange(1, 1024))
        self.V6RouteTableIdAllocator = iter(irange(10001, 11024))
        self.RouteIdAllocator = iter(irange(1, 1024 * 1023))
        self.V4SecurityPolicyIdAllocator = iter(irange(1, 2048))
        self.V6SecurityPolicyIdAllocator = iter(irange(10001, 12048))
        self.RuleIdAllocator = iter(irange(1, 1023 * 1023))
        self.SecurityPolicyIdAllocator = iter(irange(1, 4 * 1024 * 1024))
        self.VirtualRouterMacAllocator = objects.TemplateFieldObject(
            "macstep/00CC.0000.0001/0000.0000.0001")
        self.RemoteMappingMacAllocator = objects.TemplateFieldObject(
            "macstep/00EE.0000.0001/0000.0000.0001")
        self.TepIpAddressAllocator = ipaddress.IPv4Network(
            '172.16.0.0/16').hosts()
        self.TepIpv6AddressAllocator = ipaddress.IPv6Network(
            'ffff::100:0/104').hosts()
        self.IGWMplsSlotIdAllocator = iter(irange(30001, 31024))
        self.RemoteInternetNonNatTunAllocator = None
        self.RemoteInternetNatTunAllocator = None
        self.RemoteMplsVnicTunAllocator = None
        self.PublicIpAddressAllocator = ipaddress.IPv4Network(
            '200.0.0.0/16').hosts()
        self.PublicIpv6AddressAllocator = ipaddress.IPv6Network(
            'eeee:0:0:0::/64').hosts()
        self.IGWVxlanIdAllocator = iter(irange(50001, 51024))
        self.VxlanIdAllocator = iter(irange(80001, 81024))
        self.MirrorSessionIdAllocator = iter(irange(1, 8))
        self.PortIdAllocator = iter(irange(1, 4))
        self.DhcpIdAllocator = iter(irange(1, 32))
        self.NatPoolIdAllocator = iter(irange(1, 1000))
        self.PolicerIdAllocator = iter(irange(1, 2048))
        self.EvpnEviIdAllocator = iter(irange(1, 50))
        self.EvpnEviRtIdAllocator = iter(irange(1, 50))
        self.EvpnIpVrfIdAllocator = iter(irange(1, 50))
        self.EvpnIpVrfRtIdAllocator = iter(irange(1, 50))
        self.IpsecTunAllocator = None
        self.IpsecTunnelModeTunAllocator = None
        self.IpsecTransportModeTunAllocator = None
        self.IpsecEncryptSAIdAllocator = iter(irange(1, 1000))
        self.IpsecDecryptSAIdAllocator = iter(irange(1, 1000))
        self.IpsecTunnelAddressAllocator = ipaddress.IPv4Network(
            '205.10.0.0/16').hosts()

        # ---------------------------------------------------------------------------------
        # Artemis specific configs
        # Nexthop IP allocator. Curently unique IP (globally)
        # TODO : Can have same IP across VPCs.
        self.NexthopIdAllocator = iter(irange(1, 1 * 1024 * 1024))
        self.NexthopIpV4AddressAllocator = ipaddress.IPv4Network(
            '210.0.0.0/16').hosts()
        self.NexthopIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:eeee:0:0::/64').hosts()
        self.NexthopMacAllocator = objects.TemplateFieldObject(
            "macstep/0055.0000.0001/0000.0000.0001")
        self.NexthopGroupIdAllocator = iter(irange(1, 1 * 1024))
        self.V4TagIdAllocator = iter(irange(1, 1))
        self.V6TagIdAllocator = iter(irange(2, 2))
        self.NexthopVxlanIdAllocator = iter(irange(90001, 91024))
        self.V4MeterIdAllocator = iter(irange(1, 64))
        self.V6MeterIdAllocator = iter(irange(65, 129))
        # Currently one to one mapping with CA-IP. TODO. Many to one
        self.SvcMappingPublicIpV4AddressAllocator = ipaddress.IPv4Network(
            '150.0.0.0/16').hosts()
        self.SvcMappingPublicIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:dddd:dddd:0::/64').hosts()
        self.NexthopVlanIdAllocator = iter(irange(4001, 5124))
        # Provider IP for local and remote. One to One mapping now. Many to one can be done later
        self.ProviderIpV4Network = '220.0.0.0/8'
        self.ProviderIpV6Network = 'eeee:eeee:eee0:0::/64'
        self.ProviderIpV4Network = ipaddress.IPv4Network(
            self.ProviderIpV4Network)
        self.ProviderIpV6Network = ipaddress.IPv6Network(
            self.ProviderIpV6Network)
        self.ProviderIpV4AddressAllocator = ipaddress.IPv4Network(
            self.ProviderIpV4Network).hosts()
        self.ProviderIpV6AddressAllocator = ipaddress.IPv6Network(
            self.ProviderIpV6Network).hosts()
        self.VpcVxlanIdAllocator = iter(irange(50000, 51024))
        self.Nat46Address = ipaddress.IPv6Network('aaaa:aaaa:0:0::/64')
        self.TepMacAllocator = objects.TemplateFieldObject(
            "macstep/0065.0000.0001/0000.0000.0001")
        # Public IP adddress in the underlay VC
        self.SvcMappingPublicIpV4AddressAllocator = ipaddress.IPv4Network(
            '150.0.0.0/16').hosts()
        self.SvcMappingPublicIpV6AddressAllocator = ipaddress.IPv6Network(
            'eeee:dddd:dddd:0::/64').hosts()
        # -------------------------------------------------------------------
        self.SvcTunAllocator = None
        self.RemoteSvcTunAllocator = None
        self.UnderlayTunAllocator = None
        self.UnderlayECMPTunAllocator = None
        self.OverlayNhGroupAllocator = None
        self.RemoteSvcTunIPv4Addr = ipaddress.IPv4Network(
            '30.0.0.0/24').hosts()

        #Apulu specific configs
        self.UnderlayNHAllocator = None
        self.OverlayNHAllocator = None
        self.DualEcmpNhAllocator = None
        self.UnderlayNhGroupAllocator = None
        self.DualEcmpNhGroupAllocator = None
        self.DhcpRelayAllocator = None
        self.IpsecEncryptSAAllocator = None
        self.IpsecDecryptSAAllocator = None
        self.DeviceMacAllocator = objects.TemplateFieldObject(
            "macstep/0002.0100.0000/0000.0000.0001")
        self.NumVnicPolicyAllocator = utils.rrobiniter(
            range(Resmgr.MAX_POLICY_PER_VNIC + 1))
        self.UnderlayNumNexthopsAllocator = utils.rrobiniter(
            range(1, Resmgr.MAX_UNDERLAY_NHS + 1))
        self.OverlayNumNexthopsAllocator = utils.rrobiniter(
            range(1, Resmgr.MAX_OVERLAY_NHS + 1))

        self.L3InterfaceIPv4PfxPool = iter(
            ipaddress.IPv4Network('40.40.0.0/16').subnets(new_prefix=24))

        # Host interface configs
        self.HostMemoryAllocator = None
        self.HostIfs = dict()
        # Host interface index allocator for IOTA.
        # Ifindices 72 and 73 (0x48, 0x49) are reserved, so we have a non-contiuous list
        #TODO: Fix it properly later
        HostIfIdxList = [
            0x80000047, 0x8000004A, 0x8000004B, 0x8000004C, 0x8000004D,
            0x8000004E, 0x8000004F, 0x80000050
        ]

        self.HostIfIdxAllocator = iter(HostIfIdxList)
        self.LoopbackIfIdAllocator = iter(irange(1, 16))

        # Metaswitch
        self.BgpIdAllocator = iter(irange(1, 10))
        self.BgpPeerIdAllocator = iter(irange(1, 10))
        self.BgpPeerAfIdAllocator = iter(irange(1, 10))

        return
Exemple #24
0
#! /usr/bin/python3

import infra.common.defs as defs
import infra.common.objects as objects
from factory.objects.ut.descriptor import InfraUtTxDescriptorObject

RingIdAllocator = objects.TemplateFieldObject("range/1/256")


class RingObject(objects.FrameworkObject):
    def __init__(self, size, entrysz, pi=0, ci=0):
        super().__init__()
        self.ID(RingIdAllocator.get())
        self.size = size
        self.entrysz = entrysz
        self.pi = pi
        self.ci = ci

        self.list = [None] * self.size
        return

    def configure(self):
        return

    def Post(self, descriptor):
        descriptor.Write(self.GID(), self.pi)
        self.pi += 1
        return self.pi

    def Read(self, descriptor, index):
        descriptor.Read(self.GID(), index - 1)