def verify_conf(self,xr): returncode = 0 try: match_sgroup = 0 match_dgroup = 0 match_sub = 0 rpc_service = CRUDService() sgroups = rpc_service.read(xr,oc_telemetry.TelemetrySystem.SensorGroups()) dgroups = rpc_service.read(xr,xr_telemetry.TelemetryModelDriven.DestinationGroups()) subs = rpc_service.read(xr,oc_telemetry.TelemetrySystem.Subscriptions()) for sgroup in sgroups.sensor_group: if sgroup.sensor_group_id == self.SGroupName: match_path = 0 split = "," PathList = self.SPath.split(split) SList = sgroup.sensor_paths for spath in SList.sensor_path: if spath.path in PathList: match_path += 1 if match_path == len(PathList): match_sgroup =1 if match_sgroup == 0: returncode = 13 except: returncode = 12 return returncode
class SanityTest(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider( "127.0.0.1", "admin", "admin", 12022, ) self.crud = CRUDService() def setUp(self): runner = Runner() self.crud.delete(self.ncc, runner) def test_delete_on_list_with_identitykey(self): a1 = Runner.OneList.IdentityList() a1.config.id = ChildIdentity() a1.id_ref = a1.config.id self.crud.create(self.ncc, a1) k = Runner.OneList.IdentityList() k.config.id = ChildIdentity() k.id_ref = k.config.id k.yfilter = YFilter.delete self.crud.update(self.ncc, k) runner_read = self.crud.read(self.ncc, Runner()) self.assertIsNone(runner_read) def test_iden_list(self): # CREATE il = Runner.OneList.IdentityList() il.config.id = ChildIdentity() il.id_ref = ChildIdentity() self.crud.create(self.ncc, il) # READ & VALIDATE runner_filter = Runner.OneList() read_one = self.crud.read(self.ncc, runner_filter) self.assertIsNotNone(read_one) read_il = read_one.identity_list.get(ChildIdentity().to_string()) self.assertIsNotNone(read_il) read_il.parent = None self.assertEqual(read_il, il) # DELETE & VALIDATE self.crud.delete(self.ncc, il) runner_read = self.crud.read(self.ncc, Runner()) self.assertIsNone(runner_read)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): self.crud.delete(self.ncc, ietf_aug_base_1.Cpython()) self.crud.delete(self.ncc, ietf_aug_base_2.Cpython()) def tearDown(self): self.crud.delete(self.ncc, ietf_aug_base_1.Cpython()) self.crud.delete(self.ncc, ietf_aug_base_2.Cpython()) def test_aug_base_1(self): cpython = ietf_aug_base_1.Cpython() cpython.doc.ydktest_aug_1.aug_one = 'aug one' cpython.doc.ydktest_aug_2.aug_two = 'aug two' cpython.doc.ydktest_aug_4.aug_four = 'aug four' cpython.lib.ydktest_aug_1.ydktest_aug_nested_1.aug_one = 'aug one' cpython.lib.ydktest_aug_2.ydktest_aug_nested_2.aug_two = 'aug two' cpython.lib.ydktest_aug_4.ydktest_aug_nested_4.aug_four = 'aug four' cpython.doc.disutils.four_aug_list.enabled = True item1 = cpython.doc.disutils.four_aug_list.Ldata() item2 = cpython.doc.disutils.four_aug_list.Ldata() item1.name, item1.number = 'one', 1 item2.name, item1.number = 'two', 2 self.crud.create(self.ncc, cpython) cpython_read = self.crud.read(self.ncc, ietf_aug_base_1.Cpython()) self.assertEqual(is_equal(cpython, cpython_read), True) def test_aug_base_2(self): cpython = ietf_aug_base_2.Cpython() cpython.tools.aug_four = 'aug four' self.crud.create(self.ncc, cpython) cpython_read = self.crud.read(self.ncc, ietf_aug_base_2.Cpython()) self.assertEqual(is_equal(cpython, cpython_read), True)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): self.crud.delete(self.ncc, ietf_aug_base_1.Cpython()) self.crud.delete(self.ncc, ietf_aug_base_2.Cpython()) def tearDown(self): self.crud.delete(self.ncc, ietf_aug_base_1.Cpython()) self.crud.delete(self.ncc, ietf_aug_base_2.Cpython()) def test_aug_base_1(self): cpython = ietf_aug_base_1.Cpython() cpython.doc.ydktest_aug_1.aug_one = 'aug one' cpython.doc.ydktest_aug_2.aug_two = 'aug two' cpython.doc.ydktest_aug_4.aug_four = 'aug four' cpython.lib.ydktest_aug_1.ydktest_aug_nested_1.aug_one = 'aug one' cpython.lib.ydktest_aug_2.ydktest_aug_nested_2.aug_two = 'aug two' cpython.lib.ydktest_aug_4.ydktest_aug_nested_4.aug_four = 'aug four' cpython.doc.disutils.four_aug_list.enabled = True item1 = cpython.doc.disutils.four_aug_list.Ldata() item2 = cpython.doc.disutils.four_aug_list.Ldata() item1.name, item1.number = 'one', 1 item2.name, item1.number = 'two', 2 self.crud.create(self.ncc, cpython) cpython_read = self.crud.read(self.ncc, ietf_aug_base_1.Cpython()) self.assertEqual(is_equal(cpython, cpython_read), True) def test_aug_base_2(self): cpython = ietf_aug_base_2.Cpython() cpython.tools.aug_four = 'aug four' self.crud.create(self.ncc, cpython) cpython_read = self.crud.read(self.ncc, ietf_aug_base_2.Cpython()) self.assertEqual(is_equal(cpython, cpython_read), True)
def main(): module = AnsibleModule( argument_spec = dict( host = dict(required=True), username = dict(required=False, default=None), password = dict(required=False, default=None), ), supports_check_mode = False ) args = module.params # establish ssh connection provider = NetconfServiceProvider(address=args['host'], port=830, username=args['username'], password=args['password'], protocol='ssh') # establish CRUD service crud = CRUDService() # retrieve software install version install = SoftwareInstall() info = crud.read(provider, install) logger = info.all_operations_log result = dict(changed=False) result['stdout'] = logger.summary.log return module.exit_json(**result)
def main(): module = AnsibleModule(argument_spec=dict( host=dict(required=True), username=dict(required=False, default=None), password=dict(required=False, default=None), ), supports_check_mode=False) args = module.params # establish ssh connection provider = NetconfServiceProvider(address=args['host'], port=830, username=args['username'], password=args['password'], protocol='ssh') # establish CRUD service crud = CRUDService() # retrieve software install version install = SoftwareInstall() info = crud.read(provider, install) result = dict(changed=False) result['stdout'] = "no active package" for package in info.active.active_package_info: result['stdout'] = \ "active_packages: %sboot_partition_name: %s\nlocation: %s\n" \ "node_type: %s\nnumber_of_active_packages: %d" % \ (package.active_packages, package.boot_partition_name, package.location, package.node_type, package.number_of_active_packages) return module.exit_json(**result)
def main(): module = AnsibleModule(argument_spec=dict( host=dict(required=True), username=dict(required=False, default=None), password=dict(required=False, default=None), ), supports_check_mode=False) args = module.params # establish ssh connection provider = NetconfServiceProvider(address=args['host'], port=830, username=args['username'], password=args['password'], protocol='ssh') # establish CRUD service crud = CRUDService() # retrieve software install version install = SoftwareInstall() info = crud.read(provider, install) inactive = info.inactive result = dict(changed=False) result['stdout'] = inactive.log return module.exit_json(**result)
def test_sanity_crud_read_interface(self): address = ysanity.Native.Interface.Loopback.Ipv4.Address() address.ip = "2.2.2.2" address.netmask = "255.255.255.255" loopback = ysanity.Native.Interface.Loopback() loopback.name = 2222 loopback.ipv4.address.append(address) native = ysanity.Native() native.interface.loopback.append(loopback) crud = CRUDService() result = crud.create(self.ncc, native) self.assertEqual(result, True) native_read = ysanity.Native() interfaces = crud.read(self.ncc, native_read) codec_service = CodecService() codec_provider = CodecServiceProvider() codec_provider.encoding = EncodingFormat.XML xml_encode = codec_service.encode(codec_provider, interfaces) print('\n===== Printing entity: {}'.format(interfaces)) print(xml_encode) # Delete configuration result = crud.delete(self.ncc, native) self.assertEqual(result, True)
def test_crud_read_list(self): crud = CRUDService() # Build configuration of multiple objects native = ysanity.Native() native.hostname = 'NativeHost' native.version = '0.1.0' bgp = openconfig.Bgp() bgp.global_.config.as_ = 65001 bgp.global_.config.router_id = "1.2.3.4" create_list = [native, bgp] # Configure device result = crud.create(self.ncc, create_list) self.assertEqual(result, True) # Read configuration native_filter = ysanity.Native() bgp_filter = openconfig.Bgp() filter_list = [native_filter, bgp_filter] read_list = crud.read(self.ncc, filter_list) self.assertEqual(isinstance(read_list, list), True) self.assertEqual(len(read_list), 2) # Delete configuration result = crud.delete(self.ncc, create_list) self.assertEqual(result, True)
def test_crud_get_all(self): self.logger.setLevel(logging.ERROR) crud = CRUDService() try: config = crud.read(self.ncc) self.assertNotEqual(len(config), 0) print("\n==== Retrieved entities:") for entity in config: print(entity.path()) except YError as err: self.logger.error("Failed to get device state due to error: {}".format(err.message))
def getAsNeighbors(device,ASN,excludeThese): """ Provides AS neighbor connection status via specified model. TODO: Add multi device and multi vendor support Consider adding IPv6 support in the future Author: David J. Stern Date: DEC 2017 Parameters: device: (str): device type identifier being used. device = "asr" to use OpenConfig model device = "asrCiscoModel" to use vendor model. ASN: (str): AS Number to query. excludeThese: (str[]): List of neighbor IPs to exclude Returns: (str []): Array of neighbor IP addresses On Error: (YPYError): Returns [] on error and prints message to console. """ neighbors=[] if device=="asrCiscoModel": provider = NetconfServiceProvider(address=currentEdgeDeviceInfo['IPv4'],port=,username=currentEdgeDeviceInfo['username'],password=currentEdgeDeviceInfo['password'],protocol="ssh") crud = CRUDService() bgpInstances = bgp_io_cisco.Instances().Instance() bgpInstances.instance_name = "default" interfaces_filter = bgpInstances if device=="asr": provider = NetconfServiceProvider(address=currentEdgeDeviceInfo['IPv4'],port=,username=currentEdgeDeviceInfo['username'],password=currentEdgeDeviceInfo['password'],protocol="ssh") crud = CRUDService() interfaces_filter = bgp_io.Neighbors() try: respNodes = crud.read(provider, interfaces_filter) if device=="asrCiscoModel": respNodes = respNodes.instance_active.default_vrf.neighbors for neighbor in respNodes.neighbor: if excludeThese in neighbor.neighbor_address: next else: print (print_Neighbor(neighbor)) neighbors.append(neighbor.neighbor_address) except YPYError: print('An error occurred reading interfaces.') return neighbors
def getAsNeighborStatus(model,neighborIp): """ Provides AS neighbor connection status via specified model. TODO: Add multi device and multi vendor support Sync with the rest of the file, use either model or device or both Consider adding IPv6 support in the future Restore OC model when funcional with YDK and device Author: David J. Stern Date: DEC 2017 Parameters: model: (str): device type identifier being used. model = "asrCiscoModel" to use vendor model. neighborIp: (str): IPv4 address for neighbor Returns: (YDK Connection_state str): AS connection state On Error: (YPYError): Returns "" on error """ if model=="asrCiscoModel": provider = NetconfServiceProvider(address=currentEdgeDeviceInfo['IPv4'],port=,username=currentEdgeDeviceInfo['username'],password=currentEdgeDeviceInfo['password'],protocol="ssh") crud = CRUDService() bgpInstances = bgp_io_cisco.Instances().Instance() bgpInstances.instance_name = "default" neighborInst=bgpInstances.instance_active.default_vrf.neighbors.Neighbor() neighborInst.neighbor_address=str(neighborIp) bgpInstances.instance_active.default_vrf.neighbors.neighbor.append(neighborInst) interfaces_filter = neighborInst if model=="asr": pass #provider = NetconfServiceProvider(address=currentEdgeDeviceInfo['IPv4'],port=,username=currentEdgeDeviceInfo['username'],password=currentEdgeDeviceInfo['password'],protocol="ssh") #crud = CRUDService() #interfaces_filter = bgp_io.Neighbors() try: respNeighbor = crud.read(provider, interfaces_filter) if model=="asrCiscoModel": return respNeighbor.connection_state except YPYError: print('An error occurred reading interfaces.') return ""
def get_cdp(address, port, username, password, protocol): # create NETCONF provider provider = NetconfServiceProvider(address=address, port=port, username=username, password=password, protocol=protocol) # create CRUD service crud = CRUDService() cdp = xr_cdp_oper.Cdp() cdp = crud.read(provider, cdp) cdp_neigh = '' for node in cdp.nodes.node: for detail in node.neighbors.details.detail: cdp_neigh += detail.device_id + '\n' return cdp_neigh
def run_test(provider): root = provider.get_session().get_root_schema() crud = CRUDService() """Create interface configuration""" ifc = ifmgr.InterfaceConfigurations.InterfaceConfiguration() ifc.active = 'act' ifc.interface_name = 'Loopback10' ifc.description = 'Test interface' ifc.interface_virtual = Empty() ip_address = ifmgr.InterfaceConfigurations.InterfaceConfiguration.Ipv4Network.Addresses.Primary( ) ip_address.address = '172.16.255.1' ip_address.netmask = '255.255.255.255' ifc.ipv4_network.addresses.primary = ip_address ifc_create = ifmgr.InterfaceConfigurations() ifc_create.interface_configuration.append(ifc) reply = crud.update(provider, ifc_create) """Read interface operational data""" ifc_oper_filter = ifoper.InterfaceProperties() dn = ifoper.InterfaceProperties.DataNodes.DataNode() dn.data_node_name = '"0/RP0/CPU0"' ifc_oper_filter.data_nodes.data_node.append(dn) lview = ifoper.InterfaceProperties.DataNodes.DataNode.Locationviews.Locationview( ) lview.locationview_name = '"0/RP0/CPU0"' dn.locationviews.locationview.append(lview) ifc = ifoper.InterfaceProperties.DataNodes.DataNode.Locationviews.Locationview.Interfaces.Interface( ) ifc.interface_name = '"Loopback10"' ifc.state = YFilter.read lview.interfaces.interface.append(ifc) ifc_oper_data = crud.read(provider, ifc_oper_filter) if ifc_oper_data is not None: print('INTERFACE OPERATIONAL DATA:') print_entity(ifc_oper_data, root)
def test_crud_read_collection(self): crud = CRUDService() # Build configuration of multiple objects create_list = Config() native = ysanity.Native() native.hostname = 'NativeHost' native.version = '0.1.0' create_list.append(native) bgp = openconfig.Bgp() bgp.global_.config.as_ = 65001 bgp.global_.config.router_id = "1.2.3.4" create_list.append(bgp) create_list = Config([native, bgp]) # Configure device result = crud.create(self.ncc, create_list) self.assertEqual(result, True) # Read configuration read_filter = Filter([ysanity.Native(), openconfig.Bgp()]) read_config = crud.read(self.ncc, read_filter) self.assertEqual(isinstance(read_config, Config), True) self.assertEqual(len(read_config), 2) # Print configuration codec_service = CodecService() codec_provider = CodecServiceProvider() codec_provider.encoding = EncodingFormat.XML for entity in read_config: xml = codec_service.encode(codec_provider, entity) print('\n===== Printing entity: {}'.format(entity)) print(xml) # Delete configuration result = crud.delete(self.ncc, create_list) self.assertEqual(result, True)
def test_crud_delete_container(self): # Build loopback configuration address = Native.Interface.Loopback.Ipv4.Address() address.ip = "2.2.2.2" address.netmask = "255.255.255.255" loopback = Native.Interface.Loopback() loopback.name = 2222 loopback.ipv4.address.append(address) native = Native() native.interface.loopback.append(loopback) crud = CRUDService() result = crud.create(self.ncc, native) self.assertTrue(result) # Read ipv4 configuration native = Native() loopback = Native.Interface.Loopback() loopback.name = 2222 native.interface.loopback.append(loopback) ipv4_config = crud.read(self.ncc, loopback.ipv4) self.assertIsNotNone(ipv4_config) self.assertEqual(ipv4_config.address['2.2.2.2'].netmask, "255.255.255.255") # Remove ipv4 configuration native = Native() loopback = Native.Interface.Loopback() loopback.name = 2222 native.interface.loopback.append(loopback) result = crud.delete(self.ncc, loopback.ipv4) self.assertTrue(result) # Delete configuration native = Native() result = crud.delete(self.ncc, native) self.assertEqual(result, True)
def getVlansInUse(device,interface): """ Get an array of vlans for a device and interface. TODO: Expand into mult-endpoint support and incorporate different devices. Clean up error conditions. Change asr device argument key to me asrCiscoModel like others. Author: David J. Stern Date: DEC 2017 Parameters: device: (str): device type identifier being used. device = "asr" to use Vendor model interface: (str): vendor name for interface/sub interface. Returns: vlans: (int[]): Array of Virtual Local Area Network (VLAN) numbers Error: (YPYError): Prints error to console. May return [] or partial [] on error. """ vlans=[] if device=="asr": provider = NetconfServiceProvider(address=currentEdgeDeviceInfo['IPv4'],port=,username=currentEdgeDeviceInfo['username'],password=currentEdgeDeviceInfo['password'],protocol="ssh") crud = CRUDService() interfaces_filter = l2_io.Nodes() try: respNodes = crud.read(provider, interfaces_filter) for node in respNodes.node: vlans.append(getVlansByInterface(node,interface)) except YPYError: print('An error occurred reading interfaces.') return vlans
def main(): module = AnsibleModule( argument_spec = dict( host = dict(required=True), username = dict(required=False, default=None), password = dict(required=False, default=None), ), supports_check_mode = False ) args = module.params # establish ssh connection provider = NetconfServiceProvider(address=args['host'], port=830, username=args['username'], password=args['password'], protocol='ssh') # establish CRUD service crud = CRUDService() # retrieve software install version install = SoftwareInstall() info = crud.read(provider, install) result = dict(changed=False) result['stdout'] = "no active package" for package in info.active.active_package_info: result['stdout'] = \ "active_packages: %sboot_partition_name: %s\nlocation: %s\n" \ "node_type: %s\nnumber_of_active_packages: %d" % \ (package.active_packages, package.boot_partition_name, package.location, package.node_type, package.number_of_active_packages) return module.exit_json(**result)
def test_sanity_crud_read_interface(self): enable_logging(logging.ERROR) address = ysanity.Native.Interface.Loopback.Ipv4.Address(); address.ip = "2.2.2.2" address.netmask = "255.255.255.255" loopback = ysanity.Native.Interface.Loopback() loopback.name = 2222 loopback.ipv4.address.append(address) native = ysanity.Native() native.interface.loopback.append(loopback) crud = CRUDService() result = crud.create(self.ncc, native) native_read = ysanity.Native() interfaces = crud.read(self.ncc, native_read) codec_service = CodecService() codec_provider = CodecServiceProvider() codec_provider.encoding = EncodingFormat.XML xml_encode = codec_service.encode(codec_provider, interfaces)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider( address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) print '\nIn method', self._testMethodName + ':' def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def test_delete_object_on_leaf(self): # create runner with two leaves, one and two runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # use DELETE object to remove leaf one runner_delete = runner_read runner_delete.one.name = DELETE() self.crud.update(self.ncc, runner_delete) # manually create remaining runner with leaf two runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.one.name = None self.assertEqual(is_equal(runner_read, runner_left), True) @unittest.skip('DELETE object for leaf-list') def test_delete_object_on_leaflist(self): # create runner with a leaf and a leaflist runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.ytypes.built_in_t.llstring = [str(i) for i in range(5)] self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # user DELETE object to remove leaflist runner_delete = runner_read runner_delete.ytypes.built_in_t.llstring = DELETE() self.crud.update(self.ncc, runner_delete) # manually create remaining runner with leaf one runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create del runner_left.ytypes.built_in_t.llstring[:] self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_container(self): # create runner with a container runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # delete contianer two self.crud.delete(self.ncc, runner_read.two) runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.two.name = None self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list(self): # create runner with a container and a list runner_create = ysanity.Runner() runner_create.one.name = 'one' elem1 = ysanity.Runner.OneList.Ldata() elem2 = ysanity.Runner.OneList.Ldata() elem1.number = 1 elem2.name = 'foo' elem2.number = 1 elem2.name = 'bar' runner_create.one_list.ldata.extend([elem1, elem2]) self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) self.crud.delete(self.ncc, runner_read.one_list.ldata) runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create del runner_left.one_list.ldata[:] self.assertEqual(is_equal(runner_read, runner_left), True)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider( address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) print '\nIn method', self._testMethodName + ':' def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) # TODO: crud read or READ object? def test_read_on_ref_class(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2.one = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_on_leaf(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2.one.number = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # this will also read r_2.one.name, not able to read only one of them r_2 = ysanity.Runner() r_2.one.number = 1 r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # no such value, will return empty data r_2 = ysanity.Runner() r_2.one.number = 2 r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(r_2.one.number, r_1.one.number) def test_read_on_ref_enum_class(self): from ydk.models.ydktest.ydktest_sanity import YdkEnumTestEnum r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.enum_value = YdkEnumTestEnum.LOCAL self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.LOCAL r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # no such value, nothing returned r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.REMOTE r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, r_2), True) # TODO: crud read or READ object? def test_read_on_ref_list(self): r_1 = ysanity.Runner.OneList() l_1, l_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.OneList() r_2.ldata = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # crud read def test_read_on_list_with_key(self): r_1 = ysanity.Runner.OneList() l_1, l_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.OneList() r_2.ldata.extend([l_1]) r_2 = self.crud.read(self.ncc, r_2) r_3 = ysanity.Runner.OneList() r_3.ldata.extend([l_1]) self.assertEqual(is_equal(r_2, r_3), True) # crud read def test_read_on_leaflist(self): r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.llstring.extend(['1', '2', '3']) self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.llstring.extend(['1', '2', '3']) runner_read = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, runner_read), True) r_2 = ysanity.Runner.Ytypes.BuiltInT() # invalid input, user should use READ() # or the same data on device r_2.llstring.extend(['something else']) runner_read = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, runner_read), True) def test_read_on_identity_ref(self): r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.identity_ref_value = ysanity.ChildIdentity_Identity() self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.identity_ref_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.identity_ref_value = ysanity.ChildIdentity_Identity() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_only_config(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2, r_3 = ysanity.Runner(), ysanity.Runner() r_2.one.number, r_3.one.number = READ(), READ() r_2 = self.crud.read(self.ncc, r_2, only_config=True) r_3 = self.crud.read(self.ncc, r_3) # ysanity only have config data, ok to compare self.assertEqual(is_equal(r_2, r_3), True) def test_decoder(self): # send payload to device runner = ysanity.Runner() element = ysanity.Runner.OneList.Ldata() element.number = 5 element.name = 'five' runner.one_list.ldata.append(element) self.crud.create(self.ncc, runner) self.crud.read(self.ncc, ysanity.Runner.OneList.Ldata())
args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() system_time = xr_shellutil_oper.SystemTime() # create object # read data from NETCONF device system_time = crud.read(provider, system_time) print(process_system_time(system_time)) # process object data exit() # End of script
def read_policy(service: CRUDService, provider: NetconfServiceProvider): sr_config_mapping = sr_config.Sr() sr_config_mapping = service.read(provider, sr_config_mapping) return sr_config_mapping
for device in netmodel.FullNodelist: # Instantiate an Multicast Configuration opject multicastobject = Empty() multicastobject = Cisco_IOS_XE_native.Native() loopbackobject = Empty() loopbackobject = Cisco_IOS_XE_native.Native() readintobject = Cisco_IOS_XE_native.Native.Interface() l3intlist = [] # Create Connection parameters connection = NetconfServiceProvider(address=device.mgmtip, port=device.netconfport, username=device.username, password=device.password) # Read Interface YANG Model nativereaddata = crud.read(connection, readintobject) provider = CodecServiceProvider(type="xml") codec = CodecService() xmls = codec.encode(provider, nativereaddata) # Convert Read Interface Data to Dictionary and parse for L3 Interface List returneddict = xmltodict.parse(xmls) xmllist = list(returneddict['interface'].keys()) xmlmoddedlist = xmllist[1:] # Interate over Interfaces to create a list of L3 interfaces rawl3intlist = [ inttype.capitalize() + intlist['name'] if type(intlist) is OrderedDict else inttype.capitalize() + returneddict['interface'][inttype]['name'] if intlist == 'name' else None for inttype in xmlmoddedlist for intlist in returneddict['interface'][inttype]
device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create gNMI provider repository = Repository(YDK_REPO_DIR+device.hostname) provider = gNMIServiceProvider(repo=repository, address=device.hostname, port=device.port, username=device.username, password=device.password) # create CRUD service crud = CRUDService() locale = xr_infra_infra_locale_cfg.Locale() # create object # read data from gNMI device locale = crud.read(provider, locale) print(process_locale(locale)) # process object data exit() # End of script
class YDKTarget: def __init__(self, host=None, username=None, password=None, port=NETCONF_PORT): self._address = host self._port = port self._username = username self._password = password self._provider = None self._crudService = CRUDService() # Just in case an error occurs somewhere in the YDK API. It will mess with # Ansible, but at least there's a chance of seeing what happened @staticmethod def _setupLogging(): logger = logging.getLogger('ydk') # logger.setLevel(logging.DEBUG) logger.setLevel(logging.ERROR) handler = logging.StreamHandler() formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) def checkParams(self): if self._address is None: return YDKTargetParamError(True, 'missing host parameter') if self._username is None: return YDKTargetParamError(True, 'missing username parameter') if self._password is None: return YDKTargetParamError(True, 'missing password parameter') return YDKTargetParamError(False, 'ok') def info(self): return [self._address, self._port, self._username, self._password] def connect(self): self._setupLogging() self._provider = NetconfServiceProvider(address=self._address, port=self._port, username=self._username, password=self._password) def close(self): self._provider.close() def create(self, config): return self._crudService.create(self._provider, config) def read(self, filterSpec): return self._crudService.read(self._provider, filterSpec) def update(self, config): return self._crudService.update(self._provider, config) def delete(self, config): return self._crudService.delete(self._provider, config) def getCapabilities(self): return self._provider._get_capabilities() def validateModelCapability(self, modelName): pattern = re.compile(modelName + '\?') capabilities = self._provider._get_capabilities() for capability in capabilities: if pattern.match(capability): return True return False
class SanityYang(unittest.TestCase): PROVIDER_TYPE = "non-native" @classmethod def setUpClass(self): if SanityYang.PROVIDER_TYPE == "native": self.ncc = NativeNetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) else: self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): runner = Runner() self.crud.delete(self.ncc, runner) self.ncc.close() def setUp(self): runner = Runner() self.crud.delete(self.ncc, runner) def test_read_on_ref_class(self): r_1 = Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = Runner() r_2.one = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_on_leaf(self): r_1 = Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = Runner() r_2.one.number = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # this will also read r_2.one.name, not able to read only one of them r_2 = Runner() r_2.one.number = 1 r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # no such value, will return empty data r_2 = Runner() r_2.one.number = 2 r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(r_2.one.number, r_1.one.number) def test_read_on_ref_enum_class(self): r_1 = Runner.Ytypes.BuiltInT() r_1.enum_value = YdkEnumTestEnum.local self.crud.create(self.ncc, r_1) r_2 = Runner.Ytypes.BuiltInT() r_2.enum_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.local r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # no such value, nothing returned r_2 = Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.remote r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, r_2), True) def test_read_on_ref_list(self): r_1 = Runner.OneList() l_1, l_2 = Runner.OneList.Ldata(), Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = Runner.OneList() r_2.ldata = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_on_list_with_key(self): r_1 = Runner.OneList() l_1, l_2 = Runner.OneList.Ldata(), Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = Runner.OneList() r_2.ldata.extend([l_1]) r_2 = self.crud.read(self.ncc, r_2) r_3 = Runner.OneList() r_3.ldata.extend([l_1]) self.assertEqual(is_equal(r_2, r_3), True) def test_read_on_leaflist(self): r_1 = Runner.Ytypes.BuiltInT() r_1.llstring.extend(['1', '2', '3']) self.crud.create(self.ncc, r_1) r_2 = Runner.Ytypes.BuiltInT() r_2.llstring.extend(['1', '2', '3']) runner_read = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, runner_read), True) r_2 = Runner.Ytypes.BuiltInT() # invalid input, user should use READ() # or the same data on device r_2.llstring.extend(['something else']) runner_read = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, runner_read), True) def test_read_on_identity_ref(self): r_1 = Runner.Ytypes.BuiltInT() r_1.identity_ref_value = ChildIdentityIdentity() self.crud.create(self.ncc, r_1) r_2 = Runner.Ytypes.BuiltInT() r_2.identity_ref_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = Runner.Ytypes.BuiltInT() r_2.identity_ref_value = ChildIdentityIdentity() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_only_config(self): r_1 = Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2, r_3 = Runner(), Runner() r_2.one.number, r_3.one.number = READ(), READ() r_2 = self.crud.read(self.ncc, r_2, only_config=True) r_3 = self.crud.read(self.ncc, r_3) # ysanity only have config data, ok to compare self.assertEqual(is_equal(r_2, r_3), True) def test_decoder(self): # send payload to device runner = Runner() element = Runner.OneList.Ldata() element.number = 5 element.name = 'five' runner.one_list.ldata.append(element) self.crud.create(self.ncc, runner) self.crud.read(self.ncc, Runner.OneList.Ldata()) def test_replace_on_leaf(self): one = Runner.One() one.number, one.name = 1, 'runner-one-name' self.crud.create(self.ncc, one) filter = Runner.One() filter.number = READ() r = self.crud.read(self.ncc, filter) self.assertEqual(r.number, one.number) # Replace leaf value and verify one = Runner.One() one.name = REPLACE('runner_one_name') one.number = MERGE(2) self.crud.update(self.ncc, one) filter = Runner.One() filter.name = READ() filter.number = READ() r = self.crud.read(self.ncc, filter) self.assertEqual(r.name, 'runner_one_name') self.assertEqual(r.number, 2) one = Runner.One() one.number = REMOVE() self.crud.update(self.ncc, one) one.number = CREATE(3) self.crud.update(self.ncc, one) r = self.crud.read(self.ncc, Runner.One()) self.assertEqual(r.name, 'runner_one_name') self.assertEqual(r.number, 3) def test_replace_on_enum(self): # Create and verify btc = Runner.Ytypes.BuiltInT() btc.enum_value = YdkEnumTestEnum.local self.crud.create(self.ncc, btc) filter = Runner.Ytypes.BuiltInT() filter.enum_value = READ() r = self.crud.read(self.ncc, filter) self.assertTrue(is_equal(r, btc)) # Replace and Verify btr = Runner.Ytypes.BuiltInT() btr.enum_value = REPLACE(YdkEnumTestEnum.remote) self.crud.update(self.ncc, btr) r = self.crud.read(self.ncc, filter) self.assertEqual(r.enum_value, YdkEnumTestEnum.remote) def test_create_identity_ref(self): # Create and Verify btc = Runner.Ytypes.BuiltInT() btc.identity_ref_value = CREATE(ChildIdentityIdentity()) self.crud.update(self.ncc, btc) filter = Runner.Ytypes.BuiltInT() filter.identity_ref_value = READ() r = self.crud.read(self.ncc, filter) self.assertTrue(is_equal(r.identity_ref_value, ChildIdentityIdentity())) def test_replace_on_list(self): one_list = Runner.OneList() ld1, ld2 = Runner.OneList.Ldata(), Runner.OneList.Ldata() ld1.number, ld2.number = 1, 2 one_list.ldata.extend([ld1, ld2]) self.crud.create(self.ncc, one_list) filter = Runner.OneList.Ldata() filter.number = 2 r = self.crud.read(self.ncc, filter) self.assertTrue(is_equal(r, ld2)) # Merge and Verify one_merge = Runner.OneList() ld3 = Runner.OneList.Ldata() ld3.number = 3 one_merge.ldata.append(ld3) one_merge.yfilter = MERGE() self.crud.update(self.ncc, one_merge) r = self.crud.read(self.ncc, Runner.OneList()) self.assertEqual(len(r.ldata), 3) # Replace and Verify replace = Runner.OneList() replace.ldata.append(ld3) replace.yfilter = REPLACE() self.crud.update(self.ncc, replace) r = self.crud.read(self.ncc, Runner.OneList()) self.assertEqual(len(r.ldata), 1) def test_replace_on_container(self): one = Runner.One() one.number, one.name = 1, 'runner-one-name' self.crud.create(self.ncc, one) filter = Runner.One() r = self.crud.read(self.ncc, filter) self.assertEqual(one.number, r.number) # Replace container value and verify one.yfilter = REPLACE() one.name = 'runner_one_name' one.number = 2 self.crud.update(self.ncc, one) r = self.crud.read(self.ncc, filter) self.assertEqual(r.name, 'runner_one_name') self.assertEqual(r.number, 2) one.yfilter = REMOVE() self.crud.update(self.ncc, one) r = self.crud.read(self.ncc, Runner.One()) self.assertIsNone(r.name) self.assertIsNone(r.number)
class SanityGnmiCrud(unittest.TestCase): @classmethod def setUpClass(self): self.codec_provider = CodecServiceProvider() self.codec = CodecService() self.repo = Repository(get_local_repo_dir()) self.provider = gNMIServiceProvider( self.repo, "127.0.0.1", 50051, "admin", "admin") self.schema = self.provider.get_session().get_root_schema() self.crud = CRUDService() def test_gnmi_crud_all_operations(self): # Configure interface lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.name = 'Loopback10' # Configure BGP bgp_global_config = openconfig_bgp.Bgp.Global.Config() bgp_global_config.as_ = 65172 neighbor = openconfig_bgp.Bgp.Neighbors.Neighbor() neighbor.neighbor_address = '172.16.255.2' neighbor.config.neighbor_address = '172.16.255.2' neighbor.config.peer_as = 65172 res = self.crud.create(self.provider, [lo10, bgp_global_config, neighbor]) # Update configuration lo10.config.description = 'Test' res = self.crud.update(self.provider, lo10) self.assertTrue(res) # Read all read_list = self.crud.read(self.provider, [openconfig_interfaces.Interfaces(), openconfig_bgp.Bgp()]) # Read config ifc_filter = openconfig_interfaces.Interfaces.Interface() ifc_filter.name = 'Loopback10' bgp_neighbor_filter = openconfig_bgp.Bgp.Neighbors.Neighbor() bgp_neighbor_filter.neighbor_address = '172.16.255.2' read_list = self.crud.read_config(self.provider, [ifc_filter, bgp_neighbor_filter]) self.assertIsNotNone(read_list) self.assertEqual(isinstance(read_list, list), True) self.assertEqual(len(read_list), 2) #for entity in read_list: # print_entity(entity, self.schema) # Read single container lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config = YFilter.read ifc_config = self.crud.read(self.provider, lo10) #print_entity(ifc_config, self.schema) expected = '''<interface> <name>Loopback10</name> <config> <name>Loopback10</name> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(ifc_config, self.schema), expected) # Read single leaf ifcs = openconfig_interfaces.Interfaces() lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.description = YFilter.read ifcs.interface.append(lo10) read_descr = self.crud.read(self.provider, lo10) #print_entity(read_descr, self.schema) expected = '''<interface> <name>Loopback10</name> <config> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(read_descr, self.schema), expected) # Delete configuration ifc = openconfig_interfaces.Interfaces.Interface() ifc.name = 'Loopback10' bgp = openconfig_bgp.Bgp() res = self.crud.delete(self.provider, [ifc, bgp])
device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() reboot_history = xr_linux_os_reboot_history_oper.RebootHistory() # create object # read data from NETCONF device reboot_history = crud.read(provider, reboot_history) print(process_reboot_history(reboot_history)) # process object data provider.close() exit() # End of script
args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() # create oper object reboot_history = xr_linux_os_reboot_history_oper.RebootHistory() reboot_history = crud.read(provider, reboot_history) # read from device print(process_reboot_history(reboot_history)) # process object data provider.close() exit() # End of script
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider( address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) print '\nIn method', self._testMethodName + ':' def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def read_from_empty_filter(self): empty_runner = ysanity.Runner() return self.crud.read(self.ncc, empty_runner) def get_nested_object(self): # return nested object with selected list elements runner_create = ysanity.Runner() e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_1.name = 'runner:inbtwlist:['+str(e_1.number)+']:name' e_1.subc.number = 111 e_1.subc.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:name' e_2.number = 12 e_2.name = 'runner:inbtwlist:['+str(e_2.number)+']:name' e_2.subc.number = 121 e_2.subc.name = 'runner:inbtwlist:['+str(e_2.number)+']:name' e_11 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_11.number = 111 e_11.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:subcsubl1['+str(e_11.number)+']:name' e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12.number = 112 e_12.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:subcsubl1['+str(e_12.number)+']:name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 121 e_21.name = 'runner:inbtwlist:['+str(e_2.number)+']:subc:subcsubl1['+str(e_21.number)+']:name' e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22.number = 122 e_22.name = 'runner:inbtwlist:['+str(e_2.number)+']:subc:subcsubl1['+str(e_22.number)+']:name' e_2.subc.subc_subl1.extend([e_21, e_22]) runner_create.inbtw_list.ldata.extend([e_1, e_2]) return runner_create, e_2, e_22 def test_delete_object_on_leaf(self): # create runner with two leaves, one and two runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # use DELETE object to remove leaf one runner_delete = runner_read runner_delete.one.name = DELETE() self.crud.update(self.ncc, runner_delete) # manually create remaining runner with leaf two runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.one.name = None self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_on_leaflist_slice(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.ytypes.built_in_t.llstring.extend([str(i) for i in range(5)]) self.crud.create(self.ncc, runner_create) elements_to_delete = runner_create.ytypes.built_in_t.llstring[0:2] self.crud.delete(self.ncc, elements_to_delete) runner_read = self.read_from_empty_filter() runner_left = runner_create del runner_left.ytypes.built_in_t.llstring[0:2] self.assertEqual(is_equal(runner_read, runner_create), True) def test_delete_on_leaflist(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.ytypes.built_in_t.llstring.extend([str(i) for i in range(5)]) self.crud.create(self.ncc, runner_create) self.crud.delete(self.ncc, runner_create.ytypes.built_in_t.llstring[3]) runner_read = self.read_from_empty_filter() runner_left = runner_create del runner_left.ytypes.built_in_t.llstring[3] self.assertEqual(is_equal(runner_read, runner_create), True) def test_delete_operation_on_container(self): # create runner with a container runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # delete contianer two self.crud.delete(self.ncc, runner_read.two) runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.two.name = None self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_nested_list(self): runner_create, _, e_22 = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.inbtw_list.ldata[1].subc.subc_subl1) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object del runner_left.inbtw_list.ldata[1].subc.subc_subl1[:] self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_nested_list_with_key(self): runner_create, _, e_22 = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.inbtw_list.ldata[1].subc.subc_subl1[1]) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object runner_left.inbtw_list.ldata[1].subc.subc_subl1.remove(e_22) self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list_with_key(self): runner_create, e_2, _ = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.inbtw_list.ldata[1]) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object runner_left.inbtw_list.ldata.remove(e_2) self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list_slice(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' foo = ysanity.Runner.OneList.Ldata() bar = ysanity.Runner.OneList.Ldata() baz = ysanity.Runner.OneList.Ldata() foo.number = 1 foo.name = 'foo' bar.number = 2 bar.name = 'bar' baz.number = 3 baz.name = 'baz' runner_create.one_list.ldata.extend([foo, bar, baz]) self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() elements_to_delete = runner_read.one_list.ldata[:1] self.crud.delete(self.ncc, elements_to_delete) # read after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete entire list del runner_left.one_list.ldata[:1] self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' foo = ysanity.Runner.OneList.Ldata() bar = ysanity.Runner.OneList.Ldata() foo.number = 1 foo.name = 'foo' bar.number = 2 bar.name = 'bar' runner_create.one_list.ldata.extend([foo, bar]) self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.one_list.ldata) # read after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete entire list del runner_left.one_list.ldata[:] self.assertEqual(is_equal(runner_read, runner_left), True)
from ydk.services import CRUDService from ydk.providers import NetconfServiceProvider from ydk.models.cisco_ios_xr.Cisco_IOS_XR_ifmgr_cfg import InterfaceConfigurations if __name__ == "__main__": # create NETCONF session provider = NetconfServiceProvider(address="11.1.1.3", port=830, username="******", password="******", protocol="ssh") # create CRUD service crud = CRUDService() # create interface config object interfacesDef = InterfaceConfigurations() # read system time from device interfaces = crud.read(provider, interfacesDef) for interfaceConfig in interfaces.interface_configuration: if interfaceConfig.interface_name == "GigabitEthernet0/0/0/0": interfaceConfig.description = "Changed from YDK" break if crud.update(provider, interfaces): print "Changed!" exit()
log.setLevel(level) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - %(levelname)s - %(message)s")) handler.setFormatter(formatter) log.addHandler(handler) if __name__ == "__main__": """Main execution path""" enable_logging(logging.INFO) # create NETCONF session provider = NetconfServiceProvider(address="domingo", port=None, username="******", password="******") # create CRUD service crud = CRUDService() # create system time object system_time = xr_shellutil_oper.SystemTime() # read system time from device system_time = crud.read(provider, system_time) # print system uptime print("\nSystem '%s' uptime is "%system_time.uptime.host_name + str(timedelta(seconds=system_time.uptime.uptime))) exit()
class SanityGnmiCrud(unittest.TestCase): @classmethod def setUpClass(self): self.codec_provider = CodecServiceProvider() self.codec = CodecService() self.repo = Repository(get_local_repo_dir()) self.provider = gNMIServiceProvider( self.repo, "127.0.0.1", "admin", "admin", port=50051) self.schema = self.provider.get_session().get_root_schema() self.crud = CRUDService() def test_gnmi_crud_all_operations(self): # Configure interface lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.name = 'Loopback10' # Configure BGP bgp_global_config = openconfig_bgp.Bgp.Global.Config() bgp_global_config.as_ = 65172 neighbor = openconfig_bgp.Bgp.Neighbors.Neighbor() neighbor.neighbor_address = '172.16.255.2' neighbor.config.neighbor_address = '172.16.255.2' neighbor.config.peer_as = 65172 res = self.crud.create(self.provider, [lo10, bgp_global_config, neighbor]) # Update configuration lo10.config.description = 'Test' res = self.crud.update(self.provider, lo10) self.assertTrue(res) # Read all read_list = self.crud.read(self.provider, [openconfig_interfaces.Interfaces(), openconfig_bgp.Bgp()]) # Read config ifc_filter = openconfig_interfaces.Interfaces.Interface() ifc_filter.name = 'Loopback10' bgp_neighbor_filter = openconfig_bgp.Bgp.Neighbors.Neighbor() bgp_neighbor_filter.neighbor_address = '172.16.255.2' read_list = self.crud.read_config(self.provider, [ifc_filter, bgp_neighbor_filter]) self.assertIsNotNone(read_list) self.assertEqual(isinstance(read_list, list), True) self.assertEqual(len(read_list), 2) #for entity in read_list: # print_entity(entity, self.schema) # Read single container lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config = YFilter.read ifc_config = self.crud.read(self.provider, lo10) #print_entity(ifc_config, self.schema) expected = '''<interface> <name>Loopback10</name> <config> <name>Loopback10</name> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(ifc_config, self.schema), expected) # Read single leaf ifcs = openconfig_interfaces.Interfaces() lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.description = YFilter.read ifcs.interface.append(lo10) read_descr = self.crud.read(self.provider, lo10) #print_entity(read_descr, self.schema) expected = '''<interface> <name>Loopback10</name> <config> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(read_descr, self.schema), expected) # Delete configuration ifc = openconfig_interfaces.Interfaces.Interface() ifc.name = 'Loopback10' bgp = openconfig_bgp.Bgp() res = self.crud.delete(self.provider, [ifc, bgp]) def test_gnmi_crud_with_no_validation(self): # Configure interface ifc_config = openconfig_interfaces.Interfaces() lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.name = 'Loopback10' lo10.ignore_validation = True ifc_config.interface.append(lo10) # Configure BGP bgp_config = openconfig_bgp.Bgp() bgp_config.global_.config.as_ = 65172 bgp_config.ignore_validation = True neighbor = openconfig_bgp.Bgp.Neighbors.Neighbor() neighbor.neighbor_address = '172.16.255.2' neighbor.config.neighbor_address = '172.16.255.2' neighbor.config.peer_as = 65172 bgp_config.neighbors.neighbor.append(neighbor) res = self.crud.create(self.provider, [lo10, bgp_config]) # Update configuration lo10.config.description = 'Test' res = self.crud.update(self.provider, lo10) self.assertTrue(res) # Read config ifc_filter = openconfig_interfaces.Interfaces() ifc = openconfig_interfaces.Interfaces.Interface() ifc.name = 'Loopback10' ifc.ignore_validation = True ifc_filter.interface.append(ifc) bgp_filter = openconfig_bgp.Bgp() bgp_neighbor_filter = openconfig_bgp.Bgp.Neighbors.Neighbor() bgp_neighbor_filter.neighbor_address = '172.16.255.2' bgp_neighbor_filter.ignore_validation = True bgp_filter.neighbors.neighbor.append(bgp_neighbor_filter) read_list = self.crud.read_config(self.provider, [ifc, bgp_neighbor_filter]) self.assertIsNotNone(read_list) self.assertEqual(isinstance(read_list, list), True) self.assertEqual(len(read_list), 2) # Read single container ifc_filter = openconfig_interfaces.Interfaces() lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config = YFilter.read lo10.ignore_validation = True ifc_filter.interface.append(lo10) ifc_read = self.crud.read(self.provider, lo10) expected = '''<interface> <name>Loopback10</name> <config> <name>Loopback10</name> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(ifc_read, self.schema), expected) # Read single leaf ifcs = openconfig_interfaces.Interfaces() lo10 = openconfig_interfaces.Interfaces.Interface() lo10.name = 'Loopback10' lo10.config.description = YFilter.read ifcs.interface.append(lo10) ifcs.ignore_validation = True read_descr = self.crud.read(self.provider, lo10) expected = '''<interface> <name>Loopback10</name> <config> <description>Test</description> </config> </interface> ''' self.assertEqual( entity_to_string(read_descr, self.schema), expected) # Delete configuration ifc = openconfig_interfaces.Interfaces.Interface() ifc.name = 'Loopback10' bgp = openconfig_bgp.Bgp() res = self.crud.delete(self.provider, [ifc, bgp])
device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() locale = xr_infra_infra_locale_cfg.Locale() # create object # read data from NETCONF device locale = crud.read(provider, locale) print(process_locale(locale)) # process object data provider.close() exit() # End of script
help="NETCONF device (ssh://user:password@host:port)") args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() locale = xr_infra_infra_locale_cfg.Locale() # create config object locale = crud.read(provider, locale) # read object from NETCONF device print(process_locale(locale)) # process object data provider.close() exit() # End of script
class SanityTest(unittest.TestCase): PROVIDER_TYPE = "non-native" @classmethod def setUpClass(self): if SanityTest.PROVIDER_TYPE == "native": self.ncc = NativeNetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) else: self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): pass def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def _create_runner(self): runner = ysanity.Runner() runner.ytypes = runner.Ytypes() runner.ytypes.built_in_t = runner.ytypes.BuiltInT() return runner # changed to type int16 def test_int8(self): runner = self._create_runner() runner.ytypes.built_in_t.number8 = 126 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type int32 def test_int16(self): runner = self._create_runner() runner.ytypes.built_in_t.number16 = 20000 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type int64 def test_int32(self): runner = self._create_runner() runner.ytypes.built_in_t.number32 = -9223372036854775808 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint8 def test_int64(self): runner = self._create_runner() runner.ytypes.built_in_t.number64 = -9223372036854775808 self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner) # changed to type uint16 def test_uint8(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number8 = 256 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint32 def test_uint16(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number16 = 65536 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint64 def test_uint32(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number32 = 18446744073709551615 self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type string def test_decimal64(self): runner = self._create_runner() runner.ytypes.built_in_t.deci64 = 'string' self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to tye decimal64 def test_leafref(self): runner = self._create_runner() runner.ytypes.built_in_t.leaf_ref = Decimal64('3.14') self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type empty def test_string(self): runner = self._create_runner() runner.ytypes.built_in_t.name = Empty() self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type YdkEnumTestEnum def test_boolean(self): runner = self._create_runner() runner.ytypes.built_in_t.bool_value = YdkEnumTestEnum.NONE self.crud.create(self.ncc, runner) runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) result = is_equal(runner, runner1) self.assertEqual(result, True) runner = self._create_runner() runner.ytypes.built_in_t.bool_value = False self.assertRaises(YPYModelError, self.crud.update, self.ncc, runner) # max val changed to 7 def test_leaflist_max_elements(self): runner = self._create_runner() runner.ytypes.built_in_t.llstring.extend([str(i) for i in range(8)]) self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner) # not supported leaf def test_not_supported_leaf(self): runner = self._create_runner() runner.not_supported_1.not_supported_leaf = 'leaf value' self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner) # not supported container def test_not_supported_container(self): runner = self._create_runner() runner.not_supported_1.not_supported_1_2.some_leaf = 'some leaf' self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner) # not supported list def test_not_supported_list(self): runner = self._create_runner() elems = [] for i in range(5): elems.append(runner.NotSupported2()) runner.not_supported_2.extend(elems) self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner) # Will only test max-elements. If min-elements is set, then this # constraint is required for every READ/UPDATE operation. So it will fail all other cases. def test_leaflist_max_elements(self): runner = self._create_runner() runner.ytypes.built_in_t.llstring.extend([str(i) for i in range(20)]) self.assertRaises(YPYModelError, self.crud.create, self.ncc, runner)
class SanityYang(unittest.TestCase): PROVIDER_TYPE = "non-native" @classmethod def setUpClass(self): if SanityYang.PROVIDER_TYPE == "native": self.ncc = NativeNetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) else: self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def read_from_empty_filter(self): empty_runner = ysanity.Runner() return self.crud.read(self.ncc, empty_runner) def get_nested_object(self): # return nested object with selected list elements runner_create = ysanity.Runner() e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_1.name = 'runner:inbtwlist:[11]:name' e_1.subc.number = 111 e_1.subc.name = 'runner:inbtwlist:[11]:subc:name' e_2.number = 12 e_2.name = 'runner:inbtwlist:[12]:name' e_2.subc.number = 121 e_2.subc.name = 'runner:inbtwlist:[12]:name' e_11 = e_1.subc.SubcSubl1() e_11.number = 111 e_11.name = 'runner:inbtwlist:[11]:subc:subcsubl1[111]:name' e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12.number = 112 e_12.name = 'runner:inbtwlist:[11]:subc:subcsubl1[112]:name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 121 e_21.name = 'runner:inbtwlist:[12]:subc:subcsubl1[121]:name' e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22.number = 122 e_22.name = 'runner:inbtwlist:[12]:subc:subcsubl1[122]:name' e_2.subc.subc_subl1.extend([e_21, e_22]) runner_create.inbtw_list.ldata.extend([e_1, e_2]) return runner_create, e_2, e_22 def test_delete_object_on_leaf(self): # create runner with two leaves, one and two runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # use DELETE object to remove leaf one runner_delete = runner_read runner_delete.one.name = DELETE() self.crud.update(self.ncc, runner_delete) # manually create remaining runner with leaf two runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.one.name = None self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_on_leaflist_slice(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.ytypes.built_in_t.llstring.extend( [str(i) for i in range(5)]) self.crud.create(self.ncc, runner_create) elements_to_delete = runner_create.ytypes.built_in_t.llstring[0:2] self.crud.delete(self.ncc, elements_to_delete) runner_read = self.read_from_empty_filter() runner_left = runner_create del runner_left.ytypes.built_in_t.llstring[0:2] self.assertEqual(is_equal(runner_read, runner_create), True) def test_delete_on_leaflist(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.ytypes.built_in_t.llstring.extend( [str(i) for i in range(5)]) self.crud.create(self.ncc, runner_create) self.crud.delete(self.ncc, runner_create.ytypes.built_in_t.llstring[3]) runner_read = self.read_from_empty_filter() runner_left = runner_create del runner_left.ytypes.built_in_t.llstring[3] self.assertEqual(is_equal(runner_read, runner_create), True) def test_delete_on_list_with_identitykey(self): runner = ysanity.Runner() a1 = ysanity.Runner.OneList.IdentityList() a1.config.id = ysanity.ChildIdentityIdentity() a1.id_ref = a1.config.id runner.one_list.identity_list.extend([a1]) self.crud.create(self.ncc, runner) empty_runner = ysanity.Runner() runner_read = self.crud.read(self.ncc, empty_runner) self.crud.delete(self.ncc, runner_read.one_list.identity_list) runner_read = self.crud.read(self.ncc, empty_runner) self.assertEqual(len(runner_read.one_list.identity_list), 0) def test_delete_operation_on_container(self): # create runner with a container runner_create = ysanity.Runner() runner_create.one.name = 'one' runner_create.two.name = 'two' self.crud.create(self.ncc, runner_create) runner_read_filter = ysanity.Runner() runner_read = self.crud.read(self.ncc, runner_read_filter) # delete contianer two self.crud.delete(self.ncc, runner_read.two) runner_read = self.crud.read(self.ncc, runner_read_filter) runner_left = runner_create runner_left.two.name = None self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_nested_list(self): runner_create, _, e_22 = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.inbtw_list.ldata[1].subc.subc_subl1) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object del runner_left.inbtw_list.ldata[1].subc.subc_subl1[:] self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_nested_list_with_key(self): runner_create, _, e_22 = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_create.inbtw_list.ldata[1].subc.subc_subl1[1]) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object runner_left.inbtw_list.ldata[1].subc.subc_subl1.remove(e_22) self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list_with_key(self): runner_create, e_2, _ = self.get_nested_object() self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.inbtw_list.ldata[1]) # get object after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete element e_2 in runner_create object runner_left.inbtw_list.ldata.remove(e_2) self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list_slice(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' foo = ysanity.Runner.OneList.Ldata() bar = ysanity.Runner.OneList.Ldata() baz = ysanity.Runner.OneList.Ldata() foo.number = 1 foo.name = 'foo' bar.number = 2 bar.name = 'bar' baz.number = 3 baz.name = 'baz' runner_create.one_list.ldata.extend([foo, bar, baz]) self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() elements_to_delete = runner_read.one_list.ldata[:1] self.crud.delete(self.ncc, elements_to_delete) # read after a crud delete operation runner_read = self.read_from_empty_filter() runner_left = runner_create # manually delete entire list del runner_left.one_list.ldata[:1] self.assertEqual(is_equal(runner_read, runner_left), True) def test_delete_operation_on_list(self): runner_create = ysanity.Runner() runner_create.one.name = 'one' foo = ysanity.Runner.OneList.Ldata() bar = ysanity.Runner.OneList.Ldata() foo.number = 1 foo.name = 'foo' bar.number = 2 bar.name = 'bar' runner_create.one_list.ldata.extend([foo, bar]) self.crud.create(self.ncc, runner_create) runner_read = self.read_from_empty_filter() self.crud.delete(self.ncc, runner_read.one_list.ldata) runner_read = self.read_from_empty_filter() runner_left = runner_create del runner_left.one_list.ldata[:] self.assertEqual(is_equal(runner_read, runner_left), True)
args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() host_names = xr_shellutil_cfg.HostNames() # create object # read data from NETCONF device host_names = crud.read(provider, host_names) print(process_host_names(host_names)) # process object data exit() # End of script
class SanityTest(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): print "\nIn method", self._testMethodName runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def _create_runner(self): runner = ysanity.Runner() runner.ytypes = runner.Ytypes() runner.ytypes.built_in_t = runner.ytypes.BuiltInT() return runner # def test_invalids(self): # runner = self._create_runner() # runner.ytypes.built_in_t.name = [] # runner.ytypes.built_in_t.u_number8 = -1 # runner.ytypes.built_in_t.enum_value = '' # self.crud.create(self.ncc, runner) # with self.assertRaises(YPYDataValidationError): # self.crud.create(self.ncc, runner) def test_int8(self): # Create Runner runner = self._create_runner() runner.ytypes.built_in_t.number8 = 0 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_int8_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.number8 = 8.5 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # invalid object is not equal # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_int16(self): runner = self._create_runner() runner.ytypes.built_in_t.number16 = 126 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_int16_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.number16 = {} # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_int32(self): runner = self._create_runner() runner.ytypes.built_in_t.number32 = 200000 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_int32_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.number32 = [] # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_bits(self): runner = self._create_runner() runner.ytypes.built_in_t.bits_value['disable-nagle'] = True self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) def test_int64(self): runner = self._create_runner() runner.ytypes.built_in_t.number64 = -9223372036854775808 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_int64_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.number64 = 9223372036854775808 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_uint8(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number8 = 0 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_uint8_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number8 = -1 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_uint16(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number16 = 65535 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_unint16_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number16 = 'not an uint' # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_uint32(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number32 = 5927 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_unint32_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number32 = 4294967296 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_decimal64(self): runner = self._create_runner() runner.ytypes.built_in_t.deci64 = Decimal64('3.14') self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('Revisit implementation') def test_uint64(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number64 = 18446744073709551615 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('skip till validation in place') def test_uint64_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number64 = 18446744073709551616 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_string(self): runner = self._create_runner() runner.ytypes.built_in_t.name = 'name_str' self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # but invalid input is sent to the device def test_string_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.name = ['name_str'] self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # self.crud.create(self.ncc, runner) # Read into Runner2 #runner1 = ysanity.Runner() #runner1 = self.crud.read(self.ncc, runner1) # Compare runners #result = is_equal(runner, runner1) #self.assertEqual(result, False) def test_empty(self): runner = self._create_runner() runner.ytypes.built_in_t.emptee = Empty() self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # explicit DELETE not support at the moment # runner1.ytypes.built_in_t.emptee = DELETE() # self.crud.update(self.ncc, runner1) # runner2 = self.crud.read(self.ncc, self._create_runner()) # self.assertEqual(runner2.ytypes.built_in_t.emptee, None) def test_empty_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.emptee = 0 # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # Read into Runner2 #runner1 = ysanity.Runner() # self.assertRaises(YPYDataValidationError, # self.crud.create, self.ncc, runner) #runner1 = self.crud.read(self.ncc, runner1) # Compare runners #result = is_equal(runner, runner1) #self.assertEqual(result, False) def test_boolean(self): runner = self._create_runner() runner.ytypes.built_in_t.bool_value = True self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) runner = self._create_runner() runner.ytypes.built_in_t.bool_value = False self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) @unittest.skip('boolean type will convert empty string to false') def test_boolean_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.bool_value = '' # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, True) def test_enum(self): runner = self._create_runner() runner.ytypes.built_in_t.enum_value = YdkEnumTest_Enum.NONE self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) def test_enum_invalid(self): runner = self._create_runner() runner.ytypes.built_in_t.enum_value = 'not an enum' # self.crud.create(self.ncc, runner) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # OLD # with self.assertRaises(YPYError) as e: # self.crud.create(self.ncc, runner) # # Read into Runner2 # runner1 = ysanity.Runner() # runner1 = self.crud.read(self.ncc, runner1) # # # Compare runners # result = is_equal(runner, runner1) # self.assertEqual(result, False) def test_union(self): runner = self._create_runner() runner.ytypes.built_in_t.younion = YdkEnumTest_Enum.NONE self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) def test_identityref(self): runner = self._create_runner() runner.ytypes.built_in_t.identity_ref_value = \ ysanity.ChildIdentity_Identity() self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # Will only test max-elements. If min-elements is set, then this # constraint is required for every READ/UPDATE operation. So it will fail all other cases. def test_leaflist_max_elements(self): runner = self._create_runner() runner.ytypes.built_in_t.llstring = [str(i) for i in range(30)] runner.ytypes.built_in_t.llstring.extend([None for i in range(20)]) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) def test_list_max_elements(self): runner = self._create_runner() elems = [] n = 10 for i in range(n): l = ysanity.Runner.OneList.Ldata() l.number = i l.name = str(i) elems.append(l) runner.one_list.ldata.extend(elems) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) print '\nIn method', self._testMethodName + ':' def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def test_read_on_ref_class(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2.one = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_on_leaf(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2.one.number = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # this will also read r_2.one.name, not able to read only one of them r_2 = ysanity.Runner() r_2.one.number = 1 r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2.one.number, r_1.one.number) # no such value, will return empty data r_2 = ysanity.Runner() r_2.one.number = 2 r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(r_2.one.number, r_1.one.number) def test_read_on_ref_enum_class(self): from ydk.models.ydktest.ydktest_sanity import YdkEnumTestEnum r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.enum_value = YdkEnumTestEnum.LOCAL self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.LOCAL r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # no such value, nothing returned r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.enum_value = YdkEnumTestEnum.REMOTE r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, r_2), True) def test_read_on_ref_list(self): r_1 = ysanity.Runner.OneList() l_1, l_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.OneList() r_2.ldata = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) def test_read_on_list_with_key(self): r_1 = ysanity.Runner.OneList() l_1, l_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() l_1.number, l_2.number = 1, 2 r_1.ldata.extend([l_1, l_2]) self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.OneList() r_2.ldata.extend([l_1]) r_2 = self.crud.read(self.ncc, r_2) r_3 = ysanity.Runner.OneList() r_3.ldata.extend([l_1]) self.assertEqual(is_equal(r_2, r_3), True) def test_read_on_leaflist(self): r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.llstring = ['1', '2', '3'] self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.llstring = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) r_2 = ysanity.Runner.Ytypes.BuiltInT() # invalid input, user should use READ() # or the same data on device r_2.llstring = ['something emaillse'] r_2 = self.crud.read(self.ncc, r_2) self.assertNotEqual(is_equal(r_1, r_2), True) def test_read_on_identity_ref(self): r_1 = ysanity.Runner.Ytypes.BuiltInT() r_1.identity_ref_value = ysanity.ChildIdentity_Identity() self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner.Ytypes.BuiltInT() r_2.identity_ref_value = READ() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # # read issue for identity_ref with namespace, if using netsim # r_2 = ysanity.Runner.Ytypes.BuiltInT() # r_2.identity_ref_value = ysanity.ChildIdentity_Identity() # r_2 = self.crud.read(self.ncc, r_2) # self.assertEqual(is_equal(r_1, r_2), True) def test_read_only_config(self): r_1 = ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2, r_3 = ysanity.Runner(), ysanity.Runner() r_2.one.number, r_3.one.number = READ(), READ() # only_config=True will change # <get>XML</get> # to # <get-config><source><running/></source>XML</get-config> r_2 = self.crud.read(self.ncc, r_2, only_config=True) r_3 = self.crud.read(self.ncc, r_3) # ysanity only have config data, ok to compare self.assertEqual(is_equal(r_2, r_3), True)
def read_system_time(service: CRUDService, provider: NetconfServiceProvider): system_time = xr_shellutil_oper.SystemTime() system_time = service.read(provider, system_time) return timedelta(seconds=system_time.uptime.uptime)
class SanityYang(unittest.TestCase): PROVIDER_TYPE = "non-native" @classmethod def setUpClass(self): if SanityYang.PROVIDER_TYPE == "native": self.ncc = NativeNetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) else: self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def test_one_level_pos(self): # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.number, r_1.one.name = 1, 'runner:one:name' self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.number, r_1.one.name = 10, 'runner/one/name' self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_two_level_pos(self): # READ r_1 = ysanity.Runner() r_1.two.number, r_1.two.name, r_1.two.sub1.number = 2, 'runner:two:name', 21 self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.two.number, r_1.two.name, r_1.two.sub1.number = 20, 'runner/two/name', 210 self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_three_level_pos(self): # READ r_1 = ysanity.Runner() r_1.three.number, r_1.three.name, \ r_1.three.sub1.number, r_1.three.sub1.sub2.number = 3, 'runner:three:name', 31, 311 self.crud.create(self.ncc, r_1) r_2 = ysanity.Runner() r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.three.number, r_1.three.name, \ r_1.three.sub1.number, r_1.three.sub1.sub2.number = 30, 'runner/three/name', 310, 3110 self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_onelist_neg_dupkey(self): # netsim/enxr not complaining r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() e_1.number = 1 e_2.name = 'foo' e_2.number = 1 e_2.name = 'bar' r_1.one_list.ldata.extend([e_1, e_2]) self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) def test_onelist_neg_update_key_nonexist(self): # will create a nonexist elem # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() e_1.number = 1 e_1.name = 'runner:onelist:ldata['+str(e_1.number)+']:name' r_1.one_list.ldata.extend([e_1]) self.crud.create(self.ncc, r_1) r_1.one_list.ldata[0].number = 2 r_1.one_list.ldata[0].name = '2' # assuming update on nonexist key will raise Exception with self.assertRaises(Exception): self.crud.update(self.ncc, r_1.one_list.ldata[0]) def test_onelsit_pos(self): # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() e_1.number = 1 e_1.name = 'runner:onelist:ldata['+str(e_1.number)+']:name' e_2.number = 2 e_2.name = 'runner:onelist:ldata['+str(e_2.number)+']:name' r_1.one_list.ldata.extend([e_1, e_2]) self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.OneList.Ldata(), ysanity.Runner.OneList.Ldata() e_1.number = 1 e_1.name = 'runner:onelist:ldata['+str(e_1.number)+']:name' e_2.number = 2 e_2.name = 'runner:onelist:ldata['+str(e_2.number)+']:name' r_1.one_list.ldata.extend([e_1, e_2]) self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_twolist_pos(self): # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.TwoList.Ldata(), ysanity.Runner.TwoList.Ldata() e_11, e_12 = ysanity.Runner.TwoList.Ldata.Subl1(), ysanity.Runner.TwoList.Ldata.Subl1() e_1.number = 21 e_1.name = 'runner:twolist:ldata['+str(e_1.number)+']:name' e_11.number = 211 e_11.name = 'runner:twolist:ldata['+str(e_1.number)+']:subl1['+str(e_11.number)+']:name' e_12.number = 212 e_12.name = 'runner:twolist:ldata['+str(e_1.number)+']:subl1['+str(e_12.number)+']:name' e_1.subl1.extend([e_11, e_12]) e_21, e_22 = ysanity.Runner.TwoList.Ldata.Subl1(), ysanity.Runner.TwoList.Ldata.Subl1() e_2.number = 22 e_2.name = 'runner:twolist:ldata['+str(e_2.number)+']:name' e_21.number = 221 e_21.name = 'runner:twolist:ldata['+str(e_2.number)+']:subl1['+str(e_21.number)+']:name' e_22.number = 222 e_22.name = 'runner:twolist:ldata['+str(e_2.number)+']:subl1['+str(e_22.number)+']:name' e_2.subl1.extend([e_21, e_22]) r_1.two_list.ldata.extend([e_1, e_2]) self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1, e_2 = ysanity.Runner.TwoList.Ldata(), ysanity.Runner.TwoList.Ldata() e_11, e_12 = ysanity.Runner.TwoList.Ldata.Subl1(), ysanity.Runner.TwoList.Ldata.Subl1() e_1.number = 21 e_1.name = 'runner/twolist/ldata['+str(e_1.number)+']/name' e_11.number = 211 e_11.name = 'runner/twolist/ldata['+str(e_1.number)+']/subl1['+str(e_11.number)+']/name' e_12.number = 212 e_12.name = 'runner/twolist/ldata['+str(e_1.number)+']/subl1['+str(e_12.number)+']/name' e_1.subl1.extend([e_11, e_12]) e_21, e_22 = ysanity.Runner.TwoList.Ldata.Subl1(), ysanity.Runner.TwoList.Ldata.Subl1() e_2.number = 22 e_2.name = 'runner/twolist/ldata['+str(e_2.number)+']/name' e_21.number = 221 e_21.name = 'runner/twolist/ldata['+str(e_2.number)+']/subl1['+str(e_21.number)+']/name' e_22.number = 222 e_22.name = 'runner/twolist/ldata['+str(e_2.number)+']/subl1['+str(e_22.number)+']/name' e_2.subl1.extend([e_21, e_22]) r_1.two_list.ldata.extend([e_1, e_2]) self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_threelist_pos(self): # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.ThreeList.Ldata() e_1.number = 31 e_1.name = 'runner:threelist:ldata['+str(e_1.number)+']:name' e_2 = ysanity.Runner.ThreeList.Ldata() e_2.number = 32 e_2.name = 'runner:threelist:ldata['+str(e_2.number)+']:name' e_11 = ysanity.Runner.ThreeList.Ldata.Subl1() e_12 = ysanity.Runner.ThreeList.Ldata.Subl1() e_11.number = 311 e_11.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_11.number)+']:name' e_12.number = 312 e_12.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_12.number)+']:name' e_111 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_112 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_111.number = 3111 e_111.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_11.number)+']:subsubl1['+str(e_111.number)+']:name' e_112.number = 3112 e_112.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_11.number)+']:subsubl1['+str(e_112.number)+']:name' e_11.sub_subl1.extend([e_111, e_112]) e_121 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_122 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_121.number = 3121 e_121.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_12.number)+']:subsubl1['+str(e_121.number)+']:name' e_122.number = 3122 e_121.name = 'runner:threelist:ldata['+str(e_1.number)+']:subl1['+str(e_12.number)+']:subsubl1['+str(e_122.number)+']:name' e_12.sub_subl1.extend([e_121, e_122]) e_1.subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.ThreeList.Ldata.Subl1() e_22 = ysanity.Runner.ThreeList.Ldata.Subl1() e_21.number = 321 e_21.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_21.number)+']:name' e_22.number = 322 e_22.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_22.number)+']:name' e_211 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_212 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_211.number = 3211 e_211.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_21.number)+']:subsubl1['+str(e_211.number)+']:name' e_212.number = 3212 e_212.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_21.number)+']:subsubl1['+str(e_212.number)+']:name' e_21.sub_subl1.extend([e_211, e_212]) e_221 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_222 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_221.number = 3221 e_221.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_22.number)+']:subsubl1['+str(e_221.number)+']:name' e_222.number = 3222 e_222.name = 'runner:threelist:ldata['+str(e_2.number)+']:subl1['+str(e_22.number)+']:subsubl1['+str(e_222.number)+']:name' e_22.sub_subl1.extend([e_221, e_222]) e_2.subl1.extend([e_21, e_22]) r_1.three_list.ldata.extend([e_1, e_2]) self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.ThreeList.Ldata() e_1.number = 31 e_1.name = 'runner/threelist/ldata['+str(e_1.number)+']/name' e_2 = ysanity.Runner.ThreeList.Ldata() e_2.number = 32 e_2.name = 'runner/threelist/ldata['+str(e_2.number)+']/name' e_11 = ysanity.Runner.ThreeList.Ldata.Subl1() e_12 = ysanity.Runner.ThreeList.Ldata.Subl1() e_11.number = 311 e_11.name = 'runner/threelistldata['+str(e_1.number)+']/subl1['+str(e_11.number)+']/name' e_12.number = 312 e_12.name = 'runner/threelist/ldata['+str(e_1.number)+']/subl1['+str(e_12.number)+']/name' e_111 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_112 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_111.number = 3111 e_111.name = 'runner/threelist/ldata['+str(e_1.number)+']/subl1['+str(e_11.number)+']/subsubl1['+str(e_111.number)+']/name' e_112.number = 3112 e_112.name = 'runner/threelist/ldata['+str(e_1.number)+']/subl1['+str(e_11.number)+']/subsubl1['+str(e_112.number)+']/name' e_11.sub_subl1.extend([e_111, e_112]) e_121 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_122 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_121.number = 3121 e_121.name = 'runner/threelist/ldata['+str(e_1.number)+']/subl1['+str(e_12.number)+']/subsubl1['+str(e_121.number)+']/name' e_122.number = 3122 e_121.name = 'runner/threelist/ldata['+str(e_1.number)+']/subl1['+str(e_12.number)+']/subsubl1['+str(e_122.number)+']/name' e_12.sub_subl1.extend([e_121, e_122]) e_1.subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.ThreeList.Ldata.Subl1() e_22 = ysanity.Runner.ThreeList.Ldata.Subl1() e_21.number = 321 e_21.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_21.number)+']/name' e_22.number = 322 e_22.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_22.number)+']/name' e_211 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_212 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_211.number = 3211 e_211.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_21.number)+']/subsubl1['+str(e_211.number)+']/name' e_212.number = 3212 e_212.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_21.number)+']/subsubl1['+str(e_212.number)+']/name' e_21.sub_subl1.extend([e_211, e_212]) e_221 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_222 = ysanity.Runner.ThreeList.Ldata.Subl1.SubSubl1() e_221.number = 3221 e_221.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_22.number)+']/subsubl1['+str(e_221.number)+']/name' e_222.number = 3222 e_222.name = 'runner/threelist/ldata['+str(e_2.number)+']/subl1['+str(e_22.number)+']/subsubl1['+str(e_222.number)+']/name' e_22.sub_subl1.extend([e_221, e_222]) e_2.subl1.extend([e_21, e_22]) r_1.three_list.ldata.extend([e_1, e_2]) self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_InbtwList_pos(self): # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_1.name = 'runner:inbtwlist:['+str(e_1.number)+']:name' e_1.subc.number = 111 e_1.subc.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:name' e_2.number = 12 e_2.name = 'runner:inbtwlist:['+str(e_2.number)+']:name' e_2.subc.number = 121 e_2.subc.name = 'runner:inbtwlist:['+str(e_2.number)+']:name' e_11 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_11.number = 111 e_11.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:subcsubl1['+str(e_11.number)+']:name' e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12.number = 112 e_12.name = 'runner:inbtwlist:['+str(e_1.number)+']:subc:subcsubl1['+str(e_12.number)+']:name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 121 e_21.name = 'runner:inbtwlist:['+str(e_2.number)+']:subc:subcsubl1['+str(e_21.number)+']:name' e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22.number = 122 e_22.name = 'runner:inbtwlist:['+str(e_2.number)+']:subc:subcsubl1['+str(e_22.number)+']:name' e_2.subc.subc_subl1.extend([e_21, e_22]) r_1.inbtw_list.ldata.extend([e_1, e_2]) self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_1.name = 'runner/inbtwlist/['+str(e_1.number)+']/name' e_1.subc.number = 111 e_1.subc.name = 'runnerinbtwlist/['+str(e_1.number)+']/subc/name' e_2.number = 12 e_2.name = 'runner/inbtwlist/['+str(e_2.number)+']/name' e_2.subc.number = 121 e_2.subc.name = 'runner/inbtwlist/['+str(e_2.number)+']/name' e_11 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_11.number = 111 e_11.name = 'runner/inbtwlist/['+str(e_1.number)+']/subc/subcsubl1['+str(e_11.number)+']/name' e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12.number = 112 e_12.name = 'runner/inbtwlist/['+str(e_1.number)+']/subc/subcsubl1['+str(e_12.number)+']/name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 121 e_21.name = 'runner/inbtwlist/['+str(e_2.number)+']/subc/subcsubl1['+str(e_21.number)+']/name' e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22.number = 122 e_22.name = 'runner/inbtwlist/['+str(e_2.number)+']/subc/subcsubl1['+str(e_22.number)+']/name' e_2.subc.subc_subl1.extend([e_21, e_22]) r_1.inbtw_list.ldata.extend([e_1, e_2]) self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_leafref_simple_pos(self): # change ref and original data together # READ r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.ytypes.built_in_t.number8 = 100 r_1.ytypes.built_in_t.leaf_ref = r_1.ytypes.built_in_t.number8 self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.ytypes.built_in_t.number8 = 110 r_1.ytypes.built_in_t.leaf_ref = r_1.ytypes.built_in_t.number8 self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_leafref_pos(self): # rfc: refer to leaf # 1.already exists # 2.has default value # create leafs will be referred to # CREATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.name = 'runner:one:name' r_1.two.sub1.number = 21 r_1.three.sub1.sub2.number = 311 e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_2.number = 21 e_1.name = 'runner:inbtwlist['+str(e_1.number)+']:name' e_2.name = 'runner:inbtwlist['+str(e_2.number)+']:name' e_1.subc.number = 111 e_2.subc.number = 121 e_1.subc.name = 'runner:inbtwlist['+str(e_1.number)+']:subc:name' e_2.subc.name = 'runner:inbtwlist['+str(e_2.number)+']:subc:name' e_11 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_11.number = 111 e_12.number = 112 e_11.name = 'runner:inbtwlist['+str(e_1.number)+']:subc:subcsubl1['+str(e_11.number)+']:name' e_12.name = 'runner:inbtwlist['+str(e_1.number)+']:subc:subcsubl1['+str(e_12.number)+']:name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 311 e_22.number = 122 e_21.name = 'runner:inbtwlist['+str(e_2.number)+']:subc:subcsubl1['+str(e_21.number)+']:name' e_22.name = 'runner:inbtwlist['+str(e_2.number)+']:subc:subcsubl1['+str(e_22.number)+']:name' e_2.subc.subc_subl1.extend([e_21, e_22]) r_1.inbtw_list.ldata.extend([e_1, e_2]) r_1.leaf_ref.ref_one_name = r_1.one.name r_1.leaf_ref.ref_two_sub1_number = r_1.two.sub1.number r_1.leaf_ref.ref_three_sub1_sub2_number = r_1.three.sub1.sub2.number r_1.leaf_ref.ref_inbtw = e_21.name r_1.leaf_ref.one.name = 'runner:leaf-ref:one:name' r_1.leaf_ref.one.two.self_ref_one_name = r_1.leaf_ref.ref_one_name self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_1.one.name, r_1.leaf_ref.ref_one_name) self.assertEqual(r_1.two.sub1.number, r_1.leaf_ref.ref_two_sub1_number) self.assertEqual(r_1.three.sub1.sub2.number, r_1.leaf_ref.ref_three_sub1_sub2_number) self.assertEqual(r_1.inbtw_list.ldata[1].subc.subc_subl1[0].name, r_1.leaf_ref.ref_inbtw) self.assertEqual(r_1.leaf_ref.ref_one_name, r_1.leaf_ref.one.two.self_ref_one_name) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.name = 'runner/one/name' r_1.two.sub1.number = 21 r_1.three.sub1.sub2.number = 311 e_1 = ysanity.Runner.InbtwList.Ldata() e_2 = ysanity.Runner.InbtwList.Ldata() e_1.number = 11 e_2.number = 21 e_1.name = 'runner/inbtwlist['+str(e_1.number)+']/name' e_2.name = 'runner/inbtwlist['+str(e_2.number)+']/name' e_1.subc.number = 111 e_2.subc.number = 121 e_1.subc.name = 'runner/inbtwlist['+str(e_1.number)+']/subc/name' e_2.subc.name = 'runner/inbtwlist['+str(e_2.number)+']/subc/name' e_11 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_12 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_11.number = 111 e_12.number = 112 e_11.name = 'runner/inbtwlist['+str(e_1.number)+']/subc/subcsubl1['+str(e_11.number)+']/name' e_12.name = 'runner/inbtwlist['+str(e_1.number)+']/subc/subcsubl1['+str(e_12.number)+']/name' e_1.subc.subc_subl1.extend([e_11, e_12]) e_21 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_22 = ysanity.Runner.InbtwList.Ldata.Subc.SubcSubl1() e_21.number = 311 e_22.number = 122 e_21.name = 'runner/inbtwlist['+str(e_2.number)+']/subc/subcsubl1['+str(e_21.number)+']/name' e_22.name = 'runner/inbtwlist['+str(e_2.number)+']/subc/subcsubl1['+str(e_22.number)+']/name' e_2.subc.subc_subl1.extend([e_21, e_22]) r_1.inbtw_list.ldata.extend([e_1, e_2]) r_1.leaf_ref.ref_one_name = r_1.one.name r_1.leaf_ref.ref_two_sub1_number = r_1.two.sub1.number r_1.leaf_ref.ref_three_sub1_sub2_number = r_1.three.sub1.sub2.number r_1.leaf_ref.ref_inbtw = e_21.name r_1.leaf_ref.one.name = 'runner/leaf-ref/one/name' r_1.leaf_ref.one.two.self_ref_one_name = r_1.leaf_ref.ref_one_name self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_1.one.name, r_1.leaf_ref.ref_one_name) self.assertEqual(r_1.two.sub1.number, r_1.leaf_ref.ref_two_sub1_number) self.assertEqual(r_1.three.sub1.sub2.number, r_1.leaf_ref.ref_three_sub1_sub2_number) self.assertEqual(r_1.inbtw_list.ldata[1].subc.subc_subl1[0].name, r_1.leaf_ref.ref_inbtw) self.assertEqual(r_1.leaf_ref.ref_one_name, r_1.leaf_ref.one.two.self_ref_one_name) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_aug_one_pos(self): # CREATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.one_aug.number = 1 r_1.one.one_aug.name =r_1.one.one_aug._common_path self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() r_1.one.one_aug.number = 10 r_1.one.one_aug.name =r_1.one.one_aug._common_path.replace(':', '/') self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_1) self.assertEqual(r_2._has_data(), False) def test_aug_onelist_pos(self): # CREATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.OneList.OneAugList.Ldata() e_2 = ysanity.Runner.OneList.OneAugList.Ldata() e_1.number = 1 e_1.name = e_1._common_path e_2.number = 2 e_2.name = e_2._common_path r_1.one_list.one_aug_list.ldata.extend([e_1, e_2]) r_1.one_list.one_aug_list.enabled = True self.crud.create(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # UPDATE r_1, r_2 = ysanity.Runner(), ysanity.Runner() e_1 = ysanity.Runner.OneList.OneAugList.Ldata() e_2 = ysanity.Runner.OneList.OneAugList.Ldata() e_1.number = 1 e_1.name = e_1._common_path.replace(':', '/') e_2.number = 2 e_2.name = e_2._common_path.replace(':', '/') r_1.one_list.one_aug_list.ldata.extend([e_1, e_2]) r_1.one_list.one_aug_list.enabled = True self.crud.update(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(is_equal(r_1, r_2), True) # DELETE r_1 = ysanity.Runner() self.crud.delete(self.ncc, r_1) r_2 = self.crud.read(self.ncc, r_2) self.assertEqual(r_2._has_data(), False) def test_parent_empty(self): runner = ysanity.Runner() runner.ytypes.enabled = Empty() runner.ytypes.built_in_t.emptee = Empty() self.crud.create(self.ncc, runner) runner_read = self.crud.read(self.ncc, ysanity.Runner()) self.assertEqual(is_equal(runner_read, runner), True)
class SanityTest(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider( "127.0.0.1", "admin", "admin", 12022, ) self.crud = CRUDService() def setUp(self): runner = Runner() self.crud.delete(self.ncc, runner) def test_delete_on_list_with_identitykey(self): a1 = Runner.OneList.IdentityList() a1.config.id = ChildIdentity() a1.id_ref = a1.config.id self.crud.create(self.ncc, a1) k = Runner.OneList.IdentityList() k.config.id = ChildIdentity() k.id_ref = k.config.id k.yfilter = YFilter.delete self.crud.update(self.ncc, k) runner_read = self.crud.read(self.ncc, Runner()) self.assertIsNone(runner_read) def test_iden_list(self): # CREATE il = Runner.OneList.IdentityList() il.config.id = ChildIdentity() il.id_ref = ChildIdentity() self.crud.create(self.ncc, il) # READ & VALIDATE runner_filter = Runner() read_one = self.crud.read(self.ncc, runner_filter.one_list) self.assertIsNotNone(read_one) read_il = read_one.identity_list.get(ChildIdentity().to_string()) self.assertIsNotNone(read_il) read_il.parent = None self.assertEqual(read_il, il) # DELETE & VALIDATE self.crud.delete(self.ncc, il) runner_read = self.crud.read(self.ncc, Runner()) self.assertIsNone(runner_read) def test_crud_delete_container(self): # Build loopback configuration address = Native.Interface.Loopback.Ipv4.Address() address.ip = "2.2.2.2" address.netmask = "255.255.255.255" loopback = Native.Interface.Loopback() loopback.name = 2222 loopback.ipv4.address.append(address) native = Native() native.interface.loopback.append(loopback) crud = CRUDService() result = crud.create(self.ncc, native) self.assertTrue(result) # Read ipv4 configuration native = Native() loopback = Native.Interface.Loopback() loopback.name = 2222 native.interface.loopback.append(loopback) ipv4_config = crud.read(self.ncc, loopback.ipv4) self.assertIsNotNone(ipv4_config) self.assertEqual(ipv4_config.address['2.2.2.2'].netmask, "255.255.255.255") # Remove ipv4 configuration native = Native() loopback = Native.Interface.Loopback() loopback.name = 2222 native.interface.loopback.append(loopback) result = crud.delete(self.ncc, loopback.ipv4) self.assertTrue(result) # Delete configuration native = Native() result = crud.delete(self.ncc, native) self.assertEqual(result, True) def test_netconf_delete_container(self): # Build loopback configuration address = Native.Interface.Loopback.Ipv4.Address() address.ip = "2.2.2.2" address.netmask = "255.255.255.255" loopback = Native.Interface.Loopback() loopback.name = 2222 loopback.ipv4.address.append(address) native = Native() native.interface.loopback.append(loopback) ns = NetconfService() result = ns.edit_config(self.ncc, Datastore.candidate, native) self.assertTrue(result) # Read ipv4 configuration native = Native() loopback = Native.Interface.Loopback() loopback.name = 2222 native.interface.loopback.append(loopback) ipv4_config = ns.get_config(self.ncc, Datastore.candidate, loopback.ipv4) self.assertIsNotNone(ipv4_config) self.assertEqual(ipv4_config.address['2.2.2.2'].netmask, "255.255.255.255") # Delete configuration result = ns.discard_changes(self.ncc) self.assertEqual(result, True)
help="NETCONF device (ssh://user:password@host:port)") args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() file_system = xr_shellutil_filesystem_oper.FileSystem() # create object file_system = crud.read(provider, file_system) # read object from device print(process_file_system(file_system)) # process object data provider.close() exit() # End of script
class SanityTest(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', port=12022) self.crud = CRUDService() @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): print "\nIn method", self._testMethodName def tearDown(self): runner = ysanity.Runner() self.crud.delete(self.ncc, runner) def _create_runner(self): runner = ysanity.Runner() runner.ytypes = runner.Ytypes() runner.ytypes.built_in_t = runner.ytypes.BuiltInT() return runner # changed to type int16 def test_int8(self): # Create Runner runner = self._create_runner() runner.ytypes.built_in_t.number8 = 126 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type int32 def test_int16(self): runner = self._create_runner() runner.ytypes.built_in_t.number16 = 20000 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type int64 def test_int32(self): runner = self._create_runner() runner.ytypes.built_in_t.number32 = -9223372036854775808 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint8 def test_int64(self): runner = self._create_runner() runner.ytypes.built_in_t.number64 = -9223372036854775808 self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # changed to type uint16 def test_uint8(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number8 = 256 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint32 def test_uint16(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number16 = 65536 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type uint64 def test_uint32(self): runner = self._create_runner() runner.ytypes.built_in_t.u_number32 = 4294967296 self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type string def test_decimal64(self): runner = self._create_runner() runner.ytypes.built_in_t.deci64 = 'string' self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to tye decimal64 def test_leafref(self): runner = self._create_runner() runner.ytypes.built_in_t.leaf_ref = Decimal64('3.14') self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type empty def test_string(self): runner = self._create_runner() runner.ytypes.built_in_t.name = Empty() self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) # changed to type YdkEnumTestEnum def test_boolean(self): runner = self._create_runner() runner.ytypes.built_in_t.bool_value = YdkEnumTestEnum.NONE self.crud.create(self.ncc, runner) # Read into Runner2 runner1 = ysanity.Runner() runner1 = self.crud.read(self.ncc, runner1) # Compare runners result = is_equal(runner, runner1) self.assertEqual(result, True) runner = self._create_runner() runner.ytypes.built_in_t.bool_value = False self.assertRaises(YPYDataValidationError, self.crud.update, self.ncc, runner) # max val changed to 7 def test_leaflist_max_elements(self): runner = self._create_runner() runner.ytypes.built_in_t.llstring = [str(i) for i in range(8)] self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # not supported leaf def test_not_supported_leaf(self): runner = self._create_runner() runner.not_supported_1.not_supported_leaf = 'leaf value' self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # not supported container def test_not_supported_container(self): runner = self._create_runner() runner.not_supported_1.not_supported_1_2.some_leaf = 'some leaf' self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner) # not supported list def test_not_supported_list(self): runner = self._create_runner() elems = [] for i in range(5): elems.append(runner.NotSupported2()) runner.not_supported_2.extend(elems) self.assertRaises(YPYDataValidationError, self.crud.create, self.ncc, runner)
class SanityYang(unittest.TestCase): @classmethod def setUpClass(self): self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() a = self.getInitEntity() self.crud.delete(self.ncc, a) self.crud.create(self.ncc, a) @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): print '\nIn method', self._testMethodName + ':' def tearDown(self): pass @classmethod def getInitEntity(self): """ set and return entity with XML: <a> <a1>some value</a1> <a2>value of a2</a2> <a3>value of a3</a3> <b> <b1>some value</b1> <b2>value of b2</b2> <b3>value of b3</b3> <c/> <d> <d1>some value d1</d1> <d2>value of d2</d2> <d3>value of d3</d3> <e> <e1>some value e1</e1> <e2>value of e2</e2> </e> </d> </b> <lst> <number>1</number> <value>one</value> </lst> <lst> <number>2</number> <value>two</value> </lst> <lst> <number>3</number> <value>three</value> </lst> </a> """ a = ysanity.A() a.a1, a.a2, a.a3 = "some value", "value of a2", "value of a3" a.b.b1, a.b.b2, a.b.b3 = "some value", "value of b2", "value of b3" a.b.c = a.b.C() a.b.d.d1, a.b.d.d2, a.b.d.d3 = "some value d1", "value of d2", "value of d3" a.b.d.e.e1, a.b.d.e.e2 = "some value e1", "value of e2" l1, l2, l3 = a.Lst(), a.Lst(), a.Lst() l1.number, l1.value = 1, "one" l2.number, l2.value = 2, "two" l3.number, l3.value = 3, "three" a.lst.extend([l1,l2,l3]) return a def test_CASE1(self): a = ysanity.A() a = self.crud.read(self.ncc, a) # the whole thing _a = self.getInitEntity() self.assertEqual(is_equal(a, _a), True) def test_CASE2(self): a = ysanity.A() a.a1 = "some value" a = self.crud.read(self.ncc, a) # the whole thing _a = self.getInitEntity() self.assertEqual(is_equal(a, _a), True) def test_CASE3(self): a = ysanity.A() a.a1 = READ() a = self.crud.read(self.ncc, a) _a = ysanity.A() _a.a1 = "some value" self.assertEqual(is_equal(a, _a), True) def test_CASE4(self): a = ysanity.A() a.b.b1 = "some value" a = self.crud.read(self.ncc, a) _a = self.getInitEntity() _a.lst, _a.a1, _a.a2, _a.a3 = YList(), None, None, None self.assertEqual(is_equal(a, _a), True) def test_CASE5(self): a = ysanity.A() e = a.b.d.e e.e1 = "some value e1" a = self.crud.read(self.ncc, a) _a = ysanity.A() _a.b.d.e.e1, _a.b.d.e.e2 = "some value e1", "value of e2" self.assertEqual(is_equal(a, _a), True) def test_CASE6(self): a = ysanity.A() a.b.c = a.b.C() a = self.crud.read(self.ncc, a) _a = ysanity.A() _a.b.c = _a.b.C() self.assertEqual(is_equal(a, _a), True) def test_CASE7(self): a = ysanity.A() l1, l2 = a.Lst(), a.Lst() l1.number, l2.number = 1, 2 a.lst.extend([l1, l2]) a = self.crud.read(self.ncc, a) _a = ysanity.A() l1.value, l2.value = "one", "two" _a.lst.extend([l1, l2]) self.assertEqual(is_equal(a, _a), True)
def crud_read(obj): crud = CRUDService() ncc = NetconfServiceProvider(address='93180-EX-1', username='******', password='******') return crud.read(ncc, obj)
args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.INFO) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() isis = xr_clns_isis_oper.Isis() # create object # read data from NETCONF device isis = crud.read(provider, isis) print(process_isis(isis)) # process object data exit() # End of script
#The provider is the underlying implementation that connects to the device xr_provider = NetconfServiceProvider(address='xrv', port=830, username='******', password='******', protocol='ssh') #CRUDSerice provides the CRUD functions crud_service = CRUDService() #Configuration entity for BGP bgp_config = oc_bgp.Bgp() #Read and print the initial value initial_bgp = crud_service.read(xr_provider, bgp_config) print("The initial BGP ASN value is - " + str(initial_bgp.global_.config.as_)) #Set a new value if initial_bgp.global_.config.as_: bgp_config.global_.config.as_ = initial_bgp.global_.config.as_ - 1 #Delete the configuration entity so that we can create a new one crud_service.delete(xr_provider, bgp_config) else: bgp_config.global_.config.as_ = 65000 #Create the configuration crud_service.create(xr_provider, bgp_config) #Read and print the new value new_bgp = crud_service.read(xr_provider, bgp_config) print("The new BGP ASN value is - " + str(new_bgp.global_.config.as_))
device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() file_system = xr_shellutil_filesystem_oper.FileSystem() # create object # read data from NETCONF device file_system = crud.read(provider, file_system) print(process_file_system(file_system)) # process object data provider.close() exit() # End of script
help="NETCONF device (ssh://user:password@host:port)") args = parser.parse_args() device = urlparse(args.device) # log debug messages if verbose argument specified if args.verbose: logger = logging.getLogger("ydk") logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() formatter = logging.Formatter(("%(asctime)s - %(name)s - " "%(levelname)s - %(message)s")) handler.setFormatter(formatter) logger.addHandler(handler) # create NETCONF provider provider = NetconfServiceProvider(address=device.hostname, port=device.port, username=device.username, password=device.password, protocol=device.scheme) # create CRUD service crud = CRUDService() isis = xr_clns_isis_oper.Isis() # create oper object isis = crud.read(provider, isis) # read object from NETCONF device print(process_isis(isis)) # process object data provider.close() exit() # End of script
class SanityYang(unittest.TestCase): PROVIDER_TYPE = "non-native" @classmethod def setUpClass(self): if SanityYang.PROVIDER_TYPE == "native": self.ncc = NativeNetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) else: self.ncc = NetconfServiceProvider(address='127.0.0.1', username='******', password='******', protocol='ssh', port=12022) self.crud = CRUDService() # config device with entity a a = self.getInitEntity() self.crud.delete(self.ncc, a) self.crud.create(self.ncc, a) @classmethod def tearDownClass(self): self.ncc.close() def setUp(self): pass def tearDown(self): pass @classmethod def getInitEntity(self): """ Set and return entity with following XML: <a> <a1>some value</a1> <a2>value of a2</a2> <a3>value of a3</a3> <b> <b1>some value</b1> <b2>value of b2</b2> <b3>value of b3</b3> <c/> <f> <f1>f</f1> </f> <d> <d1>some value d1</d1> <d2>value of d2</d2> <d3>value of d3</d3> <e> <e1>some value e1</e1> <e2>value of e2</e2> </e> </d> </b> <lst> <number>1</number> <value>one</value> </lst> <lst> <number>2</number> <value>two</value> </lst> <lst> <number>3</number> <value>three</value> </lst> </a> """ a = ysanity.A() a.a1, a.a2, a.a3 = "some value", "value of a2", "value of a3" a.b.b1, a.b.b2, a.b.b3 = "some value", "value of b2", "value of b3" # config presence container a.b.f = a.b.F() a.b.f.f1 = 'f' a.b.c = a.b.C() a.b.d.d1 = "some value d1" a.b.d.d2 = "value of d2" a.b.d.d3 = "value of d3" a.b.d.e.e1, a.b.d.e.e2 = "some value e1", "value of e2" l1, l2, l3 = a.Lst(), a.Lst(), a.Lst() l1.number, l1.value = 1, "one" l2.number, l2.value = 2, "two" l3.number, l3.value = 3, "three" a.lst.extend([l1, l2, l3]) return a def test_CASE1(self): """Use crud read with top level entity returns all data.""" a = ysanity.A() a_read = self.crud.read(self.ncc, a) preconfig_a = self.getInitEntity() self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE2(self): """ According to https://tools.ietf.org/html/rfc6241#section-6.2.5, `a.a1` is a content match node. Uses crud read on `a` returns all data. """ a = ysanity.A() a.a1 = "some value" a_read = self.crud.read(self.ncc, a) preconfig_a = self.getInitEntity() self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE3(self): """Assign a READ object to `a.a1` should only return data on this leaf.""" a = ysanity.A() a.a1 = READ() a_read = self.crud.read(self.ncc, a) preconfig_a = ysanity.A() preconfig_a.a1 = "some value" self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE4(self): """Now `a.b.b1` serves as a content match node.""" a = ysanity.A() a.b.b1 = "some value" a_read = self.crud.read(self.ncc, a) preconfig_a = self.getInitEntity() del preconfig_a.lst[:] preconfig_a.a1 = None preconfig_a.a2 = None preconfig_a.a3 = None self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE5(self): """Now `a.b.d.e` serves as a content match node.""" a = ysanity.A() e = a.b.d.e e.e1 = "some value e1" a_read = self.crud.read(self.ncc, a) preconfig_a = ysanity.A() preconfig_a.b.d.e.e1 = "some value e1" preconfig_a.b.d.e.e2 = "value of e2" self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE6(self): """Assign `a.b.c` serves as an empty presence container.""" a = ysanity.A() a.b.c = a.b.C() a_read = self.crud.read(self.ncc, a) preconfig_a = ysanity.A() preconfig_a.b.c = preconfig_a.b.C() self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE7(self): """`item1.number` and `item2.number` serves as content match nodes.""" a = ysanity.A() item1, item2 = a.Lst(), a.Lst() item1.number, item2.number = 1, 2 a.lst.extend([item1, item2]) a_read = self.crud.read(self.ncc, a) preconfig_a = ysanity.A() item1.value, item2.value = "one", "two" preconfig_a.lst.extend([item1, item2]) self.assertEqual(is_equal(a_read, preconfig_a), True) def test_CASE8(self): """Assign presence class F to `a.b.f`.""" a = ysanity.A() a.b.f = a.b.F() a.b.f.f1 = 'f' a_read = self.crud.read(self.ncc, a) preconfig_a = a self.assertEqual(is_equal(a_read, preconfig_a), True) def test_read_oc_patttern(self): obj_A = oc_pattern.OcA() obj_A.a = 'hello' obj_A.b.b = obj_A.a # 'world' --> YPYServiceProviderError: illegal reference self.crud.create(self.ncc, obj_A) obj_A_read = self.crud.read(self.ncc, oc_pattern.OcA(), True) self.assertEqual(is_equal(obj_A, obj_A_read), True)