Skip to content

Commit

Permalink
[Projects] Add Iguazio version validation for adding node selector to…
Browse files Browse the repository at this point in the history
… project (#5522)
  • Loading branch information
yaelgen committed May 28, 2024
1 parent 1f6067d commit 1c25018
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 14 deletions.
13 changes: 12 additions & 1 deletion mlrun/projects/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@
clone_zip,
get_repo_url,
)
from ..utils.helpers import ensure_git_branch, resolve_git_reference_from_source
from ..utils.helpers import (
ensure_git_branch,
resolve_git_reference_from_source,
)
from ..utils.notifications import CustomNotificationPusher, NotificationTypes
from .operations import (
BuildStatus,
Expand Down Expand Up @@ -1272,6 +1275,14 @@ def description(self) -> str:
def description(self, description):
self.spec.description = description

@property
def default_function_node_selector(self) -> dict:
return self.spec.default_function_node_selector

@default_function_node_selector.setter
def default_function_node_selector(self, default_function_node_selector):
self.spec.default_function_node_selector = default_function_node_selector

@property
def default_image(self) -> str:
return self.spec.default_image
Expand Down
11 changes: 6 additions & 5 deletions mlrun/utils/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1586,11 +1586,12 @@ def validate_component_version_compatibility(
component_current_version = mlrun.mlconf.igz_version
parsed_current_version = mlrun.mlconf.get_parsed_igz_version()

# ignore pre-release and build metadata, as iguazio version always has them, and we only care about the
# major, minor, and patch versions
parsed_current_version = semver.VersionInfo.parse(
f"{parsed_current_version.major}.{parsed_current_version.minor}.{parsed_current_version.patch}"
)
if parsed_current_version:
# ignore pre-release and build metadata, as iguazio version always has them, and we only care about the
# major, minor, and patch versions
parsed_current_version = semver.VersionInfo.parse(
f"{parsed_current_version.major}.{parsed_current_version.minor}.{parsed_current_version.patch}"
)
if component_name == "nuclio":
component_current_version = mlrun.mlconf.nuclio_version
parsed_current_version = semver.VersionInfo.parse(
Expand Down
22 changes: 18 additions & 4 deletions server/api/utils/clients/iguazio.py
Original file line number Diff line number Diff line change
Expand Up @@ -752,11 +752,25 @@ def _transform_mlrun_project_to_iguazio_project(
body["data"]["attributes"]["owner_username"] = project.spec.owner

if project.spec.default_function_node_selector is not None:
body["data"]["attributes"]["default_function_node_selector"] = (
Client._transform_mlrun_labels_to_iguazio_labels(
project.spec.default_function_node_selector
# This feature requires support for project-level default_function_node_selector,
# which is available starting from version 3.5.5.
# We are adding this validation to maintain backward compatibility with older versions of Iguazio.
if mlrun.utils.helpers.validate_component_version_compatibility(
"iguazio", "3.5.5"
):
body["data"]["attributes"]["default_function_node_selector"] = (
Client._transform_mlrun_labels_to_iguazio_labels(
project.spec.default_function_node_selector
)
)
)
else:
logger.debug(
"Omitting project-level default function node selector from Iguazio project, "
"as Iguazio version is insufficient",
igz_version=mlrun.mlconf.get_parsed_igz_version(),
project_name=project.metadata.name,
)

return body

@staticmethod
Expand Down
12 changes: 9 additions & 3 deletions tests/api/utils/clients/test_iguazio.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import http
import json
import typing
import unittest.mock

import deepdiff
import fastapi
Expand Down Expand Up @@ -926,9 +927,14 @@ async def test_format_as_leader_project(
iguazio_client: server.api.utils.clients.iguazio.Client,
):
project = _generate_project()
iguazio_project = await maybe_coroutine(
iguazio_client.format_as_leader_project(project)
)
with unittest.mock.patch(
"mlrun.utils.helpers.validate_component_version_compatibility",
return_value=True,
):
iguazio_project = await maybe_coroutine(
iguazio_client.format_as_leader_project(project)
)

assert (
deepdiff.DeepDiff(
_build_project_response(iguazio_client, project, with_mlrun_project=True),
Expand Down
2 changes: 1 addition & 1 deletion tests/projects/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -1263,7 +1263,7 @@ def test_function_receives_project_default_function_node_selector():
)
assert non_enriched_function.spec.node_selector == {}

proj1.spec.default_function_node_selector = default_function_node_selector
proj1.default_function_node_selector = default_function_node_selector
enriched_function = proj1.get_function("func", enrich=True)
assert enriched_function.spec.node_selector == default_function_node_selector

Expand Down

0 comments on commit 1c25018

Please sign in to comment.