--- title: "Upgrading to Otter 3.0" order: 3 url-slug: "otter-upgrading-to-3-0" ---
Outdated Documentation: Upgrade to v3 Not Recommended
If you are using Otter v1 or v2, we strongly recommend Upgrading to Otter 2022. This document is only kept around for historic purposes.

### What's in This Update?

Otter 3.0 is a major upgrade, with a number of breaking changes and significant new features. Review this article carefully before deciding when and how to upgrade.

#### Release Development Status

This article is intended to help you upgrade to Otter v3 and covers:

- New Features & Non-Functional Changes
- Risk Mitigation
- Upgrade Process
- Rollback

If you are currently using Otter v1, make sure to see the Upgrading from v1 notes as well.

## New Features & Non-Functional Changes

### Job Templates Overhaul

Job Templates have been simplified and streamlined to allow you to easily create a custom UI for running your scripts.

### Pipeline Rafts Removed

Support for Pipeline Rafts and Pipeline-Only Rafts has been removed. It will be replaced in an upcoming version with a much simpler pipeline system.

### Support for Incoming Inedo Agent

The Inedo Agent can now operate in an outgoing mode, and Otter v3 can accept incoming connections from it. This opens up new possibilities for cloud-hosting Otter while still having access to on-prem resources.

### Docker Image for Linux

Otter is now cross-platform! You can now run Otter as a Linux container instead of hosting on a Windows server. See our Linux and Docker Installation Guide.

### UI/UX Changes

In addition to various UI changes, some terms in the software have been renamed

- Configuration Plans are now OtterScript Configurations
- Orchestration Plans are now OtterScript Orchestrations
- Scripts are now comprised of OtterScript Orchestrations, OtterScript Modules,

### Server Specific Configuration Plans Removed

You can no longer specify a configuration plan that is specific to one server. Instead, configuration plans may only be defined for server roles.

### PSEnsure replaced with PSEnsureScripts

The PSEnsure operation was renamed PSEnsureScripts, and PSEnsure became a new operation that functions a lot like PSCall.

In Otter v3, through the use of Additional Help Parameters in PowerShell, you can now "ensure configuration" or "verify configuration" with just a PowerShell single script, and execute that script the same way you would with PSCall. This eliminates the need to pass in multiple parameters and scripts, as was required in Otter v2.

## Risk Mitigation

Because configuration plan logic has been updated, there is a potential for unintentional changes/bugs to be introduced. To mitigate these risks:

- There are minor database schema changes, so make sure to back up your Otter instance in order to do a rollback.
- Make sure that the installation's `\Extensions` directory (`Extensions.ExtensionsPath` in Advanced Settings) is backed up prior to the upgrade
- Test configuration and orchestration plans in earlier environments prior to working against production servers upgrade Process

Otter may be upgraded by simply running the latest installer. The agents do not need to be updated.

## Rollback

Because there are database changes, a rollback will require uninstalling Otter, and then restoring your Otter instance.

## Upgrading from v1

Otter can be upgraded from v1 to v3 by simply running the installer; there is no need to upgrade to v2 first. Please note the breaking changes in Otter v2 below.

### Custom Extensions – Inedo SDK

Any custom extensions must be rebuilt against the Inedo SDK. This can be accomplished simply by removing the Inedo.Otter.SDK NuGet package from your project and then installing the Inedo.SDK NuGet package. Visit the "creating an extension" documentation for more information on formatting the output and installing the extension.

The required code changes are:

- Namespaces – rename namespaces such that any reference to `Inedo.Otter.XXXXX` is changed to `Inedo.XXXXX`. The list of namespaces is found in the SDK Reference.
- `RemoteCollectAsync(IRemoteOperationExecutionContext)` – this method override should be updated to accept `IRemoteOperationCollectionContext` instead.

Additionally, the DB class was removed. There is no current workaround for this besides querying the database directly. Common infrastructure and components (e.g. servers, roles, configuration values) should be accessed via the SDK class.