| # Component ID index |
| |
| ## Terminology |
| |
| [Moniker](/docs/glossary?style=box#moniker) |
| [Component instance identifier](/docs/glossary?style=box#component-instance-identifier) |
| |
| ## Scope |
| |
| This document describes how to define an index that maps instance ids to |
| monikers. This mapping matters for components that use isolated storage |
| capabilities. |
| |
| ## Overview |
| |
| The goal of an index of component instance IDs is to assign stable identifiers |
| to component instances. This is done by mapping an instance ID to a moniker. |
| When a component instance is assigned an ID, its persistent resources are |
| identified on disk using this instance ID. This allows the component's URL or |
| realm to be changed while its resources still remain attributed to it, so long |
| as this index is also updated. |
| |
| When the component runtime discovers an instance ID -> moniker mapping, it |
| automatically moves the component instance's existing storage directory to be |
| keyed under its instance ID. |
| |
| Only components that use storage capabilities must to be included in the |
| index. Test components should not be included in the index. |
| |
| ## Define a new index |
| |
| An index file is a JSON5 formatted file, mapping a component's instance ID to |
| its moniker. There may be multiple index files in a build tree, but they will |
| be merged together into a single index file, and this merged file will be made |
| available to the component runtime. This merged index file is immutable, and |
| can only be updated through another system update. |
| |
| The schema for an index file is described in the following example: |
| |
| ```json5 |
| // Index files are written in JSON5, so you may use comments! |
| { |
| // A list of entries, where each entry maps an instance ID to a moniker. |
| instances: [ |
| // An entry, mapping an instance ID to a moniker. |
| { |
| // Instance IDs are randomly generated, 256-bits of base-16 encoded |
| // strings (in lower case). To generate a new instance ID, omit this |
| // field and run the build; the build will fail and suggest a new |
| // instance ID which you can copy-paste here. |
| instance_id: "2bd6cc2bd10243354b873a4ddb8a188b1d29171e26eebac06567bcdc36614af6", |
| // The `instance_id` above is associated to the following moniker: |
| moniker: "/core/account/credential_manager", |
| }, |
| |
| // More than one entry can be included. However, all entries must be distinct: |
| // * Two entries cannot reference the same `instance_id` |
| // * Two entries cannot reference the same `moniker` |
| { |
| instance_id: "7db7e88479772e241229682b47f1794e12ac5d692f8d67421acd9d7ff318a975", |
| moniker: "/core/account/password_authenticator", |
| } |
| ] |
| } |
| ``` |
| |
| To supply an index file to the build, use the |
| [component_id_index()](/build/component/component_id_index.gni) GN template: |
| |
| ```gn |
| component_id_index("my_component_id_index") { |
| source = "my_component_id_index.json5" |
| } |
| ``` |
| |
| ## Add a component to the index {#add-to-index} |
| |
| ### Locate the appropriate index file |
| |
| In order to add a component to the index, you must insert an entry into the |
| appropriate index file. Currently, `fuchsia.git`'s components are listed in the |
| [core_component_id_index.json5](/src/sys/core/core_component_id_index.json5) |
| index file. |
| |
| {% dynamic if user.is_googler %} |
| |
| Note: Outside of fuchsia.git, you can usually find a *component_id_index.json5 |
| file in the `bundles/config` directory of a specific `//vendor` repository hosting |
| a product's configuration. |
| |
| {% dynamic endif %} |
| |
| ### Add an entry to the index |
| |
| The first step is to determine the component instance's moniker. You can find the |
| moniker of a component on a particular product's eng build by running `ffx component show`. |
| |
| Then, append an entry to the `instances` list with the component's moniker. |
| Omit the `instance_id` field to have the build fail and suggest a new one you |
| can use. |
| |
| #### Example |
| |
| In this example, the component |
| `fuchsia-pkg://example.com/my_other_package#meta/my_other_component.cm` is added to the index. |
| |
| To determine the component instance's moniker, you can run |
| `ffx component show fuchsia-pkg://example.com/my_other_package#meta/my_other_component.cm`: |
| |
| ```shell |
| $ ffx component show fuchsia-pkg://example.com/my_other_package#meta/my_other_component.cm |
| Moniker: /core/my_other_component |
| URL: fuchsia-pkg://example.com/my_other_package#meta/my_other_component.cm |
| ... |
| ``` |
| |
| The above output shows us that the moniker of this instance is `/core/my_other_component` |
| |
| Add `/core/my_other_component` to the index by appending this entry to |
| [core_component_id_index.json5](/src/sys/core/core_component_id_index.json5)'s |
| `instances` list: |
| |
| ```json5 |
| { |
| moniker: "/core/my_other_component" |
| } |
| ``` |
| |
| Now run the build. The build should fail, suggesting a new instance ID: |
| |
| ```bash |
| $ fx build |
| . |
| . |
| Error: Could not merge index file ../../src/sys/core/core_component_id_index.json5 |
| |
| Caused by: |
| Some entries are missing `instance_id` fields. Here are some generated IDs for you: |
| [ |
| { |
| instance_id: "47c3bf08f3e560c4dee659c28fa8d863dbdc0b1dbb74065e6cb1f38441ac759c", |
| moniker: "/core/my_other_component" |
| } |
| ] |
| ``` |
| |
| Update the entry you've added by copying the suggested `instance_id` field. The |
| build should now pass. |
| |
| ## Include a Component ID Index in a system assembly {#system-assembly} |
| |
| _The target audience for this section are product owners who are setting up a |
| system assembly_ |
| |
| This section describes how to include the component ID index in a system |
| assembly. |
| |
| A system assembly should include a component ID index if it contains components |
| which use isolated storage. Any product that builds on top of the `core` |
| product already includes a component ID index in its assembly, so the following |
| instructions may not be necessary. |
| |
| All `component_id_index()`s in a system build are merged together using the |
| `component_id_index_config()` template. This template is currently used in |
| `assembled_system.gni`, and assembly will fail if you define your own alongside |
| the one from `assembled_system.gni`. |
| |
| ### Steps |
| |
| 1. Define any `component_id_index()`s you want included in the system. |
| 1. Add these targets as dependencies of `base_packages` in your `assembled_system()` |
| target. |
| |