blob: cc858ac9c4d3c9ee12403f7289a935028f9c0859 [file] [log] [blame] [view]
# Organizing components
<<../../_common/components/_organizing_intro.md>>
<<../../_common/components/_organizing_types.md>>
<<../../_common/components/_organizing_identifying.md>>
<<../../_common/components/_organizing_lifecycle.md>>
## Exercise: Integrate components
In order for a component to be invoked, it must be present in the active
component topology. For this exercise, you will add your component to the
`ffx-laboratory` — a restricted collection used for development inside the
product's **core realm**. Collections enable components to be dynamically
created and destroyed at runtime.
<<../_common/_start_femu_with_packages.md>>
### Add to the component topology
Create a new instance of the `echo-args` component using the following command:
```posix-terminal
ffx component create /core/ffx-laboratory:echo-args \
fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
```
This command accepts two parameters:
* `/core/ffx-laboratory:echo-args`: This is the **component moniker**,
representing the path inside the component topology for the component instance.
* `fuchsia-pkg://fuchsia.com/echo-args#meta/echo_args.cm`: This is the
**component URL**, indicating how Fuchsia should resolve the component from the
package server.
A new component instance named `echo-args` now exists in the topology. Show the
details of the new instance using the following command:
```posix-terminal
ffx component show echo-args
```
You should see the following output:
```none {:.devsite-disable-click-to-copy}
Moniker: /core/ffx-laboratory:echo-args
URL: fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
Type: CML dynamic component
Component State: Unresolved
Execution State: Stopped
```
Notice that the instance has been created, but the component URL has not been
resolved. Resolution happens when the framework attempts to start the instance.
### Start the component instance
Start the new `echo-args` component instance using the following command:
```posix-terminal
ffx component start /core/ffx-laboratory:echo-args
```
This command accepts one parameter:
* `/core/ffx-laboratory:echo-args`: This is the **component moniker**,
representing the path inside the component topology for the component instance.
This causes the component instance to start, print a greeting to the log,
then exit. Open a new terminal window and filter the device logs for messages
from the example:
```posix-terminal
ffx log --filter echo
```
You should see the following output in the device logs:
```none {:.devsite-disable-click-to-copy}
[ffx-laboratory:echo-args][I] Hello, Alice, Bob, Spot!
```
### Explore the instance
Show the details of the `echo-args` instance again using the following command:
```posix-terminal
ffx component show echo-args
```
You should now see the following output:
```none {:.devsite-disable-click-to-copy}
Moniker: core/ffx-laboratory:echo-args
URL: fuchsia-pkg://fuchsia.com/echo-args#meta/echo-args.cm
Type: CML dynamic component
Component State: Resolved
Incoming Capabilities: fuchsia.logger.LogSink
Exposed Capabilities: diagnostics
Execution State: Stopped
```
The component state has changed to `Resolved` and you can see more details
about the component's capabilities.
Components have no ambient capabilities to access other parts of the system.
Every capability a component requires must be explicitly routed to it through
the component topology or provided by its environment.
The `echo-args` component requires the `fuchsia.logger.LogSink` capability to
write to the system log. You were able to successfully view the log output
because this capability is **offered** to components in the `ffx-laboratory`
collection from the `core` realm:
```json5 {:.devsite-disable-click-to-copy}
{
collections: [
{
name: "ffx-laboratory",
},
],
offer: [
{
protocol: [ "fuchsia.logger.LogSink" ],
from: "parent",
to: "#ffx-laboratory",
},
],
}
```
<aside class="key-point">
<b>Reminder</b>
<p>The required logging capabilities in the project are implicitly declared by
the syslog manifest shard: <code>syslog/client.shard.cml</code>.
</aside>
### Destroy the instance
Clean up the `echo-args` instance using the following command:
```posix-terminal
ffx component destroy /core/ffx-laboratory:echo-args
```