def test_dynamic_placement_group_in_cluster(region, scheduler, pcluster_config_reader, clusters_factory, instance): """Test the case when placement_group is set to DYNAMIC. This test is not for awsbatch scheduler.""" cluster_config = pcluster_config_reader(placement="cluster") cluster = clusters_factory(cluster_config) remote_command_executor = RemoteCommandExecutor(cluster) # For tratitional scheduler, the placement group name can be retrieved from main stack, for slurm, it can be # retrieved from ComputeFleetHITSubstack if scheduler == "slurm": placement_group = _get_slurm_placement_group_from_stack( cluster, region) # for slurm, the placement type can only be compute _check_head_node_placement_group(remote_command_executor, region, None) else: placement_group = utils.retrieve_cfn_resources( cluster.cfn_name, region)["DynamicPlacementGroup"] _check_head_node_placement_group(remote_command_executor, region, placement_group) # check the placement_group of compute nodes _assert_placement_group(cluster, scheduler, region, placement_group, None, instance) # need to delete the cluster before deleting placement group cluster.delete()
def cfn_resources(self): """ Return the CloudFormation stack resources for the cluster. Resources are retrieved only once and then cached. """ if not self.__cfn_resources: self.__cfn_resources = retrieve_cfn_resources(self.cfn_name, self.region) return self.__cfn_resources
def ebs_substack_cfn_resources(self): """ Return the CloudFormation stack resources for the cluster's EBS substack. Resources are retrieved only once and then cached. """ if not self.__ebs_substack_cfn_resources: self.__ebs_substack_cfn_resources = retrieve_cfn_resources( self.cfn_resources.get("EBSCfnStack"), self.region) return self.__ebs_substack_cfn_resources
def head_node_substack_cfn_resources(self): """ Return the CloudFormation stack resources for the cluster's head node substack. Resources are retrieved only once and then cached. """ if not self.__head_node_substack_cfn_resources: self.__head_node_substack_cfn_resources = retrieve_cfn_resources( self.cfn_resources.get("MasterServerSubstack"), self.region) return self.__head_node_substack_cfn_resources
def _get_slurm_placement_group_from_stack(cluster, region): compute_fleet_substack = utils.get_substacks( cluster.cfn_name, region=region, sub_stack_name="ComputeFleetHITSubstack")[0] compute_fleet_substack_resources = utils.retrieve_cfn_resources( compute_fleet_substack, region) placement_group = next( v for k, v in compute_fleet_substack_resources.items() if k.startswith("PlacementGroup")) return placement_group
def _get_slurm_placement_group_from_stack(cluster, region): stack_resources = utils.retrieve_cfn_resources(cluster.cfn_name, region) placement_group = next(v for k, v in stack_resources.items() if k.startswith("ComputeFleetPlacementGroup")) return placement_group
def init_stack_data(self): """Initialize cfn_outputs and cfn_resources.""" self.__cfn_outputs = retrieve_cfn_outputs(self.name, self.region) self.__cfn_resources = retrieve_cfn_resources(self.name, self.region)