| # Components v2 migration |
| |
| ## Goal & motivation |
| |
| The Component Framework is one of the key foundations for Fuchsia's usermode |
| runtime environment. The original incarnation of components dates back to the |
| inception of the Fuchsia OS and the initial commits in 2016. The framework has |
| steadily evolved since then. |
| |
| ## Technical background |
| |
| Last updated: **May 2021** |
| |
| A high-level diagram of the system's component topology is shown below: |
| |
|  |
| |
| * v2 components are shown in blue boxes. |
| * v1 components are shown in red boxes. |
| * Boxes with dashed lines represent components that are only present on some |
| build configurations. |
| |
| In addition, all [unit tests with generated manifests][unit-tests-generated] |
| are v2 components. |
| |
| ### Components v1 vs. v2 |
| |
| Presently there are two revisions of the Component Framework that exist on |
| Fuchsia, which are referred to as [Components v1][cfv1] and |
| [Components v2][cfv2]. |
| |
| Components v1 is largely comprised of: |
| |
| * [`appmgr`][appmgr], a program that manages the runtime environment for v1 |
| components. `appmgr` implements the root of the v1 components tree, as well |
| as some foundational services such as the Components v1 ELF runner and |
| Loader service. |
| * [`sysmgr`][sysmgr], a component that manages the so-called `"sys"` realm. |
| `sysmgr` is launched by `appmgr`. |
| * The [`.cmx`][cmx] file format for v1 component manifests. |
| * The [`fuchsia.sys.*`][fuchsia-sys] FIDL library. |
| |
| Components v1 development reached its peak in 2018. In 2019, Fuchsia team began |
| developing [Component Framework v2][intro]. |
| |
| Components v2 is largely comprised of: |
| |
| * [Component manager][component_manager], a program that manages the runtime |
| environment for v2 components. Component manager is now responsible for |
| launching `appmgr`. `appmgr` has become a v2 component itself, which serves |
| as the parent of all v1 components still present in the system. |
| * The [`.cml`][cml] file format for v2 component manifests. |
| * The [`fuchsia.sys2.*`][fuchsia-sys2] FIDL library. |
| |
| In addition, both Components v1 and v2 use [`cmc`][cmc] (component manifest |
| compiler), a build-time host tool that processes all formats of component |
| manifest files. |
| |
| #### Interoperability |
| |
| Component manager launches `appmgr`, itself a v2 component, in order to manage |
| v1 components. All v1 components on the system run under `appmgr`. Users may |
| continue developing and maintaining v1 components while v2 migrations take place |
| at their own pace. |
| |
| Build configurations that use the [Session Framework][session-framework] also |
| include the `session_manager` component. All v1-backed capabilities the session |
| needs are routed to the `session_manager` from `appmgr`. |
| |
| ### Terminology |
| |
| Use this terminology when talking about the state of migrating a component and |
| its tests from v1 to v2. |
| |
| | The component | Tests that exercise it |
| :----: | ------------- | ---------------------- |
| **Fully migrated**|<ul><li>has a `.cml` file and no `.cmx` file</li><li>runs as v2 in all product builds</li></ul>|<ul><li>All automated tests run the component as a v2 component</li></ul> |
| **Partially migrated**|<ul><li>has a `.cml` file and a `.cmx` file</li><li>runs as v1 in some product configurations but not others, or is guarded by a flag to do so for development purposes</li></ul>|<ul><li>Some automated tests exist in which the component runs as a v2 component, but others run it as v1</li></ul> |
| **Prototyped**|<ul><li>runs as a v1 component in all product configurations</li><li>has a `.cml` file</li></ul>|<ul><li>All automated tests in CI/CQ run the component as v1</li><li>there are tests with the component as v2, but they don't run in CI/CQ</li></ul> |
| **Not migrated**|<ul><li>does not have a `.cml` file</li></ul>|<ul><li>There are no tests that run the component as v2</li></ul> |
| |
| #### Examples |
| "root_presenter is _partially migrated_ but its tests are _not migrated_." |
| |
| "stash and its tests are _fully migrated_." |
| |
| "basemgr is a _partially migrated_ component with _partially migrated_ tests. |
| Specifically, ..." |
| |
| "setui_service was _prototyped_ to v2 and it exposed some missing dependencies." |
| |
| ## How to help |
| |
| Last updated: **May 2021** |
| |
| ### Picking a task |
| |
| Components v2 migrations are happening throughout the system. Any component that |
| still has at least one `.cmx` file is a migration candidate. However there is |
| currently additional focus on: |
| |
| - The stack of Software Delivery components and associated tests, including |
| the package cache and package resolver. |
| - The Netstack2 components, including migration of Netemul and associated |
| tests to Test Runner Framework. |
| - The Bluetooth components and associated tests. |
| - Components under [sysmgr](/docs/glossary.md#sysmgr) that are critical to |
| system functionality but each have a smaller footprint than the ones above, |
| tracked [here][label-cf-v2-migration]. |
| - Scaling migrations by creating and expanding a |
| [self-service guide][migrating-sys-components]. |
| - Exploratory work with migrating wlan and Thread/Weave components. |
| |
| ### Doing a task |
| |
| Component migrations may take multiple incremental steps to complete due to |
| dependencies between other components that have not been migrated yet. |
| For example, a component and its tests can be migrated separately. |
| For more details on the incremental stages, see [terminology](#terminology). |
| |
| The final step for migrating a component from v1 to v2 typically involves |
| replacing all `.cmx` files with equivalent `.cml` files. |
| For detailed instructions on migrating a component and its tests, see the |
| [self-service migration guide][migrating-sys-components]. |
| |
| ### Completing a task |
| |
| Send code reviews to owners of the directories with the component definitions |
| that you're changing, and to people listed below who volunteered to help with |
| these migrations: |
| |
| * jmatt@google.com |
| * geb@google.com |
| * yeg@google.com |
| |
| New volunteer? Please add yourself to the list! |
| |
| ## Examples |
| |
| * [504575: [http-client] Migrate to Components v2](https://fuchsia-review.googlesource.com/c/fuchsia/+/504575) |
| * [504523: [soundplayer] transition to CFv2](https://fuchsia-review.googlesource.com/c/fuchsia/+/504523) |
| * [489757: [device_settings] Migrate to CFv2](https://fuchsia-review.googlesource.com/c/fuchsia/+/489757) |
| |
| ## Sponsors |
| |
| Reach out for questions or for status updates: |
| |
| * <jmatt@google.com> |
| * <shayba@google.com> |
| * <component-framework-dev@fuchsia.dev> |
| |
| [appmgr]: /src/sys/appmgr |
| [cfv1]: /docs/glossary.md#components-v1 |
| [cfv2]: /docs/glossary.md#components-v2 |
| [cmc]: /tools/cmc/ |
| [cml]: /docs/concepts/components/v2/component_manifests.md |
| [cmx]: /docs/concepts/components/v1/component_manifests.md |
| [component_manager]: /docs/concepts/components/v2/component_manager.md |
| [fuchsia-sys2]: https://fuchsia.dev/reference/fidl/fuchsia.sys2 |
| [fuchsia-sys]: https://fuchsia.dev/reference/fidl/fuchsia.sys |
| [initial-processes]: /docs/concepts/booting/everything_between_power_on_and_your_component.md#initial-processes |
| [intro]: /docs/concepts/components/v2/introduction.md |
| [label-cf-v2-migration]: https://bugs.fuchsia.dev/p/fuchsia/issues/list?q=label%3Acf-v2-migration |
| [migrating-sys-components]: /docs/development/components/v2/migration.md |
| [session-framework]: /docs/concepts/session/introduction.md |
| [sfw]: /docs/concepts/session/introduction.md |
| [sysmgr]: /docs/glossary.md#sysmgr |
| [unit-tests-generated]: /docs/development/components/build.md#unit-tests |