Skip to content

Commit 816a132

Browse files
author
peterstone2017
committed
Revert "Enabled dependency isolation by default (#1055)"
This reverts commit b1085b5.
1 parent 333ceb6 commit 816a132

File tree

5 files changed

+97
-40
lines changed

5 files changed

+97
-40
lines changed

azure_functions_worker/constants.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
PYTHON_THREADPOOL_THREAD_COUNT_MAX = sys.maxsize
4444
PYTHON_THREADPOOL_THREAD_COUNT_MAX_37 = 32
4545

46-
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT = True
46+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT = False
47+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT_310 = False
4748
PYTHON_ENABLE_WORKER_EXTENSIONS_DEFAULT = False
4849
PYTHON_ENABLE_WORKER_EXTENSIONS_DEFAULT_39 = True
4950

azure_functions_worker/utils/dependency.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
# Copyright (c) Microsoft Corporation. All rights reserved.
2-
# Licensed under the MIT License.
1+
from azure_functions_worker.utils.common import is_true_like
2+
from typing import List, Optional
3+
from types import ModuleType
34
import importlib
45
import inspect
56
import os
67
import re
78
import sys
8-
from types import ModuleType
9-
from typing import List, Optional
109

11-
from azure_functions_worker.utils.common import is_true_like
10+
from ..logging import logger
1211
from ..constants import (
1312
AZURE_WEBJOBS_SCRIPT_ROOT,
1413
CONTAINER_NAME,
1514
PYTHON_ISOLATE_WORKER_DEPENDENCIES,
16-
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT
15+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT,
16+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT_310
1717
)
18-
from ..logging import logger
18+
from ..utils.common import is_python_version
1919
from ..utils.wrappers import enable_feature_by
2020

2121

@@ -75,7 +75,12 @@ def is_in_linux_consumption(cls):
7575
@classmethod
7676
@enable_feature_by(
7777
flag=PYTHON_ISOLATE_WORKER_DEPENDENCIES,
78-
flag_default=PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT)
78+
flag_default=(
79+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT_310 if
80+
is_python_version('3.10') else
81+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT
82+
)
83+
)
7984
def use_worker_dependencies(cls):
8085
"""Switch the sys.path and ensure the worker imports are loaded from
8186
Worker's dependenciess.
@@ -101,7 +106,12 @@ def use_worker_dependencies(cls):
101106
@classmethod
102107
@enable_feature_by(
103108
flag=PYTHON_ISOLATE_WORKER_DEPENDENCIES,
104-
flag_default=PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT)
109+
flag_default=(
110+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT_310 if
111+
is_python_version('3.10') else
112+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT
113+
)
114+
)
105115
def prioritize_customer_dependencies(cls, cx_working_dir=None):
106116
"""Switch the sys.path and ensure the customer's code import are loaded
107117
from CX's deppendencies.
@@ -170,7 +180,11 @@ def reload_customer_libraries(cls, cx_working_dir: str):
170180
"""
171181
use_new_env = os.getenv(PYTHON_ISOLATE_WORKER_DEPENDENCIES)
172182
if use_new_env is None:
173-
use_new = PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT
183+
use_new = (
184+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT_310 if
185+
is_python_version('3.10') else
186+
PYTHON_ISOLATE_WORKER_DEPENDENCIES_DEFAULT
187+
)
174188
else:
175189
use_new = is_true_like(use_new_env)
176190

tests/endtoend/dependency_isolation_functions/dependency_isolation_stein/function_app.py

Whitespace-only changes.

tests/unittests/test_rpc_messages.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import unittest
99

1010
from azure_functions_worker import protos, testutils
11+
from azure_functions_worker.utils.common import is_python_version
1112

1213

1314
class TestGRPC(testutils.AsyncTestCase):
@@ -126,7 +127,13 @@ def test_failed_azure_namespace_import(self):
126127

127128
@unittest.skipIf(sys.platform == 'win32',
128129
'Linux .sh script only works on Linux')
130+
@unittest.skipIf(
131+
is_python_version('3.10'),
132+
'In Python 3.10, isolate worker dependencies is turned on by default.'
133+
' Reloading all customer dependencies on specialization is a must.'
134+
' This partially reloading namespace feature is no longer needed.'
135+
)
129136
def test_successful_azure_namespace_import(self):
130137
self._verify_azure_namespace_import(
131138
'true',
132-
'module_b fails to import')
139+
'module_b is imported')

tests/unittests/test_utilities_dependency.py

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
3-
import importlib.util
43
import os
54
import sys
5+
import importlib.util
66
import unittest
77
from unittest.mock import patch
88

99
from azure_functions_worker import testutils
10+
from azure_functions_worker.utils.common import is_python_version
1011
from azure_functions_worker.utils.dependency import DependencyManager
1112

1213

@@ -228,7 +229,7 @@ def test_add_to_sys_path_no_duplication(self):
228229

229230
def test_add_to_sys_path_import_module(self):
230231
DependencyManager._add_to_sys_path(self._customer_deps_path, True)
231-
import common_module # NoQA
232+
import common_module # NoQA
232233
self.assertEqual(
233234
common_module.package_location,
234235
os.path.join(self._customer_deps_path, 'common_module')
@@ -239,7 +240,7 @@ def test_add_to_sys_path_import_namespace_path(self):
239240
into sys.path
240241
"""
241242
DependencyManager._add_to_sys_path(self._customer_deps_path, True)
242-
import common_namespace # NoQA
243+
import common_namespace # NoQA
243244
self.assertEqual(len(common_namespace.__path__), 1)
244245
self.assertEqual(
245246
common_namespace.__path__[0],
@@ -516,7 +517,7 @@ def test_clear_path_importer_cache_and_modules_retain_namespace(self):
516517
sys.path.insert(0, self._worker_deps_path)
517518

518519
# Ensure new import is from _worker_deps_path
519-
import common_module as worker_mod # NoQA
520+
import common_module as worker_mod # NoQA
520521
self.assertIn('common_module', sys.modules)
521522
self.assertEqual(
522523
worker_mod.package_location,
@@ -554,6 +555,39 @@ def test_use_worker_dependencies_disable(self):
554555
with self.assertRaises(ImportError):
555556
import common_module # NoQA
556557

558+
@unittest.skipUnless(
559+
sys.version_info.major == 3 and sys.version_info.minor != 10,
560+
'Test only available for Python 3.6, 3.7, 3.8 or 3.9'
561+
)
562+
def test_use_worker_dependencies_default_python_36_37_38_39(self):
563+
# Feature should be disabled in Python 3.6, 3.7, 3.8 and 3.9
564+
# Setup paths
565+
DependencyManager.worker_deps_path = self._worker_deps_path
566+
DependencyManager.cx_deps_path = self._customer_deps_path
567+
DependencyManager.cx_working_dir = self._customer_func_path
568+
569+
# The common_module cannot be imported since feature is disabled
570+
DependencyManager.use_worker_dependencies()
571+
with self.assertRaises(ImportError):
572+
import common_module # NoQA
573+
574+
@unittest.skip('Skipping since PYTHON_ISOLATE_WORKER_DEPENDENCIES is '
575+
'disabled by default')
576+
def test_use_worker_dependencies_default_python_310(self):
577+
# Feature should be enabled in Python 3.10 by default
578+
# Setup paths
579+
DependencyManager.worker_deps_path = self._worker_deps_path
580+
DependencyManager.cx_deps_path = self._customer_deps_path
581+
DependencyManager.cx_working_dir = self._customer_func_path
582+
583+
# Ensure the common_module is imported from _worker_deps_path
584+
DependencyManager.use_worker_dependencies()
585+
import common_module # NoQA
586+
self.assertEqual(
587+
common_module.package_location,
588+
os.path.join(self._worker_deps_path, 'common_module')
589+
)
590+
557591
def test_prioritize_customer_dependencies(self):
558592
# Setup app settings
559593
os.environ['PYTHON_ISOLATE_WORKER_DEPENDENCIES'] = 'true'
@@ -592,51 +626,52 @@ def test_prioritize_customer_dependencies_disable(self):
592626
with self.assertRaises(ImportError):
593627
import common_module # NoQA
594628

595-
def test_prioritize_customer_dependencies_from_working_directory(self):
596-
self._initialize_scenario()
597-
629+
@unittest.skipIf(is_python_version('3.10'),
630+
'Test not available for python 3.10')
631+
def test_prioritize_customer_dependencies_default_python_36_37_38_39(self):
632+
# Feature should be disabled in Python 3.6, 3.7, 3.8 and 3.9
598633
# Setup paths
599634
DependencyManager.worker_deps_path = self._worker_deps_path
600635
DependencyManager.cx_deps_path = self._customer_deps_path
601636
DependencyManager.cx_working_dir = self._customer_func_path
602637

603-
# Ensure the func_specific_module is imported from _customer_func_path
638+
# Ensure the common_module is imported from _customer_deps_path
604639
DependencyManager.prioritize_customer_dependencies()
605-
import func_specific_module # NoQA
606-
self.assertEqual(
607-
func_specific_module.package_location,
608-
os.path.join(self._customer_func_path, 'func_specific_module')
609-
)
640+
with self.assertRaises(ImportError):
641+
import common_module # NoQA
610642

611-
def test_reload_customer_libraries_dependency_isolation_true(self):
612-
os.environ['PYTHON_ISOLATE_WORKER_DEPENDENCIES'] = 'true'
643+
@unittest.skip('Skipping since PYTHON_ISOLATE_WORKER_DEPENDENCIES is '
644+
'disabled by default')
645+
def test_prioritize_customer_dependencies_default_python_310(self):
646+
# Feature should be enabled in Python 3.10 by default
613647
# Setup paths
614648
DependencyManager.worker_deps_path = self._worker_deps_path
615649
DependencyManager.cx_deps_path = self._customer_deps_path
616650
DependencyManager.cx_working_dir = self._customer_func_path
617651

618-
DependencyManager.reload_customer_libraries(self._customer_deps_path)
652+
# Ensure the common_module is imported from _customer_deps_path
653+
DependencyManager.prioritize_customer_dependencies()
619654
import common_module # NoQA
620655
self.assertEqual(
621656
common_module.package_location,
622-
os.path.join(self._customer_deps_path, 'common_module'))
657+
os.path.join(self._customer_deps_path, 'common_module')
658+
)
659+
660+
def test_prioritize_customer_dependencies_from_working_directory(self):
661+
self._initialize_scenario()
623662

624-
def test_reload_customer_libraries_dependency_isolation_false(self):
625-
os.environ['PYTHON_ISOLATE_WORKER_DEPENDENCIES'] = 'false'
626663
# Setup paths
627664
DependencyManager.worker_deps_path = self._worker_deps_path
628665
DependencyManager.cx_deps_path = self._customer_deps_path
629666
DependencyManager.cx_working_dir = self._customer_func_path
630667

631-
DependencyManager._add_to_sys_path(self._worker_deps_path, True)
632-
import azure.functions # NoQA
633-
634-
DependencyManager._add_to_sys_path(self._customer_deps_path, True)
635-
DependencyManager.reload_customer_libraries(self._customer_deps_path)
636-
# Checking if azure.functions gets reloaded
637-
self.assertIn(
638-
os.path.join(self._customer_deps_path, 'azure', 'functions'),
639-
sys.modules['azure.functions'].__path__)
668+
# Ensure the func_specific_module is imported from _customer_func_path
669+
DependencyManager.prioritize_customer_dependencies()
670+
import func_specific_module # NoQA
671+
self.assertEqual(
672+
func_specific_module.package_location,
673+
os.path.join(self._customer_func_path, 'func_specific_module')
674+
)
640675

641676
def test_remove_module_cache(self):
642677
# First import the common_module and create a sys.modules cache

0 commit comments

Comments
 (0)