Skip to content

Commit 7541899

Browse files
author
Hanzhang Zeng (Roger)
committed
Update environment reload logic
1 parent 3869532 commit 7541899

File tree

11 files changed

+88
-4
lines changed

11 files changed

+88
-4
lines changed

azure_functions_worker/dispatcher.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,11 @@ async def _handle__function_environment_reload_request(self, req):
408408
logger.info('Unable to reload azure.functions. '
409409
'Using default. Exception:\n{}'.format(ex))
410410

411+
# Change function app directory
412+
if getattr(func_env_reload_request, 'function_app_directory'):
413+
self._change_current_working_directory(
414+
func_env_reload_request.function_app_directory)
415+
411416
success_response = protos.FunctionEnvironmentReloadResponse(
412417
result=protos.StatusResult(
413418
status=protos.StatusResult.Success))
@@ -426,6 +431,15 @@ async def _handle__function_environment_reload_request(self, req):
426431
request_id=self.request_id,
427432
function_environment_reload_response=failure_response)
428433

434+
def _change_current_working_directory(self, new_working_directory: str):
435+
if os.path.exists(new_working_directory):
436+
os.chdir(new_working_directory)
437+
logger.info('Changing current working directory to %s',
438+
new_working_directory)
439+
else:
440+
logger.warn('Working directory %s is not found when reload',
441+
new_working_directory)
442+
429443
def __run_sync_func(self, invocation_id, func, params):
430444
# This helper exists because we need to access the current
431445
# invocation_id from ThreadPoolExecutor's threads.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"scriptFile": "sub_module/main.py",
3+
"bindings": [
4+
{
5+
"type": "httpTrigger",
6+
"direction": "in",
7+
"name": "req"
8+
},
9+
{
10+
"type": "http",
11+
"direction": "out",
12+
"name": "$return"
13+
}
14+
]
15+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MODULE_NAME = 'PARENTMODULE'

tests/unittests/load_functions/parentmodule/sub_module/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .. import module
2+
3+
4+
def main(req) -> str:
5+
return module.__name__
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"scriptFile": "main.py",
3+
"bindings": [
4+
{
5+
"type": "httpTrigger",
6+
"direction": "in",
7+
"name": "req"
8+
},
9+
{
10+
"type": "http",
11+
"direction": "out",
12+
"name": "$return"
13+
}
14+
]
15+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .sub_module import module
2+
3+
4+
def main(req) -> str:
5+
return module.__name__

tests/unittests/load_functions/submodule/sub_module/__init__.py

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MODULE_NAME = 'SUB_MODULE'

tests/unittests/test_loader.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ def test_loader_relimport(self):
3333
self.assertEqual(r.status_code, 200)
3434
self.assertEqual(r.text, '__app__.relimport.relative')
3535

36+
def test_loader_submodule(self):
37+
r = self.webhost.request('GET', 'submodule')
38+
self.assertEqual(r.status_code, 200)
39+
self.assertEqual(r.text, '__app__.submodule.sub_module.module')
40+
41+
def test_loader_parentmodule(self):
42+
r = self.webhost.request('GET', 'parentmodule')
43+
self.assertEqual(r.status_code, 200)
44+
self.assertEqual(r.text, '__app__.parentmodule.module')
45+
3646

3747
class TestPluginLoader(testutils.AsyncTestCase):
3848

tests/unittests/test_rpc_messages.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
import os
22
import subprocess
33
import sys
4+
import typing
5+
import tempfile
46

57
from azure_functions_worker import protos
68
from azure_functions_worker import testutils
79

810

911
class TestGRPC(testutils.AsyncTestCase):
1012
pre_test_env = os.environ.copy()
13+
pre_test_cwd = os.getcwd()
1114

1215
def _reset_environ(self):
1316
for key, value in self.pre_test_env.items():
1417
os.environ[key] = value
18+
os.chdir(self.pre_test_cwd)
1519

16-
async def _verify_environment_reloaded(self, test_env):
20+
async def _verify_environment_reloaded(
21+
self,
22+
test_env: typing.Dict[str, str] = {},
23+
test_cwd: str = os.getcwd()):
1724
request = protos.FunctionEnvironmentReloadRequest(
18-
environment_variables=test_env)
25+
environment_variables=test_env,
26+
function_app_directory=test_cwd)
1927

2028
request_msg = protos.StreamingMessage(
2129
request_id='0',
@@ -29,18 +37,28 @@ async def _verify_environment_reloaded(self, test_env):
2937

3038
environ_dict = os.environ.copy()
3139
self.assertDictEqual(environ_dict, test_env)
40+
self.assertEqual(os.getcwd(), test_cwd)
3241
status = r.function_environment_reload_response.result.status
3342
self.assertEqual(status, protos.StatusResult.Success)
3443
finally:
3544
self._reset_environ()
3645

3746
async def test_multiple_env_vars_load(self):
3847
test_env = {'TEST_KEY': 'foo', 'HELLO': 'world'}
39-
await self._verify_environment_reloaded(test_env)
48+
await self._verify_environment_reloaded(test_env=test_env)
4049

4150
async def test_empty_env_vars_load(self):
4251
test_env = {}
43-
await self._verify_environment_reloaded(test_env)
52+
await self._verify_environment_reloaded(test_env=test_env)
53+
54+
async def test_changing_current_working_directory(self):
55+
test_cwd = tempfile.gettempdir()
56+
await self._verify_environment_reloaded(test_cwd=test_cwd)
57+
58+
async def test_reload_env_message(self):
59+
test_env = {'TEST_KEY': 'foo', 'HELLO': 'world'}
60+
test_cwd = tempfile.gettempdir()
61+
await self._verify_environment_reloaded(test_env, test_cwd)
4462

4563
def _verify_sys_path_import(self, result, expected_output):
4664
try:

0 commit comments

Comments
 (0)