def setUp(self):
     self._rm = PONResourceManager('xgspon', 'default', '0001c889ee7189fb',
                                   'consul', 'localhost', 8500)
     self.default_resource_range = {
         "onu_start_idx": 1,
         "onu_end_idx": 127,
         "alloc_id_start_idx": 1024,
         "alloc_id_end_idx": 65534,
         "gem_port_id_start_idx": 1024,
         "gem_port_id_end_idx": 16383,
         "num_of_pon_port": 16
     }
Exemple #2
0
 def setUp(self):
     self._rm = PONResourceManager('xgspon', 'default', '0001c889ee7189fb',
                                   'consul', 'localhost', 8500)
     self.default_resource_range = {
         "onu_id_start": 1,
         "onu_id_end": 127,
         "alloc_id_start": 1024,
         "alloc_id_end": 2816,
         "gemport_id_start": 1024,
         "gemport_id_end": 8960,
         "pon_ports": 16
     }
    def _parse_extra_args_and_init_resource_manager_class(self):
        self.args = registry('main').get_args()

        # KV store's IP Address and PORT
        host, port = '127.0.0.1', 8500
        if self.args.backend == 'etcd':
            host, port = self.args.etcd.split(':', 1)
        elif self.args.backend == 'consul':
            host, port = self.args.consul.split(':', 1)

        if self.extra_args and len(self.extra_args) > 0:
            parser = OpenOltArgumentParser(add_help=False)
            parser.add_argument('--openolt_variant', '-o', action='store',
                                choices=['default', 'asfvolt16'],
                                default='default')
            try:
                args = parser.parse_args(shlex.split(self.extra_args))
                self.log.debug('parsing-extra-arguments', args=args)

                try:
                    resource_manager = PONResourceManager(
                        self.device_info.technology,
                        args.openolt_variant,
                        self.device_id, self.args.backend,
                        host, port
                    )
                except Exception as e:
                    raise Exception(e)

            except ArgumentError as e:
                raise Exception('invalid-arguments: {}'.format(e.message))

            except Exception as e:
                raise Exception(
                    'option-parsing-error: {}'.format(e.message))
        else:
            try:
                # OLT Vendor type not available, use device information
                # to initialize PON resource ranges.
                self.use_device_info = True

                resource_manager = PONResourceManager(
                    self.device_info.technology,
                    self.device_info.vendor,
                    self.device_id, self.args.backend,
                    host, port
                )
            except Exception as e:
                raise Exception(e)

        return resource_manager
Exemple #4
0
    def __init__(self, device_id, host_and_port, extra_args, device_info):
        self.log = structlog.get_logger(id=device_id, ip=host_and_port)
        self.device_id = device_id
        self.host_and_port = host_and_port
        self.extra_args = extra_args
        self.device_info = device_info
        self.args = registry('main').get_args()

        # KV store's IP Address and PORT
        if self.args.backend == 'etcd':
            host, port = self.args.etcd.split(':', 1)
            self.kv_store = EtcdStore(
                host, port,
                OpenOltResourceMgr.BASE_PATH_KV_STORE.format(device_id))
        elif self.args.backend == 'consul':
            host, port = self.args.consul.split(':', 1)
            self.kv_store = ConsulStore(
                host, port,
                OpenOltResourceMgr.BASE_PATH_KV_STORE.format(device_id))
        else:
            self.log.error('Invalid-backend')
            raise Exception("Invalid-backend-for-kv-store")

        ranges = dict()
        resource_mgrs_by_tech = dict()
        self.resource_mgrs = dict()

        # If a legacy driver returns protobuf without any ranges,s synthesize one from
        # the legacy global per-device informaiton. This, in theory, is temporary until
        # the legacy drivers are upgrade to support pool ranges.
        if len(self.device_info.ranges) == 0:
            arange = self.device_info.ranges.add()
            arange.technology = self.device_info.technology
            arange.intf_ids.extend(range(0, device_info.pon_ports))

            pool = arange.pools.add()
            pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ONU_ID
            pool.start = self.device_info.onu_id_start
            pool.end = self.device_info.onu_id_end
            pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.DEDICATED_PER_INTF

            pool = arange.pools.add()
            pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ALLOC_ID
            pool.start = self.device_info.alloc_id_start
            pool.end = self.device_info.alloc_id_end
            pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH

            pool = arange.pools.add()
            pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.GEMPORT_ID
            pool.start = self.device_info.gemport_id_start
            pool.end = self.device_info.gemport_id_end
            pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH

            pool = arange.pools.add()
            pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.FLOW_ID
            pool.start = self.device_info.flow_id_start
            pool.end = self.device_info.flow_id_end
            pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH

        # Create a separate Resource Manager instance for each range. This assumes that
        # each technology is represented by only a single range
        global_resource_mgr = None
        for arange in self.device_info.ranges:
            technology = arange.technology
            self.log.info("device-info", technology=technology)
            ranges[technology] = arange
            extra_args = self.extra_args + ' ' + PONResourceManager.OLT_MODEL_ARG + ' {}'.format(
                self.device_info.model)
            resource_mgr = PONResourceManager(technology, extra_args,
                                              self.device_id,
                                              self.args.backend, host, port)
            resource_mgrs_by_tech[technology] = resource_mgr
            if global_resource_mgr is None:
                global_resource_mgr = resource_mgr
            for intf_id in arange.intf_ids:
                self.resource_mgrs[intf_id] = resource_mgrs_by_tech[technology]
            self.initialize_device_resource_range_and_pool(
                resource_mgr, global_resource_mgr, arange)

        # After we have initialized resource ranges, initialize the
        # resource pools accordingly.
        for technology, resource_mgr in resource_mgrs_by_tech.iteritems():
            resource_mgr.init_device_resource_pool()
class TestResourceManager(TestCase):
    def setUp(self):
        self._rm = PONResourceManager('xgspon', 'default', '0001c889ee7189fb',
                                      'consul', 'localhost', 8500)
        self.default_resource_range = {
            "onu_start_idx": 1,
            "onu_end_idx": 127,
            "alloc_id_start_idx": 1024,
            "alloc_id_end_idx": 65534,
            "gem_port_id_start_idx": 1024,
            "gem_port_id_end_idx": 16383,
            "num_of_pon_port": 16
        }

    def tearDown(self):
        self._rm = None
        self.default_resource_range = None

    @inlineCallbacks
    def test_init_pon_resource_ranges(self):
        key = PONResourceManager.PON_RESOURCE_RANGE_CONFIG_PATH.format(
            'xgspon', 'default')
        value = json.dumps(self.default_resource_range).encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))

        yield self._rm.init_pon_resource_ranges()
        self.assertEqual(self._rm.pon_resource_ranges,
                         self.default_resource_range)

        self._rm._kv_store.get = Mock(return_value=(None, None))

        yield self._rm.init_pon_resource_ranges()
        self.assertEqual(self._rm.pon_resource_ranges,
                         self.default_resource_range)

    @inlineCallbacks
    def test_init_resource_id_pool(self):
        self._rm._kv_store.get = Mock(return_value=(None, None))
        self._rm._kv_store.put = Mock(return_value=None)
        status = yield self._rm.init_resource_id_pool(0, 'ONU_ID', 1, 127)
        self.assertTrue(status)
        status = yield self._rm.init_resource_id_pool(1, 'ALLOC_ID', 1024,
                                                      16383)
        self.assertTrue(status)
        status = yield self._rm.init_resource_id_pool(2, 'GEMPORT_ID', 1023,
                                                      65534)
        self.assertTrue(status)

    @inlineCallbacks
    def test_get_resource_id(self):
        # Get onu id test
        onu_id_resource = self._rm._format_resource(0, 1, 127)
        key = self._rm._get_path(0, PONResourceManager.ONU_ID)
        value = onu_id_resource.encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        self._rm._kv_store.put = Mock(return_value=None)
        result = yield self._rm.get_resource_id(0, 'ONU_ID')
        self.assertEqual(result, 1)

        # Get alloc id test
        alloc_id_resource = self._rm._format_resource(1, 1024, 16383)
        key = self._rm._get_path(1, PONResourceManager.ALLOC_ID)
        value = alloc_id_resource.encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        result = yield self._rm.get_resource_id(1, 'ALLOC_ID', 1)
        self.assertEqual(result[0], 1024)
        result = yield self._rm.get_resource_id(1, 'ALLOC_ID', 4)
        self.assertEqual(result, [1024, 1025, 1026, 1027])

        # Get gemport id test
        gemport_id_resource = self._rm._format_resource(2, 1023, 65534)
        key = self._rm._get_path(2, PONResourceManager.GEMPORT_ID)
        value = gemport_id_resource.encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        result = yield self._rm.get_resource_id(2, 'GEMPORT_ID', 1)
        self.assertEqual(result[0], 1023)
        result = yield self._rm.get_resource_id(2, 'GEMPORT_ID', 5)
        self.assertEqual(result, [1023, 1024, 1025, 1026, 1027])

    @inlineCallbacks
    def test_free_resource_id(self):
        # Free onu id test
        self._rm._kv_store.put = Mock(return_value=None)
        onu_id_resource = eval(self._rm._format_resource(0, 1, 127))
        onu_id_resource['pool'] = BitArray('0b' + onu_id_resource['pool'])
        self._rm._generate_next_id(onu_id_resource)
        onu_id_resource['pool'] = onu_id_resource['pool'].bin
        key = self._rm._get_path(0, PONResourceManager.ONU_ID)
        value = json.dumps(onu_id_resource).encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        result = yield self._rm.free_resource_id(0, 'ONU_ID', 1)
        self.assertTrue(result)

        # Free alloc id test
        alloc_id_resource = eval(self._rm._format_resource(1, 1024, 16383))
        alloc_id_resource['pool'] = BitArray('0b' + alloc_id_resource['pool'])

        for num in range(5):
            self._rm._generate_next_id(alloc_id_resource)

        alloc_id_resource['pool'] = alloc_id_resource['pool'].bin
        key = self._rm._get_path(0, PONResourceManager.ALLOC_ID)
        value = json.dumps(alloc_id_resource).encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        result = self._rm.free_resource_id(1, 'ALLOC_ID',
                                           [1024, 1025, 1026, 1027, 1028])
        self.assertTrue(result)

        # Free gemport id test
        gemport_id_resource = eval(self._rm._format_resource(2, 1023, 65534))
        gemport_id_resource['pool'] = BitArray('0b' +
                                               gemport_id_resource['pool'])

        for num in range(6):
            self._rm._generate_next_id(gemport_id_resource)

        gemport_id_resource['pool'] = gemport_id_resource['pool'].bin
        key = self._rm._get_path(0, PONResourceManager.GEMPORT_ID)
        value = json.dumps(gemport_id_resource).encode('utf-8')
        output = KVPair(key, value, None)
        self._rm._kv_store.get = Mock(return_value=(output, None))
        result = self._rm.free_resource_id(
            2, 'GEMPORT_ID', [1023, 1024, 1025, 1026, 1027, 1028])
        self.assertTrue(result)

    @inlineCallbacks
    def test_clear_resource_id_pool(self):
        self._rm._kv_store.delete = Mock(return_value=None)
        status = yield self._rm.clear_resource_id_pool(0, 'ONU_ID')
        self.assertTrue(status)
        self._rm._kv_store.delete = Mock(return_value="error")
        status = yield self._rm.clear_resource_id_pool(1, 'ALLOC_ID')
        self.assertFalse(status)
Exemple #6
0
class TestResourceManager(TestCase):
    def setUp(self):
        self._rm = PONResourceManager('xgspon', 'default', '0001c889ee7189fb',
                                      'consul', 'localhost', 8500)
        self.default_resource_range = {
            "onu_id_start": 1,
            "onu_id_end": 127,
            "alloc_id_start": 1024,
            "alloc_id_end": 2816,
            "gemport_id_start": 1024,
            "gemport_id_end": 8960,
            "pon_ports": 16
        }

    def tearDown(self):
        self._rm = None
        self.default_resource_range = None

    def test_init_pon_resource_ranges(self):
        output = json.dumps(self.default_resource_range).encode('utf-8')
        self._rm._get_olt_model = Mock(return_value='default')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)

        self._rm.init_resource_ranges_from_kv_store()
        self.assertEqual(self._rm.pon_resource_ranges,
                         self.default_resource_range)

        self._rm.init_default_pon_resource_ranges()
        self.assertEqual(self._rm.pon_resource_ranges,
                         self.default_resource_range)

    def test_init_resource_id_pool(self):
        self._rm._kv_store.get_from_kv_store = Mock(return_value=None)
        self._rm._kv_store.update_to_kv_store = Mock(return_value=True)
        status = self._rm.init_resource_id_pool(0, 'ONU_ID', 1, 127)
        self.assertTrue(status)
        status = self._rm.init_resource_id_pool(1, 'ALLOC_ID', 1024, 16383)
        self.assertTrue(status)
        status = self._rm.init_resource_id_pool(2, 'GEMPORT_ID', 1023, 65534)
        self.assertTrue(status)

    def test_get_resource_id(self):
        # Get onu id test
        onu_id_resource = self._rm._format_resource(0, 1, 127)
        output = onu_id_resource.encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        self._rm._kv_store.update_to_kv_store = Mock(return_value=True)
        result = self._rm.get_resource_id(0, 'ONU_ID')
        self.assertEqual(result, 1)

        # Get alloc id test
        alloc_id_resource = self._rm._format_resource(1, 1024, 16383)
        output = alloc_id_resource.encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        result = self._rm.get_resource_id(1, 'ALLOC_ID', 1)
        self.assertEqual(result[0], 1024)
        result = self._rm.get_resource_id(1, 'ALLOC_ID', 4)
        self.assertEqual(result, [1024, 1025, 1026, 1027])

        # Get gemport id test
        gemport_id_resource = self._rm._format_resource(2, 1023, 65534)
        output = gemport_id_resource.encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        result = self._rm.get_resource_id(2, 'GEMPORT_ID', 1)
        self.assertEqual(result[0], 1023)
        result = self._rm.get_resource_id(2, 'GEMPORT_ID', 5)
        self.assertEqual(result, [1023, 1024, 1025, 1026, 1027])

    def test_free_resource_id(self):
        # Free onu id test
        self._rm._kv_store.update_to_kv_store = Mock(return_value=True)
        onu_id_resource = eval(self._rm._format_resource(0, 1, 127))
        onu_id_resource['pool'] = BitArray('0b' + onu_id_resource['pool'])
        self._rm._generate_next_id(onu_id_resource)
        onu_id_resource['pool'] = onu_id_resource['pool'].bin
        output = json.dumps(onu_id_resource).encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        result = self._rm.free_resource_id(0, 'ONU_ID', 1)
        self.assertTrue(result)

        # Free alloc id test
        alloc_id_resource = eval(self._rm._format_resource(1, 1024, 16383))
        alloc_id_resource['pool'] = BitArray('0b' + alloc_id_resource['pool'])

        for num in range(5):
            self._rm._generate_next_id(alloc_id_resource)

        alloc_id_resource['pool'] = alloc_id_resource['pool'].bin
        output = json.dumps(alloc_id_resource).encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        result = self._rm.free_resource_id(1, 'ALLOC_ID',
                                           [1024, 1025, 1026, 1027, 1028])
        self.assertTrue(result)

        # Free gemport id test
        gemport_id_resource = eval(self._rm._format_resource(2, 1023, 65534))
        gemport_id_resource['pool'] = BitArray('0b' +
                                               gemport_id_resource['pool'])

        for num in range(6):
            self._rm._generate_next_id(gemport_id_resource)

        gemport_id_resource['pool'] = gemport_id_resource['pool'].bin
        output = json.dumps(gemport_id_resource).encode('utf-8')
        self._rm._kv_store.get_from_kv_store = Mock(return_value=output)
        result = self._rm.free_resource_id(
            2, 'GEMPORT_ID', [1023, 1024, 1025, 1026, 1027, 1028])
        self.assertTrue(result)

    def test_clear_resource_id_pool(self):
        self._rm._kv_store.remove_from_kv_store = Mock(return_value=True)
        status = self._rm.clear_resource_id_pool(0, 'ONU_ID')
        self.assertTrue(status)
        self._rm._kv_store.remove_from_kv_store = Mock(return_value=False)
        status = self._rm.clear_resource_id_pool(1, 'ALLOC_ID')
        self.assertFalse(status)