def __init__(self, dashboard_head): super().__init__(dashboard_head) self.cluster_metadata = ray_usage_lib.get_cluster_metadata( ray.experimental.internal_kv.internal_kv_get_gcs_client(), num_retries=20, ) self.cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( os.path.expanduser("~/ray_bootstrap_config.yaml")) self.session_dir = dashboard_head.session_dir self.client = ray_usage_lib.UsageReportClient() # The total number of report succeeded. self.total_success = 0 # The total number of report failed. self.total_failed = 0 # The seq number of report. It increments whenever a new report is sent. self.seq_no = 0
def test_usage_lib_report_data( monkeypatch, ray_start_cluster, tmp_path, reset_lib_usage ): with monkeypatch.context() as m: m.setenv("RAY_USAGE_STATS_ENABLED", "1") m.setenv("RAY_USAGE_STATS_REPORT_URL", "http://127.0.0.1:8000") cluster = ray_start_cluster cluster.add_node(num_cpus=0) # Runtime env is required to run this test in minimal installation test. ray.init(address=cluster.address, runtime_env={"pip": ["ray[serve]"]}) """ Make sure the generated data is following the schema. """ cluster_metadata = ray_usage_lib.get_cluster_metadata( ray.experimental.internal_kv.internal_kv_get_gcs_client(), num_retries=20 ) cluster_config_file_path = tmp_path / "ray_bootstrap_config.yaml" cluster_config_file_path.write_text( """ cluster_name: minimal max_workers: 1 provider: type: aws region: us-west-2 availability_zone: us-west-2a """ ) cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( cluster_config_file_path ) d = ray_usage_lib.generate_report_data( cluster_metadata, cluster_config_to_report, 2, 2, 2 ) validate(instance=asdict(d), schema=schema) """ Make sure writing to a file works as expected """ client = ray_usage_lib.UsageReportClient() temp_dir = Path(tmp_path) client.write_usage_data(d, temp_dir) wait_for_condition(lambda: file_exists(temp_dir)) """ Make sure report usage data works as expected """ @ray.remote(num_cpus=0) class ServeInitator: def __init__(self): # Start the ray serve server to verify requests are sent # to the right place. from ray import serve serve.start() @serve.deployment(ray_actor_options={"num_cpus": 0}) async def usage(request): body = await request.json() if body == asdict(d): return True else: return False usage.deploy() def ready(self): pass # We need to start a serve with runtime env to make this test # work with minimal installation. s = ServeInitator.remote() ray.get(s.ready.remote()) # Query our endpoint over HTTP. r = client.report_usage_data("http://127.0.0.1:8000/usage", d) r.raise_for_status() assert json.loads(r.text) is True
def test_usage_lib_get_cluster_config_to_report(monkeypatch, tmp_path, reset_lib_usage): cluster_config_file_path = tmp_path / "ray_bootstrap_config.yaml" """ Test minimal cluster config""" cluster_config_file_path.write_text( """ cluster_name: minimal max_workers: 1 provider: type: aws region: us-west-2 availability_zone: us-west-2a """ ) cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( cluster_config_file_path ) assert cluster_config_to_report.cloud_provider == "aws" assert cluster_config_to_report.min_workers is None assert cluster_config_to_report.max_workers == 1 assert cluster_config_to_report.head_node_instance_type is None assert cluster_config_to_report.worker_node_instance_types is None cluster_config_file_path.write_text( """ cluster_name: full min_workers: 1 provider: type: gcp head_node_type: head_node available_node_types: head_node: node_config: InstanceType: m5.large min_workers: 0 max_workers: 0 aws_worker_node: node_config: InstanceType: m3.large min_workers: 0 max_workers: 0 azure_worker_node: node_config: azure_arm_parameters: vmSize: Standard_D2s_v3 gcp_worker_node: node_config: machineType: n1-standard-2 """ ) cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( cluster_config_file_path ) assert cluster_config_to_report.cloud_provider == "gcp" assert cluster_config_to_report.min_workers == 1 assert cluster_config_to_report.max_workers is None assert cluster_config_to_report.head_node_instance_type == "m5.large" assert cluster_config_to_report.worker_node_instance_types == list( {"m3.large", "Standard_D2s_v3", "n1-standard-2"} ) cluster_config_file_path.write_text( """ cluster_name: full head_node_type: head_node available_node_types: worker_node_1: node_config: ImageId: xyz worker_node_2: resources: {} worker_node_3: node_config: InstanceType: m5.large """ ) cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( cluster_config_file_path ) assert cluster_config_to_report.cloud_provider is None assert cluster_config_to_report.min_workers is None assert cluster_config_to_report.max_workers is None assert cluster_config_to_report.head_node_instance_type is None assert cluster_config_to_report.worker_node_instance_types == ["m5.large"] cluster_config_file_path.write_text("[invalid") cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( cluster_config_file_path ) assert cluster_config_to_report == ClusterConfigToReport() cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( tmp_path / "does_not_exist.yaml" ) assert cluster_config_to_report == ClusterConfigToReport() monkeypatch.setenv("KUBERNETES_SERVICE_HOST", "localhost") cluster_config_to_report = ray_usage_lib.get_cluster_config_to_report( tmp_path / "does_not_exist.yaml" ) assert cluster_config_to_report.cloud_provider == "kubernetes" assert cluster_config_to_report.min_workers is None assert cluster_config_to_report.max_workers is None assert cluster_config_to_report.head_node_instance_type is None assert cluster_config_to_report.worker_node_instance_types is None