---
# System prepended metadata

title: 'Pantavisor 019 Features: Status Goal'
tags: [release]

---

# Pantavisor 019 Features: Status Goal

In this post, we are going to talk about how to make use of our [status goal](https://docs.pantahub.com/containers/#status-goal) feature included in the [Pantavisor 019 release](https://community.pantavisor.io/t/pantavisor-019-release/).

## Pantavisor Container Status

To understand the concept behind **status goal** we have to first understand how [container status](https://docs.pantahub.com/containers/#status) works in Pantavisor.

After a [Pantavisor-enabled](https://docs.pantahub.com/choose-device/) board is booted up or [updated](https://docs.pantahub.com/updates/), Pantavisor will try to start all [containers](https://docs.pantahub.com/containers/) from the [revision](https://docs.pantahub.com/revisions/). This process will not be immediate, and the container will have to traverse different stages, called **status**. These are the **status** a container can be at:

* **INSTALLED:** the container is installed and ready to go.
* **MOUNTED:** the container volumes are mounted, but not yet started.
* **BLOCKED:** any of the status goals from a container belonging to the previous [group](https://docs.pantahub.com/containers/#groups) are not yet achieved. The concept of **container groups** will be explained on a different post, so it is only necessary to know that this status exists.
* **STARTING:** container is starting.
* **STARTED:** container PID is running.
* **READY:** Pantavisor has received a **signal** from the container.
* **STOPPING:** container is stopping because of an update transition.
* **STOPPED:** container has stopped.

Having this in mind, the **status goal** is the final **status** a container must reach. A [configurable timeout](https://docs.pantahub.com/pantavisor-state-format-v2/#device.json) will make [updates](https://docs.pantahub.com/updates/) [fail](https://docs.pantahub.com/updates/#error) if this objective is not achieved within the defined time. Currently, there are three configurable goals:

* **MOUNTED:** for containers whose volumes we want to be mounted but not started.
* **STARTED:** rest of containers that we want mounted and started, but we only check if its PID is running.
* **READY:** same as STARTED, but a **READY signal** coming from the container namespace is required.

## Setting the Status Goal of a Container

For this example, we are going to try to add a [nginx](https://nginx.org/en/) [container](https://hub.docker.com/_/nginx) to an existing [Pantavisor-enabled device](https://docs.pantahub.com/choose-device/) claimed from my [Pantacor Hub](https://hub.pantacor.com) account:

![](https://i.imgur.com/cGTWwMH.png)

First step will be to clone our device as usual, in this case, a `Raspberry Pi 4` board with the [Pantavisor 019 image](https://docs.pantahub.com/initial-images/#stable-initial-images) installed:

```
pvr clone https://pvr.pantahub.com/anibal/home_rpi64_latest
cd home_rpi64_latest
```

To add the container with a **READY status goal**, we cat explicitly set it in the `pvr app add` command:

```
pvr app add --from nginx --status-goal READY webserver
pvr add .
pvr commit
pvr post
```

Let us think what we have done for a bit. We have posted a new revision with an nginx container from [Docker Hub](https://hub.docker.com). Where the developers of this container considerate enough to send a **READY signal** to Pantavisor? Probably not. That is why we are going to get an [ERROR](https://docs.pantahub.com/updates/#error) with this update:

![](https://i.imgur.com/7SOODFA.png)

As Pantavisor is expecting a **READY status goal** from the container, the new revision will fail after a [configurable timeout](https://docs.pantahub.com/pantavisor-state-format-v2/#device.json). Now, we are going to try to install another container. This time, a [Container Ready Demo one](https://gitlab.com/pantacor/pv-platforms/container-ready-demo) that we are sure will send the **READY signal**:

```
rm -r webserver
pvr app add --from registry.gitlab.com/pantacor/pv-platforms/container-ready-demo:arm64v8-main --status-goal READY container-ready-demo
pvr add .
pvr commit
pvr post
```

![](https://i.imgur.com/RCHQglb.png)

This works! But how does the container send the **READY signal** to Pantavisor?

## Sending a Signal from a Container

As we have seen in the previous post, a **READY signal** can be sent from a container to Pantavisor so the **container status** can progress to **READY**. Our [Ready Demo](https://gitlab.com/pantacor/pv-platforms/container-ready-demo) is a mock-up container that sends this **signal** after being started, but the idea is that the container might be able to do internal testing, validation, etc. and then send the **READY signal**.

To send signals, [pvcontrol](https://docs.pantahub.com/local-control/#pvcontrol) can be used:

```
pvcontrol signal ready
```

