Skip to content

Commit 3f42bb3

Browse files
committed
fix: use scaleway runtime when vendoring deps
1 parent 4ef5a7b commit 3f42bb3

File tree

6 files changed

+37
-15
lines changed

6 files changed

+37
-15
lines changed

scw_serverless/cli.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,22 @@ def deploy(
119119

120120
client = deployment.get_scw_client(profile, secret_key, project_id, region)
121121

122+
if not runtime:
123+
runtime = deployment.get_current_runtime()
124+
122125
logging.info("Packaging dependencies...")
123-
DependenciesManager(file.parent, Path("./")).generate_package_folder()
126+
deps = DependenciesManager(
127+
file.parent,
128+
Path("./"),
129+
runtime=runtime,
130+
)
131+
deps.generate_package_folder()
124132

125133
try:
126134
deployment.DeploymentManager(
127135
app_instance=app_instance,
128136
sdk_client=client,
129-
runtime_override=runtime,
137+
runtime=runtime,
130138
single_source=single_source,
131139
).deploy()
132140
except ScalewayException as e:

scw_serverless/dependencies_manager.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import os
33
import pathlib
4+
import re
45
import subprocess
56
import sys
67
from importlib.metadata import version
@@ -25,9 +26,15 @@ class DependenciesManager:
2526
<https://developers.scaleway.com/en/products/functions/api/#python-additional-dependencies>
2627
"""
2728

28-
def __init__(self, in_path: pathlib.Path, out_path: pathlib.Path) -> None:
29+
def __init__(
30+
self, in_path: pathlib.Path, out_path: pathlib.Path, runtime: str
31+
) -> None:
2932
self.in_path = in_path
3033
self.out_path = out_path
34+
self.runtime_version = "310"
35+
version_pattern = r"python(\d+)"
36+
if match := re.search(version_pattern, runtime):
37+
self.runtime_version = str(match.group(1))
3138

3239
@property
3340
def pkg_path(self) -> pathlib.Path:
@@ -65,7 +72,13 @@ def _install_requirements(self, requirements_path: pathlib.Path):
6572
if not self.out_path.is_dir():
6673
raise ValueError(f"Out_path: {self.out_path.absolute} is not a directory")
6774
logging.debug("Install dependencies from requirements to %s", self.pkg_path)
68-
self._run_pip_install("-r", str(requirements_path.resolve()))
75+
self._run_pip_install(
76+
"-r",
77+
str(requirements_path.resolve()),
78+
"--python-version",
79+
self.runtime_version,
80+
"--only-binary=:all:",
81+
)
6982

7083
def _check_for_scw_serverless(self):
7184
"""Checks for scw_serverless after vendoring the dependencies."""
@@ -75,7 +88,12 @@ def _check_for_scw_serverless(self):
7588
):
7689
# Installs the current version with pip
7790
logging.debug("Installing %s from pip to %s", __package__, self.pkg_path)
78-
self._run_pip_install(f"{__package__}~={version(__package__)}")
91+
self._run_pip_install(
92+
f"{__package__}~={version(__package__)}",
93+
"--python-version",
94+
self.runtime_version,
95+
"--only-binary=:all:",
96+
)
7997

8098
def _run_pip_install(self, *args: str):
8199
python_path = sys.executable

scw_serverless/deployment/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .client import get_scw_client as get_scw_client
22
from .deployment_manager import DeploymentManager as DeploymentManager
33
from .exceptions import log_scaleway_exception as log_scaleway_exception
4+
from .runtime import get_current_runtime as get_current_runtime

scw_serverless/deployment/deployment_manager.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import logging
22
import multiprocessing
33
import os
4-
from typing import Optional
54

65
import click
76
import requests
@@ -12,7 +11,6 @@
1211
from scw_serverless.config.function import Function
1312
from scw_serverless.config.triggers import CronTrigger
1413
from scw_serverless.deployment.api_wrapper import FunctionAPIWrapper
15-
from scw_serverless.deployment.runtime import get_current_runtime
1614
from scw_serverless.utils.files import create_zip_file
1715

1816
TEMP_DIR = "./.scw"
@@ -28,17 +26,14 @@ def __init__(
2826
app_instance: Serverless,
2927
sdk_client: Client,
3028
single_source: bool,
31-
runtime_override: Optional[str] = None,
29+
runtime: str,
3230
):
3331
self.api = FunctionAPIWrapper(api=sdk.FunctionV1Beta1API(sdk_client))
3432
self.app_instance = app_instance
3533
self.sdk_client = sdk_client
3634
# Behavior configuration
3735
self.single_source = single_source
38-
if runtime_override:
39-
self.runtime = sdk.FunctionRuntime(runtime_override)
40-
else:
41-
self.runtime = get_current_runtime()
36+
self.runtime = sdk.FunctionRuntime(runtime)
4237

4338
def _get_or_create_function(self, function: Function, namespace_id: str) -> str:
4439
logging.info("Looking for an existing function %s...", function.name)

tests/test_dependencies_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def test_dependencies_manager_generate_package_folder(pkg_folder: Path):
2121
with open(req_path, mode="w", encoding="utf-8") as fp:
2222
fp.write("PyYAML==6.0\n" + "scw_serverless==0.0.1b")
2323

24-
manager = DependenciesManager(pkg_folder, pkg_folder)
24+
manager = DependenciesManager(pkg_folder, pkg_folder, runtime="python311")
2525
manager.generate_package_folder()
2626

2727
assert "package" in os.listdir(pkg_folder)
@@ -36,7 +36,7 @@ def test_dependencies_manager_install_scw_from_local(pkg_folder: Path):
3636
with open(req_path, mode="w", encoding="utf-8") as fp:
3737
fp.write("PyYAML==6.0")
3838

39-
manager = DependenciesManager(pkg_folder, pkg_folder)
39+
manager = DependenciesManager(pkg_folder, pkg_folder, runtime="python311")
4040
manager.generate_package_folder()
4141

4242
assert "package" in os.listdir(pkg_folder)

tests/test_deployment/test_deployment_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def get_test_backend() -> DeploymentManager:
4040
secret_key="498cce73-2a07-4e8c-b8ef-8f988e3c6929", # nosec # fake data
4141
default_region=constants.DEFAULT_REGION,
4242
)
43-
backend = DeploymentManager(app, client, False, runtime_override=RUNTIME)
43+
backend = DeploymentManager(app, client, False, runtime=RUNTIME)
4444
# This would otherwise create some side effects
4545
create_zip = MagicMock()
4646
create_zip.return_value = 300

0 commit comments

Comments
 (0)