def test_nested_adds(self): self.node.add('/logical_devices', LogicalDevice(id='0')) self.node.add('/logical_devices', LogicalDevice(id='1')) proxy0 = self.node.get_proxy('/logical_devices/0') proxy1 = self.node.get_proxy('/logical_devices/1') tx0 = proxy0.open_transaction() tx1 = proxy1.open_transaction() tx0.add('/ports', LogicalPort(id='0', ofp_port=ofp_port(port_no=0, name='/0'))) tx0.add('/ports', LogicalPort(id='1', ofp_port=ofp_port(port_no=1, name='/1'))) tx1.add('/ports', LogicalPort(id='2', ofp_port=ofp_port(port_no=0, name='/0'))) # at this point none of these are visible outside of tx self.assertEqual(len(proxy0.get('/', deep=1).ports), 0) self.assertEqual(len(proxy1.get('/', deep=1).ports), 0) tx0.commit() self.assertEqual(len(proxy0.get('/', deep=1).ports), 2) self.assertEqual(len(proxy1.get('/', deep=1).ports), 0) tx1.commit() self.assertEqual(len(proxy0.get('/', deep=1).ports), 2) self.assertEqual(len(proxy1.get('/', deep=1).ports), 1)
def test_nested_removes(self): self.node.add('/logical_devices', LogicalDevice(id='0')) proxy0 = self.node.get_proxy('/logical_devices/0') # add some ports to a device tx0 = proxy0.open_transaction() for i in xrange(10): tx0.add( '/ports', LogicalPort(id=str(i), ofp_port=ofp_port(port_no=i, name='/{}'.format(i)))) # self.assertRaises(ValueError, tx0.add, '/ports', LogicalPort(id='1')) tx0.commit() # now to the removal tx0 = proxy0.open_transaction() tx0.remove('/ports/0') tx0.remove('/ports/5') tx1 = proxy0.open_transaction() tx1.remove('/ports/2') tx1.remove('/ports/7') tx0.commit() tx1.commit() port_ids = [ p.ofp_port.port_no for p in self.node.get(deep=1).logical_devices[0].ports ] self.assertEqual(port_ids, [1, 3, 4, 6, 8, 9])
def GetLogicalDevice(self, request, context): log.info('grpc-request', request=request) depth = int(dict(context.invocation_metadata()).get('get-depth', 0)) if '/' in request.id: context.set_details('Malformed logical device id \'{}\''.format( request.id)) context.set_code(StatusCode.INVALID_ARGUMENT) return LogicalDevice() try: return self.root.get('/logical_devices/' + request.id, depth=depth) except KeyError: context.set_details('Logical device \'{}\' not found'.format( request.id)) context.set_code(StatusCode.NOT_FOUND) return LogicalDevice()
def GetLogicalDevice(self, request, context): log.info('grpc-request', request=request) try: instance_id = self.dispatcher.instance_id_by_logical_device_id( request.id) except KeyError: context.set_details('Logical device \'{}\' not found'.format( request.id)) context.set_code(StatusCode.NOT_FOUND) return LogicalDevice() return self.dispatcher.dispatch(instance_id, VolthaLocalServiceStub, 'GetLogicalDevice', request, context)
def test_transactions_defer_post_op_callbacks(self): proxy = self.node.get_proxy('/') pre_update = Mock() post_update = Mock() pre_add = Mock() post_add = Mock() pre_remove = Mock() post_remove = Mock() proxy.register_callback(CallbackType.PRE_UPDATE, pre_update) proxy.register_callback(CallbackType.POST_UPDATE, post_update) proxy.register_callback(CallbackType.PRE_ADD, pre_add) proxy.register_callback(CallbackType.POST_ADD, post_add) proxy.register_callback(CallbackType.PRE_REMOVE, pre_remove) proxy.register_callback(CallbackType.POST_REMOVE, post_remove) tx = proxy.open_transaction() # make some changes of each type v = tx.get('/') v.version = '42' tx.update('/', v) ad = tx.get('/adapters/1') tx.remove('/adapters/1') ld = LogicalDevice(id='1') tx.add('/logical_devices', ld) # each pre_* should have been called exactly once, but none of the # post_* callbacks have been called yet pre_update.assert_called_once_with(v) pre_add.assert_called_once_with(ld) pre_remove.assert_called_once_with(ad) post_update.assert_not_called() post_add.assert_not_called() post_remove.assert_not_called() # once we commit, we shall get the other callbacks tx.commit() post_update.assert_called_once_with(v) post_add.assert_called_once_with(ld) # OperationContext( # data=ld, # field_name='logical_devices', # child_key='1' # )) post_remove.assert_called_once_with(ad)
def pump_some_data(self, node): seed(0) node.update('/', VolthaInstance(instance_id='1', version='42', log_level=1)) node.update('/health', HealthStatus(state=HealthStatus.OVERLOADED)) for i in xrange(n_adapters): node.add( '/adapters', Adapter(id=str(i), vendor='cord', version=str(randint(1, 10)), config=AdapterConfig(log_level=0))) for i in xrange(n_logical_nodes): node.add( '/logical_devices', LogicalDevice(id=str(i), datapath_id=randint(1, 100000), desc=ofp_desc(mfr_desc='foo', hw_desc='bar', sw_desc='zoo')))