---
slug: "news/stop-all"
title: "Introducing: TrueCharts Stop-All"
authors: [ornias]
date: 2023-05-16
tags:
  - "2023"
---

Previously we've warned users against using the stop-button on TrueNAS SCALE. At the same time we also understand, that users expect platform uniformity between Helm and SCALE. That's why we're happy to announce our own solution stop our Charts: TrueCharts Stop-All!

## About that stop button

First off, we would like to go into a bit more depth about the design issues of the TrueNAS SCALE "Stop" Button. We've hinted at it previously, but it's always good to explain why we need to step in ourselves.

The idea with Kubernetes, is that one tool should be managing deployment of objects at a time. Often indicated by a `managed-by` annotation on said objects.
With TrueNAS SCALE, the middleware, triggers a management tool called "Helm" to deploy objects. So far so good, a GUI isn't magically able to trigger other software, after all.

However, with the stop button, iX decided to also start editing some of those objects themselves. Specifically "Deployments" and "StatefulSets", setting them to 0 "replica's" meaning "run nothing".
That sounds completely fine, however: In these cases "Helm" is the actual management tool for those objects, so everything a helm action is triggered, those modifications are instantly removed.

That's where the problems start to become bigger and bigger, because helm actions are triggered more often than people realize. For example: A reboot also triggers helm, requiring the same "hacks" to put things "back to sleep" again.

iX also decided to not even include all default objects that are technically "running", like: Daemonsets, Jobs and Cronjobs. Which leads to issues with breaking jobs or daemonsets/jobs locking access to PVC's.
There it becomes more complicated, as kubernetes does not only exists of those "default" objects. There are also "Custom Resources", objects that are defined by other charts and there is also the ability of other management tools, like Operators, to add objects.

When making such changes through Helm, it would be relatively easy for Chart/App developers to mitigate this. However, iX decided not to _and_ does not even expose the "stop" button state to the Chart/App developers, leaving us completely without tools to mitigate these design flaws.

In the end, that leave out how the stop button can get into a near endless state of limbo, if not all running objects are stopped correctly... Putting the cherry on top.

## Looking for a better way forward

With that all concluded, we decided to look into "what needs to be done", to get all our Charts to have "stop" button functionality back again.
It's clear that the stop button, even with little fixes, isn't going to be a future proof design. It completely needs to be redesigned, including all it's backend logic.
Sadly enough, refactors of said scale (pun not even intended), are currently not the priority of iXsystems, so not something we can rely on for our users.

We concluded that the only way to do so reliably, is through Helm itself. We know which objects we have, how they need to be stopped and can do so reliably through Helm.
Which means: Do it ourselves!

## The solution: TrueCharts Stop-All

With the most recent updates, we've introduced a new option: TrueCharts Stop-All
This option will cause all your running objects to slowly shut themselves down or, in the case of our postgresql backend (CNPG), "hibernate".

It's designed to feature support for all default kubernetes objects deployed using our common chart: Daemonsets, Deployments, StatefulSets, Jobs and Cronjobs.
On top we can easily expand that to cover any operator based objects, like cnpg, that needs to be shut down as-well in the future!

## How To Use Stop-All

**On SCALE**

On SCALE this is a little checkbox on editing the App.
Check it and its _done_

**NOTE:** Do not forget to uncheck the "Stop-All" checkbox to start the App again.

**Using Helm**

On native Helm, the same functionality is also available:
Simply set the following in your values.yaml file:

```yaml
global:
  stopAll: true
```
