Skip to content

Commit 8a25acd

Browse files
authored
Merge pull request #2800 from alicevision/dev/specific_rez_package_version_in_plugin
[core/submitters] Freeze rez plugins dependencies versions in subprocess and farm submitter
2 parents 772ed15 + d8db008 commit 8a25acd

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

meshroom/core/plugins.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ def __init__(self, folder: str, configEnv: dict[str: str]):
151151
class RezProcessEnv(ProcessEnv):
152152
"""
153153
"""
154+
155+
REZ_DELIMITER_PATTERN = re.compile(r"-|==|>=|>|<=|<")
156+
154157
def __init__(self, folder: str, configEnv: dict[str: str], uri: str = ""):
155158
if not uri:
156159
raise RuntimeError("Missing name of the Rez environment needs to be provided.")
@@ -164,34 +167,39 @@ def resolveRezSubrequires(self) -> list[str]:
164167
environment (if this package is defined).
165168
"""
166169
subrequires = os.environ.get(f"{self.uri.upper()}_SUBREQUIRES", "").split(os.pathsep)
167-
packages = []
170+
if not subrequires:
171+
return []
168172

173+
packages = []
169174
# Packages that are resolved in the current environment
170175
currentEnvPackages = []
171-
if "REZ_REQUEST" in os.environ:
172-
resolvedPackages = os.getenv("REZ_RESOLVE", "").split()
173-
resolvedVersions = {}
176+
resolvedVersions = {}
177+
if "REZ_USED_RESOLVE" in os.environ:
178+
resolvedPackages = os.getenv("REZ_USED_RESOLVE", "").split()
174179
for package in resolvedPackages:
175180
if package.startswith("~"):
176181
continue
177-
version = package.split("-")
178-
resolvedVersions[version[0]] = version[1]
179-
currentEnvPackages = [package + "-" + resolvedVersions[package] for package in resolvedVersions.keys()]
182+
currentEnvPackages.append(package)
183+
name, version = self.REZ_DELIMITER_PATTERN.split(package, maxsplit=1)
184+
resolvedVersions[name] = version
180185
logging.debug("Packages in the current environment: " + ", ".join(currentEnvPackages))
181186

182187
# Take packages with the set versions for those which have one, and try to take packages in the current
183188
# environment (if they are resolved in it)
184189
for package in subrequires:
185-
if "-" in package:
186-
packages.append(package)
187-
else:
188-
definedInParentEnv = False
189-
for p in currentEnvPackages:
190-
if p.startswith(package + "-"):
191-
packages.append(p)
192-
definedInParentEnv = True
193-
break
194-
if not definedInParentEnv:
190+
packageTuple = self.REZ_DELIMITER_PATTERN.split(package, maxsplit=1)
191+
match len(packageTuple):
192+
case 1:
193+
# Only the package name in the subrequires.
194+
# Search for a corresponding version in the parent environment.
195+
packageName = packageTuple[0]
196+
parentResolvedVersion = resolvedVersions.get(packageName)
197+
if parentResolvedVersion:
198+
packages.append(f"{packageName}=={parentResolvedVersion}")
199+
else:
200+
packages.append(package)
201+
case 2:
202+
# The subrequires ask for a specific version
195203
packages.append(package)
196204

197205
logging.debug("Packages for the execution environment: " + ", ".join(packages))

meshroom/submitters/simpleFarmSubmitter.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import json
55
import logging
66
import getpass
7+
import re
78

89
import simpleFarm
910
from meshroom.core.desc import Level
@@ -21,30 +22,35 @@ class SimpleFarmSubmitter(BaseSubmitter):
2122
environment = {}
2223
ENGINE = ''
2324
DEFAULT_TAGS = {'prod': ''}
25+
REZ_DELIMITER_PATTERN = re.compile(r"-|==|>=|>|<=|<")
2426

2527
def __init__(self, parent=None):
2628
super().__init__(name='SimpleFarm', parent=parent)
2729
self.engine = os.environ.get('MESHROOM_SIMPLEFARM_ENGINE', 'tractor')
2830
self.share = os.environ.get('MESHROOM_SIMPLEFARM_SHARE', 'vfx')
2931
self.prod = os.environ.get('PROD', 'mvg')
30-
if 'REZ_REQUEST' in os.environ:
31-
packages = os.environ.get('REZ_REQUEST', '').split()
32+
if 'REZ_USED_REQUEST' in os.environ:
33+
requestPackages = os.environ.get('REZ_USED_REQUEST', '').split()
3234
resolvedPackages = os.environ.get('REZ_RESOLVE', '').split()
3335
resolvedVersions = {}
3436
for r in resolvedPackages:
3537
# remove implicit packages
3638
if r.startswith('~'):
3739
continue
3840
# logging.info('REZ: {}'.format(str(r)))
39-
v = r.split('-')
41+
name, version = self.REZ_DELIMITER_PATTERN.split(r, maxsplit=1)
4042
# logging.info(' v: {}'.format(str(v)))
41-
if len(v) >= 2:
42-
resolvedVersions[v[0]] = v[1]
43-
for p in packages:
43+
resolvedVersions[name] = version
44+
requestPackageNames = set() # Use set to remove duplicates
45+
for p in requestPackages:
4446
if p.startswith('~'):
4547
continue
46-
v = p.split('-')
47-
self.reqPackages.append('-'.join([v[0], resolvedVersions[v[0]]]))
48+
v = self.REZ_DELIMITER_PATTERN.split(p, maxsplit=1)
49+
requestPackageNames.add(v[0])
50+
for p in requestPackageNames:
51+
# Use "==" to guarantee that the job uses the exact same version
52+
# as the environment where Meshroom was launched.
53+
self.reqPackages.append(f"{p}=={resolvedVersions[p]}")
4854
logging.debug(f'REZ Packages: {str(self.reqPackages)}')
4955
elif 'REZ_MESHROOM_VERSION' in os.environ:
5056
self.reqPackages = [f"meshroom-{os.environ.get('REZ_MESHROOM_VERSION', '')}"]

0 commit comments

Comments
 (0)