# Getting Started with tlBMC

go/tlbmc-getting-started

<!--*
# Document freshness: For more information, see go/fresh-source.
freshness: { owner: 'tlbmc-dev' reviewed: '2025-03-12' }
*-->

This is an introduction for how to enable tlBMC and begin development with
tlBMC.

[TOC]

## Enabling tlBMC

To enable tlBMC on a machine, we need to enable the command line flag. We can do
so by modifying the service file for bmcweb and adding the`--enable_tlbmc=true`
flag, then restarting the service.

See example below:

```shell
$ vi /lib/systemd/system/bmcweb.service

## Inside bmcweb.service
# [Unit]
# Description=Start bmcweb server
# ...
# [Service]
# ExecReload=kill -s HUP $MAINPID
### MODIFY THE LINE BELOW
# ExecStart=/usr/bin/bmcweb --enable_tlbmc=true [optional: --entity_config_location=${PATH_TO_EM_CONFIG_DIR}]
# Type=simple
# WorkingDirectory=/home/root
# Restart=on-failure
# MemoryMax=300M
# StartLimitInterval=3
# StartLimitBurst=10
# ...

$ systemctl daemon-reload
$ systemctl restart bmcweb

```

Note: As shown above, there is an optional flag for `--entity_config_location`
this allows the user to define their own directory where EM configs will be read
from. This may be useful for testing and development without using all config
files by default.

## Faster tlBMC Development

For faster modify-build-test cycles during BMCWeb code development, testing on a dev machine, we can update just the BMCWeb daemon without a full gBMC firmware
update (which can take upwards of 10 min).

For convenience, a summary of the commands necessary is provided below:

```shell
# Modify bmcweb code as necessary

$ devtool modify -n bmcweb ${MODIFIED_BMCWEB_CODE_DIR} $ bitbake bmcweb

# scp bmcweb executable over to machine, path may differ depending on machine

$ scp
./tmp/work/armv7a-openbmc-linux-gnueabi/bmcweb/1.0+git/packages-split/bmcweb/usr/bin/bmcweb
root@${HOSTNAME}-nfd01:/tmp/
```

### Service File Change

Similar to above, we can modify the service file to run the bmcweb executable
from our `/tmp` directory, after scp-ing the executable over.

See example below:

```shell
$ vi /lib/systemd/system/bmcweb.service

## Inside bmcweb.service
# [Unit]
# Description=Start bmcweb server
# ...
# [Service]
# ExecReload=kill -s HUP $MAINPID
### MODIFY THE LINE BELOW
# ExecStart=/tmp/bmcweb --enable_tlbmc=true [optional: --entity_config_location=${PATH_TO_EM_CONFIG_DIR}]
# Type=simple
# WorkingDirectory=/home/root
# Restart=on-failure
# MemoryMax=300M
# StartLimitInterval=3
# StartLimitBurst=10
# ...

$ systemctl daemon-reload
$ systemctl restart bmcweb

```

### Running from /tmp

For faster iteration cycles, we can run the bmcweb executable directly without
modifying the service file, this requires stopping the existing bmcweb service
beforehand.

```shell
# Stop the existing bmcweb service
$ systemctl stop bmcweb.socket
$ systemctl stop bmcweb

# Run your bmcweb executable
$ /tmp/bmcweb --enable_tlbmc=true
```

### Verifying tlBMC is Active

To verify tlBMC is working, check the logs for a status message from tlBMC on
startup.

```shell
# Successful startup of tlBMC
$ journalctl -u bmcweb | grep tlbmc
W0000 00:00:1741819016.315426   26690 webserver_main_setup.hpp:224] tlbmc enabled: true

# Failed startup of tlBMC
$ journalctl -u bmcweb | grep -i tlBMC
E0000 00:00:1728402303.645911    2273 webserver_main_setup.hpp:218] Cannot create tlBMC store!! Error: INTERNAL: Invalid config: No root node found - Disabling tlBMC.
W0000 00:00:1728402303.647016    2273 webserver_main_setup.hpp:224] tlbmc enabled: false

```

## Sending tlBMC Only Query

To send a query to tlBMC, with smart routing enabled, any supported tlBMC query
will automatically be routed to the tlBMC route.

### Supported Query

For supported queries, using `curl` may be the simplest way to send the query.

```shell
# Example of a supported tlBMC query
root@HOSTNAME-nfd01:~# curl localhost/redfish/v1/Chassis
{
  "@odata.id": "/redfish/v1/Chassis",
  "@odata.type": "#ChassisCollection.ChassisCollection",
  "Members": [
    {
      "@odata.id": "/redfish/v1/Chassis/foo"
    },
    {
      "@odata.id": "/redfish/v1/Chassis/bar"
    },
    ...
    {
      "@odata.id": "/redfish/v1/Chassis/baz"
    }
  ],
  "Members@odata.count": 10,
  "Name": "Chassis Collection"
}
```
