5353from dstack ._internal .server .services .backends import get_project_backend_by_type_or_error
5454from dstack ._internal .server .services .fleets import (
5555 fleet_model_to_fleet ,
56+ get_fleet_requirements ,
5657)
5758from dstack ._internal .server .services .instances import (
5859 filter_pool_instances ,
7172from dstack ._internal .server .services .locking import get_locker
7273from dstack ._internal .server .services .logging import fmt
7374from dstack ._internal .server .services .offers import get_offers_by_requirements
75+ from dstack ._internal .server .services .requirements .combine import (
76+ combine_fleet_and_run_profiles ,
77+ combine_fleet_and_run_requirements ,
78+ )
7479from dstack ._internal .server .services .runs import (
7580 check_run_spec_requires_instance_mounts ,
7681 run_model_to_run ,
@@ -646,6 +651,8 @@ async def _run_job_on_new_instance(
646651) -> Optional [Tuple [JobProvisioningData , InstanceOfferWithAvailability ]]:
647652 if volumes is None :
648653 volumes = []
654+ profile = run .run_spec .merged_profile
655+ requirements = job .job_spec .requirements
649656 fleet = None
650657 if fleet_model is not None :
651658 fleet = fleet_model_to_fleet (fleet_model )
@@ -654,13 +661,26 @@ async def _run_job_on_new_instance(
654661 "%s: cannot fit new instance into fleet %s" , fmt (job_model ), fleet_model .name
655662 )
656663 return None
664+ profile = combine_fleet_and_run_profiles (fleet .spec .merged_profile , profile )
665+ if profile is None :
666+ logger .debug ("%s: cannot combine fleet %s profile" , fmt (job_model ), fleet_model .name )
667+ return None
668+ fleet_requirements = get_fleet_requirements (fleet .spec )
669+ requirements = combine_fleet_and_run_requirements (fleet_requirements , requirements )
670+ if requirements is None :
671+ logger .debug (
672+ "%s: cannot combine fleet %s requirements" , fmt (job_model ), fleet_model .name
673+ )
674+ return None
675+ # TODO: Respect fleet provisioning properties such as tags
676+
657677 multinode = job .job_spec .jobs_per_replica > 1 or (
658678 fleet is not None and fleet .spec .configuration .placement == InstanceGroupPlacement .CLUSTER
659679 )
660680 offers = await get_offers_by_requirements (
661681 project = project ,
662- profile = run . run_spec . merged_profile ,
663- requirements = job . job_spec . requirements ,
682+ profile = profile ,
683+ requirements = requirements ,
664684 exclude_not_available = True ,
665685 multinode = multinode ,
666686 master_job_provisioning_data = master_job_provisioning_data ,
0 commit comments