Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sebastian Schrader
Kea
Commits
56a01593
Commit
56a01593
authored
Oct 26, 2010
by
Kazunori Fujiwara
Browse files
Merged trac292
git-svn-id:
svn://bind10.isc.org/svn/bind10/trunk@3358
e5f2f494-b856-4b98-b285-d166d9295462
parents
7d6d5f2d
a3fc2e18
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/lib/python/isc/config/ccsession.py
View file @
56a01593
...
...
@@ -176,13 +176,12 @@ class ModuleCCSession(ConfigData):
self
.
_session
.
close
()
def
check_command
(
self
,
nonblock
=
True
):
"""Check whether there is a command or configuration update
on the channel. Call the corresponding callback function if
there is. This function does a read on the cc session, and
returns nothing. It will respond to any command by either
an error or the answer message returned by the callback,
unless the latter is None.
"""Check whether there is a command or configuration update on
the channel. This function does a read on the cc session, and
returns nothing.
It calls check_command_without_recvmsg()
to parse the received message.
If nonblock is True, it just checks if there's a command
and does nothing if there isn't. If nonblock is False, it
waits until it arrives. It temporarily sets timeout to infinity,
...
...
@@ -193,7 +192,13 @@ class ModuleCCSession(ConfigData):
msg
,
env
=
self
.
_session
.
group_recvmsg
(
nonblock
)
finally
:
self
.
_session
.
set_timeout
(
timeout_orig
)
self
.
check_command_without_recvmsg
(
msg
,
env
)
def
check_command_without_recvmsg
(
self
,
msg
,
env
):
"""Parse the given message to see if there is a command or a
configuration update. Calls the corresponding handler
functions if present. Responds on the channel if the
handler returns a message."""
# should we default to an answer? success-by-default? unhandled error?
if
msg
is
not
None
and
not
'result'
in
msg
:
answer
=
None
...
...
@@ -211,7 +216,8 @@ class ModuleCCSession(ConfigData):
newc
=
self
.
_remote_module_configs
[
module_name
].
get_local_config
()
isc
.
cc
.
data
.
merge
(
newc
,
new_config
)
self
.
_remote_module_configs
[
module_name
].
set_local_config
(
newc
)
return
# For other modules, we're not supposed to answer
return
# ok, so apparently this update is for us.
errors
=
[]
...
...
src/lib/python/isc/config/tests/ccsession_test.py
View file @
56a01593
...
...
@@ -397,6 +397,112 @@ class TestModuleCCSession(unittest.TestCase):
mccs
.
set_command_handler
(
self
.
my_command_handler_ok
)
self
.
assertRaises
(
WouldBlockForever
,
lambda
:
mccs
.
check_command
(
False
))
def
test_check_command_without_recvmsg1
(
self
):
"copied from test_check_command2"
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec1.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_config_handler
(
self
.
my_config_handler_ok
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
cmd
=
isc
.
config
.
ccsession
.
create_command
(
isc
.
config
.
ccsession
.
COMMAND_CONFIG_UPDATE
,
{
'Spec1'
:
'abcd'
})
env
=
{
'group'
:
'Spec1'
,
'from'
:
None
};
mccs
.
check_command_without_recvmsg
(
cmd
,
env
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
1
)
self
.
assertEqual
({
'result'
:
[
1
,
'No config_data specification'
]},
fake_session
.
get_message
(
'Spec1'
,
None
))
def
test_check_command_without_recvmsg2
(
self
):
"copied from test_check_command3"
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec2.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_config_handler
(
self
.
my_config_handler_ok
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
cmd
=
isc
.
config
.
ccsession
.
create_command
(
isc
.
config
.
ccsession
.
COMMAND_CONFIG_UPDATE
,
{
'Spec2'
:
{
'item1'
:
2
}})
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
env
=
{
'group'
:
'Spec2'
,
'from'
:
None
}
mccs
.
check_command_without_recvmsg
(
cmd
,
env
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
1
)
self
.
assertEqual
({
'result'
:
[
0
]},
fake_session
.
get_message
(
'Spec2'
,
None
))
def
test_check_command_without_recvmsg3
(
self
):
"copied from test_check_command7"
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec2.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_command_handler
(
self
.
my_command_handler_ok
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
cmd
=
isc
.
config
.
ccsession
.
create_command
(
"print_message"
,
"just a message"
)
env
=
{
'group'
:
'Spec2'
,
'from'
:
None
}
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
mccs
.
check_command_without_recvmsg
(
cmd
,
env
)
self
.
assertEqual
({
'result'
:
[
0
]},
fake_session
.
get_message
(
'Spec2'
,
None
))
def
test_check_command_without_recvmsg_remote_module
(
self
):
"copied from test_check_command3"
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec1.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_config_handler
(
self
.
my_config_handler_ok
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
fake_session
.
group_sendmsg
(
None
,
'Spec2'
)
rmodname
=
mccs
.
add_remote_config
(
self
.
spec_file
(
"spec2.spec"
))
print
(
fake_session
.
message_queue
)
self
.
assertEqual
({
'command'
:
[
'get_config'
,
{
'module_name'
:
'Spec2'
}]},
fake_session
.
get_message
(
'ConfigManager'
,
None
))
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
cmd
=
isc
.
config
.
ccsession
.
create_command
(
isc
.
config
.
ccsession
.
COMMAND_CONFIG_UPDATE
,
{
'Spec2'
:
{
'item1'
:
2
}})
env
=
{
'group'
:
'Spec2'
,
'from'
:
None
}
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
mccs
.
check_command_without_recvmsg
(
cmd
,
env
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
def
test_check_command_without_recvmsg_remote_module2
(
self
):
"copied from test_check_command3"
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec1.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_config_handler
(
self
.
my_config_handler_ok
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
fake_session
.
group_sendmsg
(
None
,
'Spec2'
)
rmodname
=
mccs
.
add_remote_config
(
self
.
spec_file
(
"spec2.spec"
))
self
.
assertEqual
({
'command'
:
[
'get_config'
,
{
'module_name'
:
'Spec2'
}]},
fake_session
.
get_message
(
'ConfigManager'
,
None
))
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
cmd
=
isc
.
config
.
ccsession
.
create_command
(
isc
.
config
.
ccsession
.
COMMAND_CONFIG_UPDATE
,
{
'Spec3'
:
{
'item1'
:
2
}})
env
=
{
'group'
:
'Spec3'
,
'from'
:
None
}
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
mccs
.
check_command_without_recvmsg
(
cmd
,
env
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
0
)
def
test_check_command_block_timeout
(
self
):
"""Check it works if session has timeout and it sets it back."""
def
cmd_check
(
mccs
,
session
):
session
.
set_timeout
(
1
)
mccs
.
check_command
(
False
)
fake_session
=
self
.
common_check_command_check
(
self
.
my_command_handler_ok
,
cmd_check
)
self
.
assertEqual
(
len
(
fake_session
.
message_queue
),
1
)
self
.
assertEqual
({
'result'
:
[
0
]},
fake_session
.
get_message
(
'Spec2'
,
None
))
self
.
assertEqual
(
fake_session
.
get_timeout
(),
1
)
def
test_check_command_blocks_forever
(
self
):
"""Check it would wait forever checking a command."""
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec2.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_command_handler
(
self
.
my_command_handler_ok
)
self
.
assertRaises
(
WouldBlockForever
,
lambda
:
mccs
.
check_command
(
False
))
def
test_check_command_blocks_forever_timeout
(
self
):
"""Like above, but it should wait forever even with timeout here."""
fake_session
=
FakeModuleCCSession
()
fake_session
.
set_timeout
(
1
)
mccs
=
self
.
create_session
(
"spec2.spec"
,
None
,
None
,
fake_session
)
mccs
.
set_command_handler
(
self
.
my_command_handler_ok
)
self
.
assertRaises
(
WouldBlockForever
,
lambda
:
mccs
.
check_command
(
False
))
def
test_remote_module
(
self
):
fake_session
=
FakeModuleCCSession
()
mccs
=
self
.
create_session
(
"spec1.spec"
,
None
,
None
,
fake_session
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment