Bruno automation test cases code upload: new test cases completed: some networking test cases and basic TR069 test cases.
Change-Id: I93e646544792790e0acd70b2c406146b7330ef20
diff --git a/basic_TR69.py b/basic_TR69.py
new file mode 100644
index 0000000..0b9bfae
--- /dev/null
+++ b/basic_TR69.py
@@ -0,0 +1,651 @@
+#!/usr/bin/python
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+"""This class implements some basic TR069 test cases.
+
+ This class extends the TestCase Class.
+ This file implements some basic TR069 test cases to verify Bruno management
+ features. In the following test cases, only those that are defined in
+ 'config.cfg' file will be executed.
+
+ Basic TR069 test cases include the following:
+ testID: 11865129 7.6.1 ACS Connection via IPv6
+ testID: 11721375 7.6.10 Verify there is a way to reset to factory default
+ if user modifies the local configuration
+ '/etc/init.d/S05factoryreset later'
+ testID: 14319146 7.6.19 Default ACS URL
+ testID: 11721371 7.6.2 ACS URL Pass to Bruno via Moca
+ testID: 14312009 7.6.21 Restrict the ability to locally configure ACS URL
+ testID: 14186028 7.6.22 Security of the link between the DHCPv6 server
+ and the CPE
+ testID: 14312010 7.6.23 CPE Connection Initiation
+ testID: 14247012 7.6.24.1 Support of Connection Request notification
+ mechanism
+ testID: 14186029 7.6.24.2 InternetGatewayDevice.ManagementServer.
+ ConnectionRequestURL
+ testID: 14312011 7.6.24.3 InternetGatewayDevice.ManagementServer.
+ ConnectionRequestURL format
+ testID: 14293012 7.6.24.4 No data is conveyed in the Connection
+ Request HTTP Get notification
+ testID: 14165037 7.6.24.5 Restrict the number of Connection Request
+ notifications
+ testID: 14315010 7.6.24.6 Connection Request Notification does not
+ terminate current session
+ testID: 14247013 7.6.25.1 MaxEnvelopes
+ testID: 14312012 7.6.25.2 Cookie support (optional)
+ testID: 14293013 7.6.25.4 Authentication
+ testID: 14311008 7.6.26.1 SOAP namespace identifier
+ testID: 14293014 7.6.26.2 SOAP Fault element
+ testID: 14311009 7.6.26.3 SOAP future extensibility
+ testID: 14186030 7.6.27 Fault Handling
+ testID: 14319148 7.6.27.1 SOAP requests respond
+ testID: 14266497 7.6.27.2 Session Termination
+ testID: 14312013 7.6.28 Correctly handle concurrent downloads in catawampus
+ testID: 11874098 7.6.3.1 TLS (1.2)/SSL based Transport for TR-069 on IPv6
+ testID: 14315007 7.6.3.2 Support for encryption algorithms
+ testID: 14247014 7.6.32 Persist TR-069 config across reboots
+ testID: 14293015 7.6.33 Send notification when disk is full
+ testID: 14293016 7.6.34 Support for multiple SSIDs in WLANConfiguration
+ testID: 11865130 7.6.4 TR069-ACS Validation
+ testID: 11722370 7.6.5 TR069-Inform Request
+ testID: 11874103 7.6.7 Digest Authentication
+ testID: 11843139 7.6.8.1 Support of RPCs: REBOOT
+"""
+
+__author__ = 'Lehan Meng (lmeng@google.com)'
+
+
+import os
+import re
+import time
+
+from IPy import IP
+
+import device
+import ssh
+import testCase
+
+
+class BasicTR069Test(testCase.TestCase):
+ """Class for test cases: Bruno basic TR069 features.
+
+ A range of basic TR069 test cases are defined in this Class
+ """
+
+ def Init(self):
+ """Initialize the networking feature tests."""
+ # Get all device information.
+ info = self.log.CreateResultInfo(
+ '---', 'Networking test verification started...')
+ self.log.SendLine(self.test_info, info)
+ self.bruno = device.Bruno(user=self.params['user'],
+ addr=self.params['addr'],
+ bruno_prompt=self.params['bruno_prompt'],
+ addr_ipv6=self.params['addr_ipv6'])
+ self.bruno.SetLogging(self.log)
+ if not self.p_ssh:
+ self.p_ssh = ssh.SSH(user=self.params['user'],
+ addr=self.params['addr'],
+ bruno_prompt=self.params['bruno_prompt'],
+ addr_ipv6=self.params['addr_ipv6'])
+ self.bruno.dev_ssh = self.p_ssh
+ self.p_ssh.SetLogging(self.log)
+
+ self.__delay_5_sec = 5
+ self.__delay_5_min = 300
+ self.__delay_15_min = 900
+ return
+
+ def SshTunnel(self):
+ """Create ssh tunnel for the test."""
+ self.p_ssh.SshRetry(5, 15)
+ return
+
+ def VerifyDuplicatedAddress(self, ip_addr):
+ """Verify device can detect duplicated ipv6 address existing in network.
+
+ Set a duplicated ip address on the device.
+ Verify that the device can detect duplicated ip address
+
+ Args:
+ ip_addr: the duplicated address
+ Returns:
+ True: if duplicated detected
+ False: if duplicated address is not detected
+ """
+ time_stamp = self.bruno.GetTimeStamp()
+ self.bruno.dev_ssh.SendCmd('ip -6 addr add ' + ip_addr + '/64 dev br0')
+ time.sleep(1)
+ self.bruno.dev_ssh.SendCmd('dmesg')
+ log_list = self.bruno.dev_ssh.GetCmdOutput()
+
+ pattern_line = (
+ '\[\d*\.\d{3}\]\s*\w*\d:\s* IPv6 duplicate address\s*('
+ + ip_addr + ')\s*[/\d+]*\s*detected!')
+ self.bruno.dev_ssh.SendCmd('ip -6 addr del ' + ip_addr + '/64 dev br0')
+
+ if self.bruno.FindLineInLog(log_list, time_stamp, pattern_line):
+ info = self.log.CreateResultInfo('Pass', 'Duplicated IPv6 address '
+ 'detected: ' + ip_addr)
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateResultInfo('Failed',
+ 'Duplicated IPv6 address not detected: '
+ + ip_addr + '. Verification Failed!')
+ self.log.SendLine(self.test_info, info)
+ #[132344.324] br0: IPv6 duplicate address fe80:... detected!
+
+ def VerifyExpectedVersion(self):
+ """Verify if device is running on expected software version."""
+ if not self.bruno.VerifyCurrentVersion(self.params['expected_version']):
+ info = self.log.CreateErrorInfo('critical',
+ 'Device software version is not expected!'
+ ' Exit!')
+ self.log.SendLine(self.test_info, info)
+ os.sys.exit(1)
+
+ def VerifyACSWithIPv6(self):
+ """Test ID: 11865129 - Verify IPv6 connection to ACS.
+
+ To verify device connects to ACS via IPv6, use tcpdump to capture
+ network packets, filtered with source IPv6 address, and destination
+ IPv6 address of Bruno and ACS.
+
+ tcpdump filter:
+ 1. source address: device address
+ destination address: ACS address
+ 2. source address: ACS address
+ destination address: device address
+
+ if packets on both directions are found, test succeeds.
+ Otherwise, test failed.
+ """
+ info = self.log.CreateProgressInfo(
+ '10%', 'Verifying current image version, expected: '
+ + self.params['expected_version'])
+ self.log.SendLine(self.test_info, info)
+ self.VerifyExpectedVersion()
+
+ # capture 10 packets on both directions.
+ # capture length: 100 bytes
+ packet_to_catch = '5'
+ bytes_to_catch = '100'
+ interface_to_catch = 'br0'
+ tcpdump_command = ('tcpdump -i ' + interface_to_catch + ' -c '
+ + packet_to_catch + ' -s ' + bytes_to_catch
+ + ' \'(((src ' + self.params['addr_ipv6']
+ + ') and (dst ' + self.params['acs_ipv6']
+ + ')) or ((src ' + self.params['acs_ipv6']
+ + ') and (dst ' + self.params['addr_ipv6']
+ + ')))\'')
+ info = self.log.CreateProgressInfo(
+ '30%', 'Calling tcpdump to capture device traffic to ACS server: '
+ 'capturing on interface: ' + interface_to_catch
+ + ' Catch packets: ' + packet_to_catch)
+ self.log.SendLine(self.test_info, info)
+ self.p_ssh.SendCmd(tcpdump_command, 180)
+ info = self.log.CreateProgressInfo(
+ '60%', 'Packets captured. Analyzing...')
+ self.log.SendLine(self.test_info, info)
+ tcpdump_result = self.p_ssh.GetCmdOutput()
+ tcpdump_result.reverse()
+ if self.CheckACSIPv6Connection(tcpdump_result):
+ info = self.log.CreateProgressInfo(
+ '100%', 'TR069 traffic verified: Device connected to ACS via IPv6')
+ self.log.SendLine(self.test_info, info)
+ info = self.log.CreateResultInfo(
+ 'Pass', 'TR069 traffic verified: Device connected to ACS via IPv6')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateResultInfo(
+ 'Failed', 'TR069 traffic verified: No IPv6 connection detected.')
+ self.log.SendLine(self.test_info, info)
+
+ def ParseDumpMsgToPackets(self, tcpdump_result):
+ """Parse tcpdump dump messages information to packets.
+
+ tcpdump result (for example):
+ 14:24:36.887936 00:1a:11:30:64:e6 (oui Unknown) > a8:d0:e5:a1:e3:02 L1
+ (oui Unknown), ethertype IPv6 (0x86dd), length 86: L2
+ 0x0000: 6000 0000 0020 0640 2605 a601 fe00 fd18 `......@&....... L3
+ 0x0010: 021a 11ff fe30 64e6 2001 4860 8005 0000 .....0d...H`.... L4
+ 0x0020: 0000 0000 0000 008d e2e8 01bb 73e4 0dc8 ............s... L5
+ 0x0030: a1bf d109 8011 0429 276b 0000 0101 080a .......)'k...... L6
+ 0x0040: 0389 b875 d29d 2401 ...u..$. L7
+ 14:24:36.912863 a8:d0:e5:a1:e3:02 (oui Unknown) > 00:1a:11:30:64:e6 L8
+ (oui Unknown), ethertype IPv6 (0x86dd), length 86: L9
+ 0x0000: 6000 0000 0020 0634 2001 4860 8005 0000 `......4..H`.... L10
+ 0x0010: 0000 0000 0000 008d 2605 a601 fe00 fd18 ........&....... L11
+ 0x0020: 021a 11ff fe30 64e6 01bb e2e8 a1bf d109 .....0d......... L12
+ 0x0030: 73e4 0dc9 8011 05a8 6bdc 0000 0101 080a s.......k....... L13
+ 0x0040: d29d 763c 0389 b875 ..v<...u L14
+
+ This method will parse the dump message to two packets dump:
+ (new packet starts with time stamp: 14:24:36.912863)
+ packet_list[0]: line L1 ~ line L7
+ packet_list[1]: line L8 ~ line L14
+
+ Args:
+ tcpdump_result: raw dump message from tcpdump
+ Returns:
+ packet_list
+ """
+ packet_list = []
+ packet = []
+ for line in tcpdump_result:
+ m = re.search('^\s*\d{2}:\d{2}:\d{2}\.\d+\s*', line)
+ if m:
+ # new packet found:
+ packet = []
+ packet.append(line)
+ index = tcpdump_result.index(line)
+ while index+1 < len(tcpdump_result):
+ packet_line = tcpdump_result[index+1]
+ m = re.search('^\s*\d{2}:\d{2}:\d{2}\.\d+\s*', packet_line)
+ if not m:
+ # not start of next packet
+ packet.append(packet_line)
+ index +=1
+ else:
+ # next packet starts
+ packet_list.append(packet)
+ break
+ return packet_list
+
+ def FindSrcAddrFromTcpdump(self, packet):
+ """Parse source IPv6 address from tcpdump message.
+
+ Args:
+ packet: tcpdump dump message
+ Returns:
+ source address in packet dump message
+ """
+ src_addr = None
+ for line in packet:
+ m = re.search('^\s*0x0000:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', line)
+ if m:
+ # first line of packet data:
+ src_addr = (m.group(5) + ':' + m.group(6) + ':' + m.group(7)
+ + ':' + m.group(8)) + ':'
+ index = packet.index(line)
+ m = re.search('^\s*0x0010:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', packet[index+1])
+ src_addr += (m.group(1) + ':' + m.group(2) + ':' + m.group(3)
+ + ':' + m.group(4))
+ break
+ return src_addr
+
+ def FindDstAddrFromTcpdump(self, packet):
+ """Parse destination IPv6 address from tcpdump message.
+
+ Args:
+ packet: tcpdump dump message
+ Returns:
+ source address in packet dump message
+ """
+ dst_addr = None
+ for line in packet:
+ m = re.search('^\s*0x0010:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', line)
+ if m:
+ # first line of packet data:
+ dst_addr = (m.group(5) + ':' + m.group(6) + ':' + m.group(7)
+ + ':' + m.group(8)) + ':'
+ index = packet.index(line)
+ m = re.search('^\s*0x0020:\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*([\da-f]{4})'
+ '\s*([\da-f]{4})\s*([\da-f]{4})\s*.*', packet[index+1])
+ dst_addr += (m.group(1) + ':' + m.group(2) + ':' + m.group(3)
+ + ':' + m.group(4))
+ break
+ return dst_addr
+
+ def CheckACSIPv6Connection(self, tcpdump_result):
+ """Examine captured packets, find IPv6 communication between ACS and device.
+
+ Args:
+ tcpdump_result: tcpdump result: captured packets message dump
+ Returns:
+ True: if bi-directional communication found from packet list.
+ False: otherwise
+ """
+ packet_list = self.ParseDumpMsgToPackets(tcpdump_result)
+ dev_to_acs = False
+ acs_to_dev = False
+ for pacekt in packet_list:
+ src_addr = IP(self.FindSrcAddrFromTcpdump(pacekt))
+ dst_addr = IP(self.FindDstAddrFromTcpdump(pacekt))
+ if (src_addr == IP(self.params['addr_ipv6'])
+ and dst_addr == IP(self.params['acs_ipv6'])):
+ dev_to_acs = True
+ if (dst_addr == IP(self.params['addr_ipv6'])
+ and src_addr == IP(self.params['acs_ipv6'])):
+ acs_to_dev = True
+
+ if dev_to_acs and acs_to_dev:
+ return True
+ else:
+ return False
+
+ def VerifyFactoryReset(self):
+ """Test case: 11721375, Verify the factory reset function of device.
+
+ Verify factory reset according to the following conditions:
+ - version
+ - address
+ - cat /etc/ntpd.conf
+ - cat /etc/resolv.conf
+ - cat /tmp/gvsbhost
+ - ls /tmp/gvsb*
+ - cat /tmp/cwmp/acs_url
+ - ls -l /var/media
+ - ls -l /rw/sage
+
+ This test will need to manually reset the device using reset button.
+ """
+ test_failed = False
+ info = self.log.CreateProgressInfo(
+ '10%', 'Verifying current image version, expected: '
+ + self.params['expected_version'])
+ self.log.SendLine(self.test_info, info)
+ self.VerifyExpectedVersion()
+
+ # get file time information:
+ wiz_bin_date = None
+ self.p_ssh.SendCmd('ls -l /rw/sage')
+ cmd_list = self.p_ssh.GetCmdOutput()
+ for line in cmd_list:
+ if 'Wiz.bin' in line:
+ m = re.search('.*(\d{4}-\d{2}-\d{2}\s*\d+:\d+).*', line)
+ if m:
+ wiz_bin_date = m.group(1)
+
+ info = self.log.CreateProgressInfo(
+ '20%', 'Please reset the device. '
+ 'Hold down reset button for 5 seconds...')
+ self.log.SendLine(self.test_info, info)
+
+ info = self.log.CreateProgressInfo(
+ '30%', 'Wait ' + str(self.__delay_5_min)
+ + ' for device to reset and reboot...')
+ self.log.SendLine(self.test_info, info)
+ time.sleep(self.__delay_5_min)
+
+ info = self.log.CreateProgressInfo(
+ '40%', 'Connecting to device...')
+ self.log.SendLine(self.test_info, info)
+ self.SshTunnel()
+
+ addr = self.bruno.GetIPv4Address()
+ if not addr:
+ info = self.log.CreateErrorInfo('critical',
+ 'Error! No IPv4 address found!')
+ self.log.SendLine(self.test_info, info)
+ test_failed = True
+ else:
+ info = self.log.CreateProgressInfo(
+ '50%', 'Checking device IPv4 address succeed: IPv4: '
+ + addr)
+ self.log.SendLine(self.test_info, info)
+
+ addr_v6 = self.bruno.GetIPv6Address()
+ if not addr_v6:
+ info = self.log.CreateErrorInfo('warning', 'No IPv6 address found!')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '55%', 'Checking device IPv6 address succeed: IPv6: '
+ + addr_v6[0])
+ self.log.SendLine(self.test_info, info)
+
+ if self.bruno.GetProductClass() == 'GFMS100':
+ # fat bruno, check Wiz.bin file:
+ found_file = False
+ self.p_ssh.SendCmd('ls -l /rw/sage')
+ cmd_list = self.p_ssh.GetCmdOutput()
+ for line in cmd_list:
+ if 'Wiz.bin' in line:
+ found_file = True
+ m = re.search('.*(\d{4}-\d{2}-\d{2}\s*\d+:\d+).*', line)
+ new_date = m.group(1)
+ if new_date == wiz_bin_date:
+ # if file is not updated
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'warning', 'Wiz.bin not updated: '
+ 'file date before reset: ' + wiz_bin_date
+ + ' new file date: ' + new_date)
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '60%', 'Checking Wiz.bin file succeed: new file created at: '
+ + new_date)
+ self.log.SendLine(self.test_info, info)
+ break
+ if not found_file:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'No Wiz.bin file found after reset!')
+ self.log.SendLine(self.test_info, info)
+
+ # verify ntpd.conf
+ ts = self.bruno.GetTimeServer()
+ if not ts:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'No time server found in file /etc/ntpd.conf!')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '65%', 'Checking time server (ntpd.conf) succeed: Timeserver: '
+ + ts)
+ self.log.SendLine(self.test_info, info)
+
+ # verify resolv.conf
+ dns = self.bruno.GetDNSServer()
+ if not dns:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'No DNS server found in file /etc/resolv.conf!')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '70%', 'Checking DNS server (resolv.conf) succeed: DNS: '
+ + dns)
+ self.log.SendLine(self.test_info, info)
+
+ # check gvsb:
+ gvsb = self.bruno.GetGVSBHost().strip()
+ if not gvsb or (gvsb != self.params['gvsb_host']):
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'GVSB host not found or not matching expected host!')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '75%', 'Checking GVSB server (gvsbhost) succeed: URL: '
+ + gvsb)
+ self.log.SendLine(self.test_info, info)
+
+ # check gvsb files:
+ self.bruno.dev_ssh.SendCmd('ls /tmp/gvsb*')
+ cmd_list = self.bruno.dev_ssh.GetCmdOutput()
+ gvsb_channel = False
+ gvsb_kick = False
+ gvsb_host = False
+ for line in cmd_list:
+ if 'gvsbhost' in line:
+ gvsb_host = True
+ elif 'gvsbchannel' in line:
+ gvsb_channel = True
+ elif 'gvsbkick' in line:
+ gvsb_kick = True
+ if not gvsb_channel or not gvsb_kick or not gvsb_host:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'GVSB files missing! Check /tmp/for gvsb files')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '80%', 'Checking GVSB files (/tmp/gvsb*) succeed. Files found: '
+ 'gvsbhost, gvsbchannel, gvsbkick.')
+ self.log.SendLine(self.test_info, info)
+
+ # verify acs url:
+ if self.bruno.GetACSUrl() != self.params['acs_url']:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'ACS URL is not expected! Expected URL: '
+ + self.params['acs_url'])
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '85%', 'Checking ACS URL (/tmp/cwmp/acs_url) succeed. URL: '
+ + self.params['acs_url'])
+ self.log.SendLine(self.test_info, info)
+
+ # verify sage properties
+ self.bruno.dev_ssh.SendCmd('ls -l /rw/sage')
+ cmd_list = self.bruno.dev_ssh.GetCmdOutput()
+ sage_prop = False
+ sage_prop_backup = False
+ for line in cmd_list:
+ if 'Sage.properties.autobackup' in line:
+ sage_prop_backup = True
+ elif 'Sage.properties' in line:
+ sage_prop = True
+ if not sage_prop or not sage_prop_backup:
+ test_failed = True
+ info = self.log.CreateErrorInfo(
+ 'critical', 'Missing file in /rw/sage folder.')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateProgressInfo(
+ '90%', 'Checking sage properties files (/rw/sage/) succeed.')
+ self.log.SendLine(self.test_info, info)
+
+ if test_failed:
+ info = self.log.CreateResultInfo(
+ 'Failed', 'Device configuration not '
+ 'restored completely after factory reset!')
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateResultInfo(
+ 'Pass', 'Device configuration '
+ 'successfully restored after factory reset.')
+ self.log.SendLine(self.test_info, info)
+ info = self.log.CreateProgressInfo(
+ '100%', 'Device configuration '
+ 'successfully restored after factory reset.')
+ self.log.SendLine(self.test_info, info)
+
+ def VerifyDefaultACSURL(self):
+ """Test case: 14319146. This method verifies default ACS URL on device."""
+ # this test needs to disable the Ethernet port, therefore can not
+ # be automated via ssh tunnel
+ print 'pass this test case'
+
+ def Run(self):
+ """Run the test case."""
+ ####### Add your code here -- BEGIN #######
+ print 'Test Started...'
+
+ self.Init()
+ time.sleep(2) # time delay between commands issued to Device
+ self.SshTunnel()
+ info = self.log.CreateProgressInfo(
+ '5%', 'SSH session to device successfully established!')
+ self.log.SendLine(self.test_info, info)
+
+ if self.test_info['testID'] == '11865129':
+ self.VerifyACSWithIPv6()
+ elif self.test_info['testID'] == '11721375':
+ self.VerifyFactoryReset()
+ elif self.test_info['testID'] == '14319146':
+ self.VerifyDefaultACSURL()
+ elif self.test_info['testID'] == '11721371':
+ print 'run test'
+ elif self.test_info['testID'] == '14312009':
+ print 'run test'
+ elif self.test_info['testID'] == '14186028':
+ print 'run test'
+ elif self.test_info['testID'] == '14312010':
+ print 'run test'
+ elif self.test_info['testID'] == '14247012':
+ print 'run test'
+ elif self.test_info['testID'] == '14186029':
+ print 'run test'
+ elif self.test_info['testID'] == '14312011':
+ print 'run test'
+ elif self.test_info['testID'] == '14293012':
+ print 'run test'
+ elif self.test_info['testID'] == '14165037':
+ print 'run test'
+ elif self.test_info['testID'] == '14315010':
+ print 'run test'
+ elif self.test_info['testID'] == '14247013':
+ print 'run test'
+ elif self.test_info['testID'] == '14312012':
+ print 'run test'
+ elif self.test_info['testID'] == '14293013':
+ print 'run test'
+ elif self.test_info['testID'] == '14311008':
+ print 'run test'
+ elif self.test_info['testID'] == '14293014':
+ print 'run test'
+ elif self.test_info['testID'] == '14311009':
+ print 'run test'
+ elif self.test_info['testID'] == '14186030':
+ print 'run test'
+ elif self.test_info['testID'] == '14319148':
+ print 'run test'
+ elif self.test_info['testID'] == '14266497':
+ print 'run test'
+ elif self.test_info['testID'] == '14312013':
+ print 'run test'
+ elif self.test_info['testID'] == '11874098':
+ print 'run test'
+ elif self.test_info['testID'] == '14315007':
+ print 'run test'
+ elif self.test_info['testID'] == '14247014':
+ print 'run test'
+ elif self.test_info['testID'] == '14293015':
+ print 'run test'
+ elif self.test_info['testID'] == '14293016':
+ print 'run test'
+ elif self.test_info['testID'] == '11865130':
+ print 'run test'
+ elif self.test_info['testID'] == '11722370':
+ print 'run test'
+ elif self.test_info['testID'] == '11874103':
+ print 'run test'
+ elif self.test_info['testID'] == '11843139':
+ print 'run test'
+ else:
+ print 'do nothing...'
+
+ print 'Test Completed...'
+ ####### Add your code here -- END #######
+
+ def Destructor(self):
+ """This is the destructor function to call for the user extened class."""
+ self.p_ssh.close()
+
+if __name__ == '__main__':
+ # Test cases defined in this file:
+ test_defined = ['11865129', '11721375', '14319146', '11721371',
+ '14312009', '14186028', '14312010', '14247012', '14186029',
+ '14312011', '14293012', '14165037', '14315010', '14247013',
+ '14312012', '14293013', '14311008', '14293014', '14311009',
+ '14186030', '14319148', '14266497', '14312013', '11874098',
+ '14315007', '14247014', '14293015', '14293016', '11865130',
+ '11722370', '11874103', '11843139']
+ # To execute test cases that defined in config file:
+ test_to_execute = testCase.TestCase.FindTestCaseToExecute('config.cfg')
+ for test_id in test_to_execute:
+ if test_id in test_defined:
+ test = BasicTR069Test(testID=test_id)
diff --git a/basic_network_testcases.py b/basic_network_testcases.py
new file mode 100644
index 0000000..2979227
--- /dev/null
+++ b/basic_network_testcases.py
@@ -0,0 +1,230 @@
+#!/usr/bin/python
+# Copyright 2012 Google Inc. All Rights Reserved.
+
+"""This class implements some basic networking test cases.
+
+ This class extends the TestCase Class.
+ This file implements some test cases to verify Bruno basic networking
+ features. In the following test cases, only those that are defined in
+ 'config.cfg' file will be executed.
+
+ Feature test cases include the following:
+ testID: 11874111 7.2.12 IPv6 Duplicate Address Detection
+ testID: 11724363 7.2.16 Ethernet/Moca Traffic Overloading
+ testID: 11843145 7.2.17 VLAN Pass Through
+ testID: 11723379 7.2.18 VLAN Tagging over Home Owner WiFi
+ testID: 11722378 7.2.19 VLAN Tagging over Guest WiFi
+ testID: 11721378 7.2.2 Verify BRUNO (connected to BRUNO-IS) can obtain
+ IPv4 address via RG's DHCP service
+ testID: 11792173 7.2.20 VLAN Tag Removal
+ testID: 11721382 7.2.21 IPv6 Verify subnet with /56, /64 length
+ testID: 11843141 7.2.5 Verify client can get correct IPv4 address if
+ the RG changes DHCP address pool
+ testID: 11721379 7.2.7 Verify time offset information obtained via
+ DHCP option2
+"""
+
+__author__ = 'Lehan Meng (lmeng@google.com)'
+
+
+import re
+import time
+
+import device
+import ip
+import ssh
+import testCase
+
+
+class BasicNetworkingTest(testCase.TestCase):
+ """Class for test cases of Bruno networking features.
+
+ Configuration Parameters:
+ testID: 11874111/11724363/11843145/11723379
+ /11722378/11721378/11792173/11721382/
+ /11843141/11721379
+ addr = Bruno's IP address
+ user = root
+ pwd = google
+ bruno_prompt = gfibertv#
+ file = cmdOutput.txt
+ title = Basic_Networking
+ """
+
+ def Init(self):
+ """Initialize the networking feature tests."""
+ # Get all device information.
+ info = self.log.CreateResultInfo(
+ '---', 'Networking test verification started...')
+ self.log.SendLine(self.test_info, info)
+ self.bruno = device.Bruno(user=self.params['user'],
+ addr=self.params['addr'],
+ bruno_prompt=self.params['bruno_prompt'],
+ addr_ipv6=self.params['addr_ipv6'])
+ self.bruno.SetLogging(self.log)
+ if not self.p_ssh:
+ self.p_ssh = ssh.SSH(user=self.params['user'],
+ addr=self.params['addr'],
+ bruno_prompt=self.params['bruno_prompt'],
+ addr_ipv6=self.params['addr_ipv6'])
+ self.bruno.dev_ssh = self.p_ssh
+ self.p_ssh.SetLogging(self.log)
+ return
+
+ def SshTunnel(self):
+ """Create ssh tunnel for the test."""
+ self.p_ssh.SshRetry(5, 15)
+ return
+
+ def VerifyDuplicatedAddress(self, ip_addr):
+ """Verify device can detect duplicated ipv6 address existing in network.
+
+ Set a duplicated ip address on the device.
+ Verify that the device can detect duplicated ip address
+
+ Args:
+ ip_addr: the duplicated address
+ Returns:
+ True: if duplicated detected
+ False: if duplicated address is not detected
+ """
+ time_stamp = self.bruno.GetTimeStamp()
+ self.bruno.dev_ssh.SendCmd('ip -6 addr add ' + ip_addr + '/64 dev br0')
+ time.sleep(1)
+ self.bruno.dev_ssh.SendCmd('dmesg | grep detected')
+ log_list = self.bruno.dev_ssh.GetCmdOutput()
+
+ pattern_line = ('\[\s*\d*\.\d{3}\]\s*\w*\d:\s* IPv6 duplicate address\s*('
+ + ip_addr + ')\s*[/\d+]*\s*detected!')
+ self.bruno.dev_ssh.SendCmd('ip -6 addr del ' + ip_addr + '/64 dev br0')
+
+ if self.bruno.FindLineInLog(log_list, time_stamp, pattern_line):
+ info = self.log.CreateResultInfo('Pass', 'Duplicated IPv6 address '
+ 'detected: ' + ip_addr)
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateResultInfo('Failed',
+ 'Duplicated IPv6 address not detected: '
+ + ip_addr + '. Verification Failed!')
+ self.log.SendLine(self.test_info, info)
+ #[132344.324] br0: IPv6 duplicate address fe80:... detected!
+
+ def GetIPv4Address(self):
+ """Test Bruno IP address. testID: 11874104."""
+ # Use ifconfig to check interface IP address
+ self.p_ssh.SendCmd(r'ifconfig br0')
+ line = self.p_ssh.GetCmdOutput(3)[1]
+
+ # Get Bruno IP address
+ address = ip.IPADDR(line).IsLikeIpv4Address()
+ if address is not None:
+ ip.IPADDR(address).IsValidIpv4Address()
+ info = self.log.CreateProgressInfo('---',
+ 'Verify IP: Bruno has IP address '
+ + address)
+ self.log.SendLine(self.test_info, info)
+ return address
+ else:
+ info = self.log.CreateErrorInfo('critical',
+ 'Error! Bruno does not have IP address!'
+ ' Exit!')
+ self.log.SendLine(self.test_info, info)
+ return False
+
+ def GetNetMask(self):
+ """Get Netmask from device."""
+ self.p_ssh.SendCmd(r'ifconfig br0')
+ line = self.p_ssh.GetCmdOutput(3)[1]
+
+ netmask = re.search(r'mask [0-9]+(?:\.[0-9]+){3}', line).group()
+ address = ip.IPADDR(netmask).IsLikeIpv4Address()
+ if address is not None:
+ ip.IPADDR(address).IsValidIpv4Address()
+ info = self.log.CreateProgressInfo('---',
+ 'Verify IP: Bruno has netmask: '
+ + address)
+ self.log.SendLine(self.test_info, info)
+ return address
+ else:
+ info = self.log.CreateErrorInfo('critical',
+ 'Error! Bruno does not have netmask!'
+ ' Exit!')
+ self.log.SendLine(self.test_info, info)
+ return False
+
+ def VerifyIPv6(self):
+ """Test Bruno IPv6 address. testID: 11722376."""
+ # Use ip addr to check interface IPv6 address
+ self.p_ssh.SendCmd(r'ip addr show dev br0')
+
+ for line in reversed(self.p_ssh.p_ssh.before.splitlines()[-10:]):
+ ipv6_addr = re.search('inet6.*dynamic', line)
+ # Get Bruno IPv6 address
+ if ipv6_addr is not None:
+ info = self.log.CreateProgressInfo('---',
+ 'Verify IPv6: '
+ 'Bruno has IPv6 address: '
+ + ipv6_addr.group())
+ self.log.SendLine(self.test_info, info)
+ break
+ else:
+ info = self.log.CreateErrorInfo('intermediate',
+ 'Wanring! '
+ 'Bruno did not have IPv6 address')
+ self.log.SendLine(self.test_info, info)
+ return
+
+ def VerifyDHCPOverBrunoIS(self):
+ """Verify Bruno (connected to Bruno-IS) can get IPv4 address from RG.
+
+ test ID: 11721378
+ This test requires thinBruno is connected to FatBruno, then to RG.
+ """
+ ip_addr = self.GetIPv4Address()
+ if ip_addr:
+ info = self.log.CreateResultInfo('Pass', 'Bruno can get IP address from '
+ 'RG while connecting to Bruno-IS. '
+ 'IP address: '+ ip_addr)
+ self.log.SendLine(self.test_info, info)
+ else:
+ info = self.log.CreateResultInfo('Failed',
+ 'Bruno cannot get IP address from '
+ 'RG. Verification Failed!')
+ self.log.SendLine(self.test_info, info)
+
+ def Run(self):
+ """Run the test case."""
+ ####### Add your code here -- BEGIN #######
+ print 'Test Started...'
+
+ self.Init()
+ time.sleep(2) # time delay between commands issued to Device
+ self.SshTunnel()
+
+ self.VerifyIPv6()
+
+ if self.test_info['testID'] == '11874111':
+ ip_addr = self.params['addr_ipv6_dup']
+ self.VerifyDuplicatedAddress(ip_addr)
+ elif self.test_info['testID'] == '11721378':
+ self.VerifyDHCPOverBrunoIS()
+
+ # TODO(lmeng): Test cases: '11724363', '11843145', '11723379', '11722378',
+ # '11792173', '11721382', '11843141', '11721379'
+
+ print 'Test Completed...'
+ ####### Add your code here -- END #######
+
+ def Destructor(self):
+ """This is the destructor function to call for the user extened class."""
+ self.p_ssh.close()
+
+if __name__ == '__main__':
+ # Test cases defined in this file:
+ test_defined = ['11874111', '11724363', '11843145', '11723379', '11722378',
+ '11721378', '11792173', '11721382', '11843141', '11721379']
+ # To execute test cases that defined in config file:
+ test_to_execute = testCase.TestCase.FindTestCaseToExecute('config.cfg')
+ for test_id in test_to_execute:
+ if test_id in test_defined:
+ test = BasicNetworkingTest(testID=test_id)
diff --git a/data/DataModel_requirement.cfg b/data/DataModel_requirement.cfg
new file mode 100644
index 0000000..35f5a43
--- /dev/null
+++ b/data/DataModel_requirement.cfg
@@ -0,0 +1,296 @@
+Device.DeviceInfo.AdditionalHardwareVersion
+Device.DeviceInfo.AdditionalSoftwareVersion
+Device.DeviceInfo.Description
+Device.DeviceInfo.HardwareVersion
+Device.DeviceInfo.Manufacturer
+Device.DeviceInfo.ManufacturerOUI
+Device.DeviceInfo.MemoryStatus.Free
+Device.DeviceInfo.MemoryStatus.Total
+Device.DeviceInfo.ModelName
+Device.DeviceInfo.ProcessStatus.CPUUsage
+Device.DeviceInfo.ProcessStatus.Process.{i}.CPUTime
+Device.DeviceInfo.ProcessStatus.Process.{i}.Command
+Device.DeviceInfo.ProcessStatus.Process.{i}.PID
+Device.DeviceInfo.ProcessStatus.Process.{i}.Priority
+Device.DeviceInfo.ProcessStatus.Process.{i}.Size
+Device.DeviceInfo.ProcessStatus.Process.{i}.State
+Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries
+Device.DeviceInfo.ProcessorNumberOfEntries
+Device.DeviceInfo.ProductClass
+Device.DeviceInfo.SerialNumber
+Device.DeviceInfo.SoftwareVersion
+Device.DeviceInfo.SupportedDataModelNumberOfEntries
+Device.DeviceInfo.TemperatureStatus.TemperatureSensorNumberOfEntries
+Device.DeviceInfo.UpTime
+Device.DeviceInfo.VendorConfigFileNumberOfEntries
+Device.DeviceInfo.VendorLogFileNumberOfEntries
+Device.Ethernet.Interface.{i}.DuplexMode
+Device.Ethernet.Interface.{i}.Enable
+Device.Ethernet.Interface.{i}.LastChange
+Device.Ethernet.Interface.{i}.LowerLayers
+Device.Ethernet.Interface.{i}.MACAddress
+Device.Ethernet.Interface.{i}.MaxBitRate
+Device.Ethernet.Interface.{i}.Name
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.BytesReceived
+Device.Ethernet.Interface.{i}.Stats.BytesSent
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsSent
+Device.Ethernet.Interface.{i}.Stats.ErrorsReceived
+Device.Ethernet.Interface.{i}.Stats.ErrorsSent
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.PacketsReceived
+Device.Ethernet.Interface.{i}.Stats.PacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.Ethernet.Interface.{i}.Status
+Device.Ethernet.Interface.{i}.Upstream
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualBitRate
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualDuplexMode
+Device.Ethernet.InterfaceNumberOfEntries
+Device.Ethernet.LinkNumberOfEntries
+Device.Ethernet.VLANTerminationNumberOfEntries
+Device.InterfaceStackNumberOfEntries
+Device.ManagementServer.CWMPRetryIntervalMultiplier
+Device.ManagementServer.CWMPRetryMinimumWaitInterval
+Device.ManagementServer.ConnectionRequestPassword
+Device.ManagementServer.ConnectionRequestURL
+Device.ManagementServer.ConnectionRequestUsername
+Device.ManagementServer.DefaultActiveNotificationThrottle
+Device.ManagementServer.EnableCWMP
+Device.ManagementServer.ManageableDeviceNumberOfEntries
+Device.ManagementServer.ParameterKey
+Device.ManagementServer.Password
+Device.ManagementServer.PeriodicInformEnable
+Device.ManagementServer.PeriodicInformInterval
+Device.ManagementServer.PeriodicInformTime
+Device.ManagementServer.STUNEnable
+Device.ManagementServer.URL
+Device.ManagementServer.UpgradesManaged
+Device.ManagementServer.Username
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.MACAddress
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.NodeID
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PHYRxRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PHYTxRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.PreferredNC
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxBcastPowerLevel
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxErroredAndMissedPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxPowerLevel
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.RxSNR
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxBcastRate
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxPackets
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.TxPowerControlReduction
+Device.MoCA.Interface.{i}.AssociatedDeviceNumberOfEntries
+Device.MoCA.Interface.{i}.BackupNC
+Device.MoCA.Interface.{i}.CurrentOperFreq
+Device.MoCA.Interface.{i}.CurrentVersion
+Device.MoCA.Interface.{i}.Enable
+Device.MoCA.Interface.{i}.FirmwareVersion
+Device.MoCA.Interface.{i}.HighestVersion
+Device.MoCA.Interface.{i}.LastChange
+Device.MoCA.Interface.{i}.LastOperFreq
+Device.MoCA.Interface.{i}.LowerLayers
+Device.MoCA.Interface.{i}.MACAddress
+Device.MoCA.Interface.{i}.Name
+Device.MoCA.Interface.{i}.NetworkCoordinator
+Device.MoCA.Interface.{i}.NodeID
+Device.MoCA.Interface.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.PrivacyEnabled
+Device.MoCA.Interface.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsSent
+Device.MoCA.Interface.{i}.Stats.BytesReceived
+Device.MoCA.Interface.{i}.Stats.BytesSent
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsReceived
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsSent
+Device.MoCA.Interface.{i}.Stats.ErrorsReceived
+Device.MoCA.Interface.{i}.Stats.ErrorsSent
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsSent
+Device.MoCA.Interface.{i}.Stats.PacketsReceived
+Device.MoCA.Interface.{i}.Stats.PacketsSent
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsSent
+Device.MoCA.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.MoCA.Interface.{i}.Status
+Device.MoCA.Interface.{i}.Upstream
+Device.MoCA.InterfaceNumberOfEntries
+Device.PeriodicStatistics.MaxReportSamples
+Device.PeriodicStatistics.MinSampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.FetchSamples
+Device.PeriodicStatistics.SampleSet.{i}.Name
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+Device.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+Device.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+Device.PeriodicStatistics.SampleSet.{i}.ReportSamples
+Device.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+Device.PeriodicStatistics.SampleSet.{i}.SampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Status
+Device.PeriodicStatistics.SampleSet.{i}.TimeReference
+Device.PeriodicStatistics.SampleSetNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.GroupAddress
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEndNumberOfEntries
+Device.Services.STBServiceNumberOfEntries
+Device.Services.StorageServices.Capabilities.FTPCapable
+Device.Services.StorageServices.Capabilities.HTTPCapable
+Device.Services.StorageServices.Capabilities.HTTPSCapable
+Device.Services.StorageServices.Capabilities.HTTPWritable
+Device.Services.StorageServices.Capabilities.SFTPCapable
+Device.Services.StorageServices.Capabilities.SupportedFileSystemTypes
+Device.Services.StorageServices.Capabilities.SupportedNetworkProtocols
+Device.Services.StorageServices.Capabilities.SupportedRaidTypes
+Device.Services.StorageServices.Capabilities.VolumeEncryptionCapable
+Device.Services.StorageServices.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.Capacity
+Device.Services.StorageServices.LogicalVolume.{i}.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.FileSystem
+Device.Services.StorageServices.LogicalVolume.{i}.FolderNumberOfEntries
+Device.Services.StorageServices.LogicalVolume.{i}.Name
+Device.Services.StorageServices.LogicalVolume.{i}.Status
+Device.Services.StorageServices.LogicalVolume.{i}.ThresholdLimit
+Device.Services.StorageServices.LogicalVolume.{i}.UsedSpace
+Device.Services.StorageServices.LogicalVolume.{i}.X_CATAWAMPUS-ORG_ReadOnly
+Device.Services.StorageServices.LogicalVolumeNumberOfEntries
+Device.Services.StorageServices.PhysicalMedium.{i}.Capacity
+Device.Services.StorageServices.PhysicalMedium.{i}.ConnectionType
+Device.Services.StorageServices.PhysicalMedium.{i}.FirmwareVersion
+Device.Services.StorageServices.PhysicalMedium.{i}.Health
+Device.Services.StorageServices.PhysicalMedium.{i}.HotSwappable
+Device.Services.StorageServices.PhysicalMedium.{i}.Model
+Device.Services.StorageServices.PhysicalMedium.{i}.Name
+Device.Services.StorageServices.PhysicalMedium.{i}.Removable
+Device.Services.StorageServices.PhysicalMedium.{i}.SMARTCapable
+Device.Services.StorageServices.PhysicalMedium.{i}.SerialNumber
+Device.Services.StorageServices.PhysicalMedium.{i}.Vendor
+Device.Services.StorageServices.PhysicalMediumNumberOfEntries
+Device.Services.StorageServices.StorageArrayNumberOfEntries
+Device.Services.StorageServices.UserAccountNumberOfEntries
+Device.Services.StorageServices.UserGroupNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.BadEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.CorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.EraseBlockSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.IOSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.MaxEraseCount
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.ReservedEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.DataBytes
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Status
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolumeNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.TotalEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.UncorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMediaNumberOfEntries
+InternetGatewayDevice.DeviceInfo.AdditionalHardwareVersion
+InternetGatewayDevice.DeviceInfo.AdditionalSoftwareVersion
+InternetGatewayDevice.DeviceInfo.Description
+InternetGatewayDevice.DeviceInfo.HardwareVersion
+InternetGatewayDevice.DeviceInfo.Manufacturer
+InternetGatewayDevice.DeviceInfo.ManufacturerOUI
+InternetGatewayDevice.DeviceInfo.ModelName
+InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion
+InternetGatewayDevice.DeviceInfo.ProductClass
+InternetGatewayDevice.DeviceInfo.SerialNumber
+InternetGatewayDevice.DeviceInfo.SoftwareVersion
+InternetGatewayDevice.DeviceInfo.SpecVersion
+InternetGatewayDevice.DeviceInfo.UpTime
+InternetGatewayDevice.DeviceInfo.VendorConfigFileNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANWLANConfigurationNumberOfEntries
+InternetGatewayDevice.LANDeviceNumberOfEntries
+InternetGatewayDevice.ManagementServer.ConnectionRequestPassword
+InternetGatewayDevice.ManagementServer.ConnectionRequestURL
+InternetGatewayDevice.ManagementServer.ConnectionRequestUsername
+InternetGatewayDevice.ManagementServer.DefaultActiveNotificationThrottle
+InternetGatewayDevice.ManagementServer.EnableCWMP
+InternetGatewayDevice.ManagementServer.ParameterKey
+InternetGatewayDevice.ManagementServer.Password
+InternetGatewayDevice.ManagementServer.PeriodicInformEnable
+InternetGatewayDevice.ManagementServer.PeriodicInformInterval
+InternetGatewayDevice.ManagementServer.PeriodicInformTime
+InternetGatewayDevice.ManagementServer.URL
+InternetGatewayDevice.ManagementServer.UpgradesManaged
+InternetGatewayDevice.ManagementServer.Username
+InternetGatewayDevice.PeriodicStatistics.MaxReportSamples
+InternetGatewayDevice.PeriodicStatistics.MinSampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.FetchSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Name
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Status
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.TimeReference
+InternetGatewayDevice.PeriodicStatistics.SampleSetNumberOfEntries
+InternetGatewayDevice.Time.CurrentLocalTime
+InternetGatewayDevice.Time.Enable
+InternetGatewayDevice.Time.LocalTimeZoneName
+InternetGatewayDevice.WANDeviceNumberOfEntries
+TraceRoute.DSCP
+TraceRoute.DataBlockSize
+TraceRoute.DiagnosticsState
+TraceRoute.Host
+TraceRoute.Interface
+TraceRoute.MaxHopCount
+TraceRoute.NumberOfTries
+TraceRoute.ResponseTime
+TraceRoute.RouteHopsNumberOfEntries
+TraceRoute.Timeout
+X_CATAWAMPUS-ORG_CATAWAMPUS.RuntimeEnvInfo
+X_GOOGLE-COM_GFIBERTV.Mailbox.Name
+X_GOOGLE-COM_GFIBERTV.Mailbox.Node
+X_GOOGLE-COM_GFIBERTV.Mailbox.NodeList
+X_GOOGLE-COM_GFIBERTV.Mailbox.Value
+X_GOOGLE-COM_GVSB.EpgPrimary
+X_GOOGLE-COM_GVSB.EpgSecondary
+X_GOOGLE-COM_GVSB.GvsbChannelLineup
+X_GOOGLE-COM_GVSB.GvsbKick
+X_GOOGLE-COM_GVSB.GvsbServer
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.TSPacketsReceived
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.PacketDiscontinuityCounter
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.EmptyBufferTime
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.Overruns
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.Underruns
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.PacketsReceived
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.PacketsRetransmitted
+STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.TCPStats.BytesReceived
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.Status
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.SupportedResolutions
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.PreferredResolution
+STBService.{i}.Components.HDMI.{i}.ResolutionValue
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.EEDID
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.AutoLipSyncSupport
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.VideoLatency
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.HDMI3DPresent
+STBService.{i}.Components.HDMI.{i}.DisplayDevice.CECSupport
diff --git a/data/DataModel_requirement_1.cfg b/data/DataModel_requirement_1.cfg
new file mode 100644
index 0000000..c940323
--- /dev/null
+++ b/data/DataModel_requirement_1.cfg
@@ -0,0 +1,509 @@
+Device.Bridging.
+Device.Bridging.Bridge.{i}.
+Device.Bridging.Bridge.{i}.Port.{i}.
+Device.Bridging.Bridge.{i}.Port.{i}.Stats.
+Device.Bridging.Bridge.{i}.VLANPort.{i}.
+Device.DeviceInfo
+Device.DeviceInfo.AdditionalHardwareVersion
+Device.DeviceInfo.AdditionalSoftwareVersion
+Device.DeviceInfo.Description
+Device.DeviceInfo.HardwareVersion
+Device.DeviceInfo.Manufacturer
+Device.DeviceInfo.ManufacturerOUI
+Device.DeviceInfo.MemoryStatus.
+Device.DeviceInfo.MemoryStatus.Free
+Device.DeviceInfo.MemoryStatus.Total
+Device.DeviceInfo.ModelName
+Device.DeviceInfo.NetworkProperties.
+Device.DeviceInfo.ProcessStatus.
+Device.DeviceInfo.ProcessStatus.CPUUsage
+Device.DeviceInfo.ProcessStatus.Process.{i}.
+Device.DeviceInfo.ProcessStatus.Process.{i}.CPUTime
+Device.DeviceInfo.ProcessStatus.Process.{i}.Command
+Device.DeviceInfo.ProcessStatus.Process.{i}.PID
+Device.DeviceInfo.ProcessStatus.Process.{i}.Priority
+Device.DeviceInfo.ProcessStatus.Process.{i}.Size
+Device.DeviceInfo.ProcessStatus.Process.{i}.State
+Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries
+Device.DeviceInfo.Processor.{i}.
+Device.DeviceInfo.ProcessorNumberOfEntries
+Device.DeviceInfo.ProductClass
+Device.DeviceInfo.ProxierInfo.
+Device.DeviceInfo.SerialNumber
+Device.DeviceInfo.SoftwareVersion
+Device.DeviceInfo.SupportedDataModel.{i}.
+Device.DeviceInfo.SupportedDataModelNumberOfEntries
+Device.DeviceInfo.TemperatureStatus.
+Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}.
+Device.DeviceInfo.TemperatureStatus.TemperatureSensorNumberOfEntries
+Device.DeviceInfo.UpTime
+Device.DeviceInfo.VendorConfigFile.{i}.
+Device.DeviceInfo.VendorConfigFileNumberOfEntries
+Device.DeviceInfo.VendorLogFile.{i}.
+Device.DeviceInfo.VendorLogFileNumberOfEntries
+Device.Ethernet.
+Device.Ethernet.Interface.{i}.
+Device.Ethernet.Interface.{i}.DuplexMode
+Device.Ethernet.Interface.{i}.Enable
+Device.Ethernet.Interface.{i}.LastChange
+Device.Ethernet.Interface.{i}.LowerLayers
+Device.Ethernet.Interface.{i}.MACAddress
+Device.Ethernet.Interface.{i}.MaxBitRate
+Device.Ethernet.Interface.{i}.Name
+Device.Ethernet.Interface.{i}.Stats.
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.BroadcastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.BytesReceived
+Device.Ethernet.Interface.{i}.Stats.BytesSent
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.DiscardPacketsSent
+Device.Ethernet.Interface.{i}.Stats.ErrorsReceived
+Device.Ethernet.Interface.{i}.Stats.ErrorsSent
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.MulticastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.PacketsReceived
+Device.Ethernet.Interface.{i}.Stats.PacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsReceived
+Device.Ethernet.Interface.{i}.Stats.UnicastPacketsSent
+Device.Ethernet.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.Ethernet.Interface.{i}.Status
+Device.Ethernet.Interface.{i}.Upstream
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualBitRate
+Device.Ethernet.Interface.{i}.X_CATAWAMPUS-ORG_ActualDuplexMode
+Device.Ethernet.InterfaceNumberOfEntries
+Device.Ethernet.Link.{i}.
+Device.Ethernet.Link.{i}.Stats.
+Device.Ethernet.LinkNumberOfEntries
+Device.Ethernet.RMONStats.{i}.
+Device.Ethernet.VLANTerminationNumberOfEntries
+Device.IP.ActivePort.{i}.
+Device.IP.Diagnostics.DownloadDiagnostics.
+Device.IP.Diagnostics.IPPing.
+Device.IP.Diagnostics.TraceRoute.
+Device.IP.Diagnostics.TraceRoute.RouteHops.{i}.
+Device.IP.Diagnostics.UDPEchoConfig.
+Device.IP.Diagnostics.UploadDiagnostics.
+Device.IP.Interface.{i}.
+Device.IP.Interface.{i}.IPv4Address.{i}.
+Device.IP.Interface.{i}.IPv6Address.{i}.
+Device.IP.Interface.{i}.IPv6Prefix.{i}.
+Device.IP.Interface.{i}.Stats.{i}.
+Device.InterfaceStackNumberOfEntries
+Device.ManagementServer.
+Device.ManagementServer.AutonomousTransferCompletePolicy.
+Device.ManagementServer.CWMPRetryIntervalMultiplier
+Device.ManagementServer.CWMPRetryMinimumWaitInterval
+Device.ManagementServer.ConnectionRequestPassword
+Device.ManagementServer.ConnectionRequestURL
+Device.ManagementServer.ConnectionRequestUsername
+Device.ManagementServer.DUStateChangeComplPolicy.
+Device.ManagementServer.DefaultActiveNotificationThrottle
+Device.ManagementServer.DownloadAvailability.
+Device.ManagementServer.DownloadAvailability.Announcement.
+Device.ManagementServer.DownloadAvailability.Announcement.Group.{i}.
+Device.ManagementServer.DownloadAvailability.Query.
+Device.ManagementServer.EmbeddedDevice.{i}.
+Device.ManagementServer.EnableCWMP
+Device.ManagementServer.ManageableDevice.{i}.
+Device.ManagementServer.ManageableDeviceNumberOfEntries
+Device.ManagementServer.ParameterKey
+Device.ManagementServer.Password
+Device.ManagementServer.PeriodicInformEnable
+Device.ManagementServer.PeriodicInformInterval
+Device.ManagementServer.PeriodicInformTime
+Device.ManagementServer.STUNEnable
+Device.ManagementServer.URL
+Device.ManagementServer.UpgradesManaged
+Device.ManagementServer.Username
+Device.ManagementServer.VirtualDevice.{i}.
+Device.MoCA.
+Device.MoCA.Interface.{i}.AssociatedDeviceNumberOfEntries
+Device.MoCA.Interface.{i}.BackupNC
+Device.MoCA.Interface.{i}.CurrentOperFreq
+Device.MoCA.Interface.{i}.CurrentVersion
+Device.MoCA.Interface.{i}.Enable
+Device.MoCA.Interface.{i}.FirmwareVersion
+Device.MoCA.Interface.{i}.HighestVersion
+Device.MoCA.Interface.{i}.LastChange
+Device.MoCA.Interface.{i}.LastOperFreq
+Device.MoCA.Interface.{i}.LowerLayers
+Device.MoCA.Interface.{i}.MACAddress
+Device.MoCA.Interface.{i}.Name
+Device.MoCA.Interface.{i}.NetworkCoordinator
+Device.MoCA.Interface.{i}.NodeID
+Device.MoCA.Interface.{i}.PacketAggregationCapability
+Device.MoCA.Interface.{i}.PrivacyEnabled
+Device.MoCA.Interface.{i}.QAM256Capable
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.BroadcastPacketsSent
+Device.MoCA.Interface.{i}.Stats.BytesReceived
+Device.MoCA.Interface.{i}.Stats.BytesSent
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsReceived
+Device.MoCA.Interface.{i}.Stats.DiscardPacketsSent
+Device.MoCA.Interface.{i}.Stats.ErrorsReceived
+Device.MoCA.Interface.{i}.Stats.ErrorsSent
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.MulticastPacketsSent
+Device.MoCA.Interface.{i}.Stats.PacketsReceived
+Device.MoCA.Interface.{i}.Stats.PacketsSent
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsReceived
+Device.MoCA.Interface.{i}.Stats.UnicastPacketsSent
+Device.MoCA.Interface.{i}.Stats.UnknownProtoPacketsReceived
+Device.MoCA.Interface.{i}.Status
+Device.MoCA.Interface.{i}.Upstream
+Device.MoCA.InterfaceNumberOfEntries
+Device.MoCA.Interface.{i}.
+Device.MoCA.Interface.{i}.AssociatedDevice.{i}.
+Device.MoCA.Interface.{i}.QoS.
+Device.MoCA.Interface.{i}.QoS.FlowStats.{i}.
+Device.MoCA.Interface.{i}.Stats.
+Device.PeriodicStatistics.MaxReportSamples
+Device.PeriodicStatistics.MinSampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.FetchSamples
+Device.PeriodicStatistics.SampleSet.{i}.Name
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+Device.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+Device.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+Device.PeriodicStatistics.SampleSet.{i}.ReportSamples
+Device.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+Device.PeriodicStatistics.SampleSet.{i}.SampleInterval
+Device.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+Device.PeriodicStatistics.SampleSet.{i}.Status
+Device.PeriodicStatistics.SampleSet.{i}.TimeReference
+Device.PeriodicStatistics.SampleSetNumberOfEntries
+Device.QoS.
+Device.QoS.App.{i}.
+Device.QoS.Classification.{i}.
+Device.QoS.Flow.{i}.
+Device.QoS.Policer.{i}.
+Device.QoS.Queue.{i}.
+Device.QoS.QueueStats.{i}.
+Device.QoS.Shaper.{i}.
+Device.Services.STBService.{i}.
+Device.Services.STBService.{i}.AVPlayers.
+Device.Services.STBService.{i}.AVPlayers.AVPlayer.{i}.
+Device.Services.STBService.{i}.AVStreams.
+Device.Services.STBService.{i}.AVStreams.AVStream{i}.
+Device.Services.STBService.{i}.Applications.
+Device.Services.STBService.{i}.Applications.AudienceStats.
+Device.Services.STBService.{i}.Applications.AudienceStats.Channel.{i}.
+Device.Services.STBService.{i}.Capabilities.AudienceStats.
+Device.Services.STBService.{i}.Capabilities.AudioDecoder.
+Device.Services.STBService.{i}.Capabilities.AudioOutput.
+Device.Services.STBService.{i}.Capabilities.DRM
+Device.Services.STBService.{i}.Capabilities.FrontEnd.
+Device.Services.STBService.{i}.Capabilities.FrontEnd.IP.
+Device.Services.STBService.{i}.Capabilities.PVR.
+Device.Services.STBService.{i}.Capabilities.ServiceMonitoring.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG2Part2.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG2Part2.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part10.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part10.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part2.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.MPEG4Part2.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.SMPTEVC1.
+Device.Services.STBService.{i}.Capabilities.VideoDecoder.SMPTEVC1.ProfileLevel.{i}.
+Device.Services.STBService.{i}.Capabilities.VideoOutput.
+Device.Services.STBService.{i}.Components.
+Device.Services.STBService.{i}.Components.AudioDecoder.{i}.
+Device.Services.STBService.{i}.Components.AudioOutput.{i}.
+Device.Services.STBService.{i}.Components.DRM.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Dejittering.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.CurrentDay
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.QuarterHour.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupStats.{i}.Total
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroup.{i}.GroupAddress
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.IGMP.ClientGroupNumberOfEntries
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Inbound.{i}.
+Device.Services.STBService.{i}.Components.FrontEnd.{i}.IP.Outbound.{i}.
+Device.Services.STBService.{i}.Components.FrontEndNumberOfEntries
+Device.Services.STBService.{i}.Components.HDMI.{i}.
+Device.Services.STBService.{i}.Components.HDMI.{i}.DisplayDevice
+Device.Services.STBService.{i}.Components.PVR.
+Device.Services.STBService.{i}.Components.PVR.Storage.{i}.
+Device.Services.STBService.{i}.Components.SPDIF.{i}.
+Device.Services.STBService.{i}.Components.VideoDecoder.{i}.
+Device.Services.STBService.{i}.Components.VideoOutput.{i}.
+Device.Services.STBService.{i}.ServiceMonitoring.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Sample.HighLevelMetricStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Sample.VideoResponseStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.AudioDecoderStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.DejitteringStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.MPEG2TSStats.
+Device.Services.STBService.{i}.ServiceMonitoring.MainStream.{i}.Total.VideoDecoderStats.
+Device.Services.STBServiceNumberOfEntries
+Device.Services.STBService{i}.Capabilities.
+Device.Services.StorageServices.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.Folder.{i}.
+Device.Services.StorageServices.{i}.LogicalVolume.{i}.Folder.{i}.Quota.
+Device.Services.StorageServices.{i}.PhysicalMedium.{i}.
+Device.Services.StorageServices.{i}.StorageArray.{i}.
+Device.Services.StorageServices.Capabilities.FTPCapable
+Device.Services.StorageServices.Capabilities.HTTPCapable
+Device.Services.StorageServices.Capabilities.HTTPSCapable
+Device.Services.StorageServices.Capabilities.HTTPWritable
+Device.Services.StorageServices.Capabilities.SFTPCapable
+Device.Services.StorageServices.Capabilities.SupportedFileSystemTypes
+Device.Services.StorageServices.Capabilities.SupportedNetworkProtocols
+Device.Services.StorageServices.Capabilities.SupportedRaidTypes
+Device.Services.StorageServices.Capabilities.VolumeEncryptionCapable
+Device.Services.StorageServices.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.Capacity
+Device.Services.StorageServices.LogicalVolume.{i}.Enable
+Device.Services.StorageServices.LogicalVolume.{i}.FileSystem
+Device.Services.StorageServices.LogicalVolume.{i}.FolderNumberOfEntries
+Device.Services.StorageServices.LogicalVolume.{i}.Name
+Device.Services.StorageServices.LogicalVolume.{i}.Status
+Device.Services.StorageServices.LogicalVolume.{i}.ThresholdLimit
+Device.Services.StorageServices.LogicalVolume.{i}.UsedSpace
+Device.Services.StorageServices.LogicalVolume.{i}.X_CATAWAMPUS-ORG_ReadOnly
+Device.Services.StorageServices.LogicalVolumeNumberOfEntries
+Device.Services.StorageServices.PhysicalMedium.{i}.Capacity
+Device.Services.StorageServices.PhysicalMedium.{i}.ConnectionType
+Device.Services.StorageServices.PhysicalMedium.{i}.FirmwareVersion
+Device.Services.StorageServices.PhysicalMedium.{i}.Health
+Device.Services.StorageServices.PhysicalMedium.{i}.HotSwappable
+Device.Services.StorageServices.PhysicalMedium.{i}.Model
+Device.Services.StorageServices.PhysicalMedium.{i}.Name
+Device.Services.StorageServices.PhysicalMedium.{i}.Removable
+Device.Services.StorageServices.PhysicalMedium.{i}.SMARTCapable
+Device.Services.StorageServices.PhysicalMedium.{i}.SerialNumber
+Device.Services.StorageServices.PhysicalMedium.{i}.Vendor
+Device.Services.StorageServices.PhysicalMediumNumberOfEntries
+Device.Services.StorageServices.StorageArrayNumberOfEntries
+Device.Services.StorageServices.UserAccountNumberOfEntries
+Device.Services.StorageServices.UserGroupNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.BadEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.CorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.EraseBlockSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.IOSize
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.MaxEraseCount
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.ReservedEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.DataBytes
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Name
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolume.{i}.Status
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.SubVolumeNumberOfEntries
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.TotalEraseBlocks
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMedia.{i}.UncorrectedErrors
+Device.Services.StorageServices.X_CATAWAMPUS-ORG_FlashMediaNumberOfEntries
+Device.USB.
+Device.USB.Interface.{i}.
+Device.USB.Interface.{i}.Stats.
+Device.USB.Port.{i}.
+Device.USB.USBHosts.
+Device.USB.USBHosts.Host.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.
+Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}.
+Device.WiFi
+Device.WiFi.AccessPoint.{i}.
+Device.WiFi.AccessPoint.{i}.Accounting.
+Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.
+Device.WiFi.AccessPoint.{i}.Security.
+Device.WiFi.AccessPoint.{i}.WPS.
+Device.WiFi.EndPoint.{i}.
+Device.WiFi.EndPoint.{i}.Profile.{i}.
+Device.WiFi.EndPoint.{i}.Profile.{i}.Security.
+Device.WiFi.EndPoint.{i}.Profile.{i}.WPS.
+Device.WiFi.EndPoint.{i}.Security
+Device.WiFi.EndPoint.{i}.Stats
+Device.WiFi.Radio.{i}.
+Device.WiFi.Radio.{i}.Antenna.
+Device.WiFi.Radio.{i}.Stats.
+Device.WiFi.SSID.{i}.
+Device.WiFi.SSID.{i}.Stats.
+InternetGatewayDevice.
+InternetGatewayDevice.DeviceConfig.
+InternetGatewayDevice.DeviceInfo.
+InternetGatewayDevice.DeviceInfo.AdditionalHardwareVersion
+InternetGatewayDevice.DeviceInfo.AdditionalSoftwareVersion
+InternetGatewayDevice.DeviceInfo.Description
+InternetGatewayDevice.DeviceInfo.HardwareVersion
+InternetGatewayDevice.DeviceInfo.Manufacturer
+InternetGatewayDevice.DeviceInfo.ManufacturerOUI
+InternetGatewayDevice.DeviceInfo.ModelName
+InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion
+InternetGatewayDevice.DeviceInfo.ProductClass
+InternetGatewayDevice.DeviceInfo.SerialNumber
+InternetGatewayDevice.DeviceInfo.SoftwareVersion
+InternetGatewayDevice.DeviceInfo.SpecVersion
+InternetGatewayDevice.DeviceInfo.UpTime
+InternetGatewayDevice.DeviceInfo.VendorConfigFile.{i}.
+InternetGatewayDevice.DeviceInfo.VendorConfigFileNumberOfEntries
+InternetGatewayDevice.IPPingDiagnostics.
+InternetGatewayDevice.LANConfigSecurity.
+InternetGatewayDevice.LANDevice.{i}.
+InternetGatewayDevice.LANDevice.{i}.Hosts.
+InternetGatewayDevice.LANDevice.{i}.Hosts.Host.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceConfig.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceConfig.{i}.Stats.
+InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.
+InternetGatewayDevice.LANDevice.{i}.LANHostConfigManagement.IPInterface.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceConfig.{i}.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceConfig.{i}.Stats.
+InternetGatewayDevice.LANDevice.{i}.LANUSBInterfaceNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.LANWLANConfigurationNumberOfEntries
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.AssociatedDevice.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.PreSharedKey.{i}.
+InternetGatewayDevice.LANDevice.{i}.WLANConfiguration.{i}.WEPKey.{i}.
+InternetGatewayDevice.LANDeviceNumberOfEntries
+InternetGatewayDevice.Layer2Bridging.
+InternetGatewayDevice.Layer2Bridging.AvailableInterface.{i}.
+InternetGatewayDevice.Layer2Bridging.Bridge.{i}.
+InternetGatewayDevice.Layer2Bridging.Filter.{i}.
+InternetGatewayDevice.Layer2Bridging.Marking.{i}.
+InternetGatewayDevice.Layer3Forwarding.
+InternetGatewayDevice.Layer3Forwarding.Forwarding.{i}.
+InternetGatewayDevice.ManagementServer.
+InternetGatewayDevice.ManagementServer.ConnectionRequestPassword
+InternetGatewayDevice.ManagementServer.ConnectionRequestURL
+InternetGatewayDevice.ManagementServer.ConnectionRequestUsername
+InternetGatewayDevice.ManagementServer.DefaultActiveNotificationThrottle
+InternetGatewayDevice.ManagementServer.EnableCWMP
+InternetGatewayDevice.ManagementServer.ManageableDevice.{i}.
+InternetGatewayDevice.ManagementServer.ParameterKey
+InternetGatewayDevice.ManagementServer.Password
+InternetGatewayDevice.ManagementServer.PeriodicInformEnable
+InternetGatewayDevice.ManagementServer.PeriodicInformInterval
+InternetGatewayDevice.ManagementServer.PeriodicInformTime
+InternetGatewayDevice.ManagementServer.URL
+InternetGatewayDevice.ManagementServer.UpgradesManaged
+InternetGatewayDevice.ManagementServer.Username
+InternetGatewayDevice.PeriodicStatistics.MaxReportSamples
+InternetGatewayDevice.PeriodicStatistics.MinSampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.FetchSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Name
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.CalculationMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Enable
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Failures
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.HighThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.LowThreshold
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Reference
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleMode
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.SuspectData
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.Values
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ParameterNumberOfEntries
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportEndTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportSamples
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.ReportStartTime
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleInterval
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.SampleSeconds
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.Status
+InternetGatewayDevice.PeriodicStatistics.SampleSet.{i}.TimeReference
+InternetGatewayDevice.PeriodicStatistics.SampleSetNumberOfEntries
+InternetGatewayDevice.QueueManagement.
+InternetGatewayDevice.QueueManagement.App.{i}.
+InternetGatewayDevice.QueueManagement.Classification.{i}.
+InternetGatewayDevice.QueueManagement.Flow.{i}.
+InternetGatewayDevice.QueueManagement.Policer.{i}.
+InternetGatewayDevice.QueueManagement.Queue.{i}.
+InternetGatewayDevice.Services.
+InternetGatewayDevice.Time.
+InternetGatewayDevice.Time.CurrentLocalTime
+InternetGatewayDevice.Time.Enable
+InternetGatewayDevice.Time.LocalTimeZoneName
+InternetGatewayDevice.UserInterface.
+InternetGatewayDevice.WANDevice.{i}.
+InternetGatewayDevice.WANDevice.{i}.WAN-CommonInterfaceConfig.WANAccessType
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.Enable
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.LowerOpticalThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.LowerTransmitPowerThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.OpticalSignalLevel
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.Status
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.TransmitOpticalLevel
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.UpperOpticalThreshold
+InternetGatewayDevice.WANDevice.{i}.WAN-OpticalInterfaceConfig.UpperTransmitPowerThreshold
+InternetGatewayDevice.WANDevice.{i}.WANCommonInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WANCommonInterfaceConfig.Connection.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANEthernetLinkConfig.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.PortMapping.{i}.
+InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection.{i}.Stats.
+InternetGatewayDevice.WANDevice.{i}.WANEthernetInterfaceConfig.
+InternetGatewayDevice.WANDevice.{i}.WANEthernetInterfaceConfig.Stats.
+InternetGatewayDevice.WANDeviceNumberOfEntries
+TraceRoute.
+TraceRoute.DSCP
+TraceRoute.DataBlockSize
+TraceRoute.DiagnosticsState
+TraceRoute.Host
+TraceRoute.Interface
+TraceRoute.MaxHopCount
+TraceRoute.NumberOfTries
+TraceRoute.ResponseTime
+TraceRoute.RouteHopsNumberOfEntries
+TraceRoute.Timeout
+VoiceService.{i}.
+VoiceService.{i}.Capabilities.
+VoiceService.{i}.Capabilities.Codecs.{i}.
+VoiceService.{i}.Capabilities.SIP.
+VoiceService.{i}.PhyInterface.{i}.
+VoiceService.{i}.PhyInterface.{i}.Tests.
+VoiceService.{i}.VoiceProfile.{i}.
+VoiceService.{i}.VoiceProfile.{i}.ButtonMap.
+VoiceService.{i}.VoiceProfile.{i}.ButtonMap.Button.{i}.
+VoiceService.{i}.VoiceProfile.{i}.FaxT38.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.CallingFeatures.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.List.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Description.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Event.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP.EventSubscribe.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Session.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Stats.
+VoiceService.{i}.VoiceProfile.{i}.Line.{i}.VoiceProcessing.
+VoiceService.{i}.VoiceProfile.{i}.NumberingPlan.
+VoiceService.{i}.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.
+VoiceService.{i}.VoiceProfile.{i}.RTP.
+VoiceService.{i}.VoiceProfile.{i}.RTP.RTCP.
+VoiceService.{i}.VoiceProfile.{i}.SIP.
+VoiceService.{i}.VoiceProfile.{i}.SIP.EventSubscribe.{i}.
+VoiceService.{i}.VoiceProfile.{i}.SIP.ResponseMap.{i}.
+VoiceService.{i}.VoiceProfile.{i}.ServiceProviderInfo.
+VoiceService.{i}.VoiceProfile.{i}.Tone.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Description.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Event.{i}.
+VoiceService.{i}.VoiceProfile.{i}.Tone.Pattern.{i}.
+X_CATAWAMPUS-ORG_CATAWAMPUS.
+X_CATAWAMPUS-ORG_CATAWAMPUS.RuntimeEnvInfo
+X_GOOGLE-COM_GFIBERTV.
+X_GOOGLE-COM_GFIBERTV.Mailbox.Name
+X_GOOGLE-COM_GFIBERTV.Mailbox.Node
+X_GOOGLE-COM_GFIBERTV.Mailbox.NodeList
+X_GOOGLE-COM_GFIBERTV.Mailbox.Value
+X_GOOGLE-COM_GVSB.
+X_GOOGLE-COM_GVSB.EpgPrimary
+X_GOOGLE-COM_GVSB.EpgSecondary
+X_GOOGLE-COM_GVSB.GvsbChannelLineup
+X_GOOGLE-COM_GVSB.GvsbKick
+X_GOOGLE-COM_GVSB.GvsbServer