Revision: 1160
Author:
J.S.P...@gmail.com
Date: Fri Aug 9 10:20:39 2013
Log: Catching an edge case of creating a record in a zone-view
assignment that does not exist
http://code.google.com/p/roster-dns-management/source/detail?r=1160
Modified:
/trunk/roster-core/roster_core/core.py
/trunk/roster-core/roster_core/user.py
/trunk/test/core_regtest.py
/trunk/test/dnsmkrecord_test.py
/trunk/test/xml_rpc_client_regtest.py
=======================================
--- /trunk/roster-core/roster_core/core.py Wed Jan 2 12:16:14 2013
+++ /trunk/roster-core/roster_core/core.py Fri Aug 9 10:20:39 2013
@@ -2670,12 +2670,17 @@
zone_view_assignments =
self.db_instance.ListRow('zone_view_assignments',
zone_view_assignments_dict)
- if( len(zone_view_assignments) > 1 ):
+ #This check isn't *strictly* needed because user.py Authorize()
will
+ #catch it. However, we thought it good to keep in for the future.
+ if( len(zone_view_assignments) == 0 ):
+ raise errors.RecordError('Zone %s not found in view %s.' % (
+ zone_name, view_name))
+ elif( len(zone_view_assignments) > 1 ):
raise errors.RecordError('Multiple zone-view assignments for '
'zone %s and view %s' % (zone_name,
view_name))
+ else:
+ zone_view_assignment = zone_view_assignments[0]
- zone_view_assignment =
self.db_instance.ListRow('zone_view_assignments',
- zone_view_assignments_dict)[0]
zone_type = zone_view_assignment['zone_view_assignments_zone_type']
if( zone_type != u'master' ):
raise errors.InvalidInputError('Cannot create records in %s
zone %s' % (
=======================================
--- /trunk/roster-core/roster_core/user.py Mon Aug 13 12:22:29 2012
+++ /trunk/roster-core/roster_core/user.py Fri Aug 9 10:20:39 2013
@@ -122,8 +122,7 @@
self.db_instance.StartTransaction()
try:
maintenance_mode = self.db_instance.CheckMaintenanceFlag()
- if( record_data and record_data.has_key('zone_name') and
- not self.zone_origin_cache.has_key(record_data['zone_name']) ):
+ if( record_data and record_data.has_key('zone_name') ):
if( record_data['zone_name'] ):
pulled_origin = self.db_instance.GetZoneOrigins(
record_data['zone_name'], record_data['view_name'])
@@ -133,8 +132,13 @@
self.zone_origin_cache[record_data['zone_name']] =
pulled_origin[
record_data['zone_name']]
else:
- raise errors.UnexpectedDataError(
- 'Specified zone or view does not exist.')
+ view_name = record_data['view_name']
+ if( view_name.endswith('_dep') ):
+ view_name = view_name[:-4] #Strip off '_dep'
+
+ raise errors.UnexpectedDataError('Specified zone-view
assignment '
+ 'does not exist for zone %s view %s' % (
+ record_data['zone_name'], view_name))
finally:
if( not current_transaction ):
self.db_instance.EndTransaction()
=======================================
--- /trunk/test/core_regtest.py Thu Jul 18 12:56:58 2013
+++ /trunk/test/core_regtest.py Fri Aug 9 10:20:39 2013
@@ -381,6 +381,41 @@
self.assertEqual(self.core_instance.ListDnsServerSetViewAssignments(),
{u'set_name': [(u'test_view', 2, u'recursion yes;')]})
+ #This tests what happens a user attempts to create a record in a
zone-view
+ #combo that does not exist.
+ def testZoneViewAssignmentsError(self):
+ self.core_instance.MakeView(u'test_view')
+ self.core_instance.MakeView(u'troll_view')
+ self.core_instance.MakeZone(u'test_zone', u'master', u'test_zone.',
+ view_name=u'test_view')
+
+ #The reason why we try this twice, (first here, and after we create an
SOA)
+ #is because earlier in our testing, we encountered different errors
+ #depending on whether or not a record was present in the zone. To make
sure
+ #that doesn't happen again, we assertRaises twice.
+ self.assertRaises(errors.UnexpectedDataError,
self.core_instance.MakeRecord,
+ u'a', u'www2', u'test_zone', {u'assignment_ip': u'192.168.0.2'},
+ view_name=u'troll_view')
+
+ soa_dict = self.core_instance.GetEmptyRecordArgsDict(u'soa')
+
+ #This stuff doesn't matter really for the test,
+ #just has to pass the Roster checks.
+ soa_dict['refresh_seconds'] = 1
+ soa_dict['expiry_seconds'] = 2
+ soa_dict['minimum_seconds'] = 3
+ soa_dict['retry_seconds'] = 4
+ soa_dict['serial_number'] = 5
+ soa_dict['name_server'] = '.'
+ soa_dict['admin_email'] = '.'
+
+ self.core_instance.MakeRecord(u'soa', u'@', u'test_zone', soa_dict,
+ view_name=u'test_view')
+
+ self.assertRaises(errors.UnexpectedDataError,
self.core_instance.MakeRecord,
+ u'a', u'www2', u'test_zone', {u'assignment_ip': u'192.168.0.2'},
+ view_name=u'troll_view')
+
def testViewAssignmentsMakeRemoveList(self):
self.assertFalse(self.core_instance.ListViewAssignments())
self.core_instance.MakeView(u'test_view')
@@ -647,7 +682,6 @@
'group_permission': [u'a', u'aaaa', u'cname']}]})
def testReverseRangePermissionsListMakeRemove(self):
- self.maxDiff = None
self.assertEqual(self.core_instance.ListReverseRangePermissions(),
{u'bio': [
{'cidr_block': u'
192.168.0.0/24',
@@ -809,10 +843,10 @@
u'computer6.university.edu.'},
ttl=10)
self.assertRaises(errors.InvalidInputError,
self.core_instance.UpdateRecord,
- u'cname', 'c6', '
university.edu',
+ u'cname', 'c6', u'
university.edu',
{u'assignment_host': None},
update_target=u'computer5')
self.assertRaises(errors.InvalidInputError,
self.core_instance.UpdateRecord,
- u'cname', 'c6', '
university.edu',
+ u'cname', 'c6', u'
university.edu',
{u'assignment_host': None},
update_target=u'computer5.')
self.assertRaises(errors.InvalidInputError,
self.core_instance.MakeRecord,
u'a', u'computer5.net.', u'
university.edu',
@@ -881,7 +915,7 @@
{u'assignment_ip': u'4321:0000:0001:0002:0003:0004:0567:89ab'},
view_name=u'test_view')
self.assertRaises(errors.InvalidInputError,
self.core_instance.UpdateRecord,
- u'aaaa', u'host1', 'ipv6_zone',
+ u'aaaa', u'host1', u'ipv6_zone',
{u'assignment_ip': u'4321:0000:0001:0002:0003:0004:0567:89ac'},
search_view_name=u'test_view', update_record_args_dict={
u'assignment_ip': u'4321:0000:0001:0002:0003:0004:0567:89ab'})
@@ -892,11 +926,11 @@
u'a', u'c.6', u'
university.edu',
{u'assignment_ip': u'10.0.1.1'}, ttl=10)
self.assertRaises(errors.InvalidInputError,
self.core_instance.UpdateRecord,
- u'cname', 'c6', '
university.edu',
+ u'cname', 'c6', u'
university.edu',
{u'assignment_host': None},
update_target=u'university_edu')
self.assertRaises(errors.InvalidInputError,
self.core_instance.UpdateRecord,
- u'a', 'computer5', '
university.edu',
+ u'a', 'computer5', u'
university.edu',
{u'assignment_ip': u'192.168.0.55'},
update_target=u'c.6')
self.assertRaises(
=======================================
--- /trunk/test/dnsmkrecord_test.py Mon Dec 24 10:13:54 2012
+++ /trunk/test/dnsmkrecord_test.py Fri Aug 9 10:20:39 2013
@@ -282,6 +282,48 @@
u'assignment_ip':
u'fe80:0000:0000:0000:0200:f8ff:fe21:67cf'}])
+ #This tests what happens a user attempts to create a record in a
zone-view
+ #combo that does not exist.
+ def testZoneViewAssignmentsError(self):
+ self.core_instance.MakeView(u'test_view')
+ self.core_instance.MakeView(u'troll_view')
+ self.core_instance.MakeZone(u'test_zone', u'master', u'test_zone.',
+ view_name=u'test_view')
+
+ #The reason why we try this twice, (first here, and after we create an
SOA)
+ #is because earlier in our testing, we encountered different errors
+ #depending on whether or not a record was present in the zone. To make
sure
+ #that doesn't happen again, we look for the same error twice.
+ command = os.popen('python %s '
+ 'hinfo --hardware Pear --os ipear '
+ '-q -t machine1 -v troll_view -z test_zone -u '
+ '%s -p %s --config-file %s -s %s' % (
+ EXEC, USERNAME, self.password, USER_CONFIG,
+ self.server_name))
+ self.assertEqual(command.read(),
+ 'USER ERROR: Specified zone-view assignment does not exist for
zone '
+ 'test_zone view troll_view\n')
+ command.close()
+
+ self.core_instance.MakeRecord(
+ u'soa', u'soa1', u'test_zone',
+ {u'name_server': u'ns1.university.edu.',
+ u'admin_email': u'admin.university.edu.',
+ u'serial_number': 1, u'refresh_seconds': 5,
+ u'retry_seconds': 5, u'expiry_seconds': 5,
+ u'minimum_seconds': 5}, view_name=u'test_view')
+
+ command = os.popen('python %s '
+ 'hinfo --hardware Pear --os ipear '
+ '-q -t machine1 -v troll_view -z test_zone -u '
+ '%s -p %s --config-file %s -s %s' % (
+ EXEC, USERNAME, self.password, USER_CONFIG,
+ self.server_name))
+ self.assertEqual(command.read(),
+ 'USER ERROR: Specified zone-view assignment does not exist for
zone '
+ 'test_zone view troll_view\n')
+ command.close()
+
def testHINFOZoneMakeRemoveListUpdate(self):
self.core_instance.MakeView(u'test_view')
self.core_instance.MakeZone(u'test_zone', u'master', u'test_zone.',
=======================================
--- /trunk/test/xml_rpc_client_regtest.py Thu Jan 3 15:57:58 2013
+++ /trunk/test/xml_rpc_client_regtest.py Fri Aug 9 10:20:39 2013
@@ -348,7 +348,9 @@
server_name=self.server_name)
out = sys.stdout.flush()
sys.stdout = oldstdout
- self.assertEqual(out, "USER ERROR: Specified zone or view does not
exist.\n")
+ self.assertEqual(out,
+ 'USER ERROR: Specified zone-view assignment does not exist for '
+ 'zone bad_zone_bad view any\n')
sys.stdout = StdOutStream()
self.assertRaises(SystemExit, roster_client_lib.RunFunction,
@@ -359,7 +361,9 @@
server_name=self.server_name)
out = sys.stdout.flush()
sys.stdout = oldstdout
- self.assertEqual(out, "USER ERROR: Specified zone or view does not
exist.\n")
+ self.assertEqual(out,
+ 'USER ERROR: Specified zone-view assignment does not exist for '
+ 'zone new_zone view bad_view\n')
def testMultipleThreadedConnectionsWithDifferentUsers(self):
data_exporter = tree_exporter.BindTreeExport(CONFIG_FILE)