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 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
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)
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)