def metadata_path(*subdirs): """Return a list of directories to search for metadata files. ELYRA_METADATA_PATH environment variable has highest priority. This is based on jupyter_core.paths.jupyter_path, but where the python env-based directory is last in the list, preceded by the system shared locations with the user's home-based directory still first in the list. The first directory in the list (data_dir, if env is not set) is where files will be written, although files can reside at other levels as well, with SYSTEM_JUPYTER_PATH representing shared data and ENV_JUPYTER_PATH representing the location of factory data (created during installation). If ``*subdirs`` are given, that subdirectory will be added to each element. """ paths = [] # highest priority is env if os.environ.get('ELYRA_METADATA_PATH'): paths.extend( p.rstrip(os.sep) for p in os.environ['ELYRA_METADATA_PATH'].split(os.pathsep) ) # then user dir paths.append(jupyter_core.paths.jupyter_data_dir()) # then system, where shared files will reside # Note, we're using getattr for these, since tests adjust the value of these # and we need to pull them at runtime, rather than during load. system_path = getattr(jupyter_core.paths, 'SYSTEM_JUPYTER_PATH') paths.extend(system_path) # then sys.prefix, where installed files will reside (factory data) env_path = getattr(jupyter_core.paths, 'ENV_JUPYTER_PATH') for p in env_path: if p not in system_path: paths.append(p) # add subdir, if requested. # Note, the 'metadata' parent dir is automatically added. if subdirs: paths = [os.path.join(p, 'metadata', *subdirs) for p in paths] return paths
async def test_modify_component_catalogs(jp_environ, component_cache, metadata_manager_with_teardown, create_inprocess): # Get initial set of components initial_components = component_cache.get_all_components(RUNTIME_PROCESSOR) # Create new registry instance with a single URL-based component paths = [_get_resource_path("kfp_test_operator.yaml")] instance_metadata = { "description": "A test registry", "runtime_type": RUNTIME_PROCESSOR.name, "categories": ["New Components"], "paths": paths, } registry_instance = Metadata( schema_name="local-file-catalog", name=TEST_CATALOG_NAME, display_name="New Test Registry", metadata=instance_metadata, ) if create_inprocess: metadata_manager_with_teardown.create(TEST_CATALOG_NAME, registry_instance) else: res: CompletedProcess = run([ "elyra-metadata", "install", "component-catalogs", f"--schema_name={registry_instance.schema_name}", f"--json={registry_instance.to_json()}", f"--name={TEST_CATALOG_NAME}", ]) assert res.returncode == 0 # Wait for update to complete component_cache.wait_for_all_cache_tasks() # Get new set of components from all active registries, including added test registry components_after_create = component_cache.get_all_components( RUNTIME_PROCESSOR) assert len(components_after_create) == len(initial_components) + 1 added_component_names = [ component.name for component in components_after_create ] assert "Test Operator" in added_component_names assert "Test Operator No Inputs" not in added_component_names # Modify the test registry to add a path to the catalog instance paths.append(_get_resource_path("kfp_test_operator_no_inputs.yaml")) metadata_manager_with_teardown.update(TEST_CATALOG_NAME, registry_instance) # Wait for update to complete component_cache.wait_for_all_cache_tasks() # Get set of components from all active registries, including modified test registry components_after_update = component_cache.get_all_components( RUNTIME_PROCESSOR) assert len(components_after_update) == len(initial_components) + 2 modified_component_names = [ component.name for component in components_after_update ] assert "Test Operator" in modified_component_names assert "Test Operator No Inputs" in modified_component_names # Delete the test registry metadata_manager_with_teardown.remove(TEST_CATALOG_NAME) # Wait for update to complete component_cache.wait_for_all_cache_tasks() # Check that components remaining after delete are the same as before the new catalog was added components_after_remove = component_cache.get_all_components( RUNTIME_PROCESSOR) assert len(components_after_remove) == len(initial_components)