This page has moved to our new Educator Preparation Programs Space Installing ODS/API 5.3 with EPDM
Click in the link above if you are not automatically redirected in 10 seconds.

This section describes how to set up the Ed-Fi ODS / API for Suite 3 v5.3 with TPDM-Community v1.1 in a Windows environment using released binaries.

The steps can be summarized as:

Detail on each step follows.

Step 1. Install and Configure Windows Components

Ensure that the following components are installed:

  • PowerShell 5.0. PowerShell is used to initialize the development environment.
  • .NET Core 3.1.301 SDK. The .NET Core 3.1 Software Developer Kit is required for compiling the solution.
  • .NET Core Hosting Bundle 3.1.x The .NET Core 3.1 ASP.NET Hosting Bundle is required for running the ODS / API
  • Internet Information Services. IIS is the web server that will run the ODS / API.
     

PowerShell 5.0

Verify that PowerShell 5.0 or above is installed:

  1. Press the Windows key Windows logo on your keyboard, type PowerShell, select Windows PowerShell, and press Enter.
  2. Type $PSVersionTable.PSVersion, and press Enter
  3. If the required version is not installed, download Windows Management Framework 5.0, which includes PowerShell 5.0.

.NET CORE 3.1 SDK

Download and install  .NET Core SDK 3.1.301 (Compatible with Visual Studio 2019).

.NET CORE 3.1 Hosting Bundle

Download and install  ASP.NET Hosting Bundle

Internet Information Services

  1. Press the Windows key Windows logo on your keyboard, type "features", select Turn Windows features on or off, press Enter.
  2. Check the box next to Internet Information Services. The default selections will be good for most cases. Make sure that ASP.NET 4.8 is selected.
  3. Click OK.

Step 2. Install and Configure Required Software

Ensure that the following software is installed and configured:

  • Microsoft SQL Server 2016 or 2017. Microsoft SQL Server is used to store the data for the Ed-Fi ODS / API. Local installation of Standard, Developer, or Enterprise Editions with Service Pack 2 or higher are supported. 
  • Optional PostgreSQL datastore:
    • PostgreSQL 11.x. PostgreSQL can be used as the datastore for and Ed-Fi ODS / API instance instead of Microsoft SQL Server.


Microsoft SQL Server 2016 or 2017

Install Microsoft SQL Server 2016:

  1. When prompted, select the following features:
  2. Use the default instance named MSSQLSERVER.
  3. Select either Windows Authentication Mode or Mixed Mode.

  4. In Specify SQL Server administrator, click Add Current User.

Install SQL Server Management Studio:

PostgreSQL Installation (Optional)

Install PostgreSQL 11.x on port 5432 if you intend to use PostgreSQL as a backing datastore for the ODS / API.

PostgreSQL Visualization Tool

Unlike SQL Server, PostgreSQL does not include a GUI to visualize the database (commands are executed via the command line using psql). Below is a list of various tools that work:

Install PostgreSQL

Installation of PostgreSQL can be done either using the binaries or using Docker. The recommended solution is to to use the docker install using Linux containers.

Option 1. Installation using PostgreSQL Installer

Download the version 11.x installer.

Click Next.

Click Next.

If you want to install only the tools uncheck PostgreSQL Server, pgAdmin 4 and Stack Builder.

Click Next.

Click Next.

Enter a password for the postgres superuser.

Click Next.

Enter port 5432 (default).

Click Next.

Click Next.

Click Next.

Click Next to finish the installation.

Option 2. PostgreSQL Installation with Docker

Initial setup with Docker:

  • Install Docker using this guide.
  • Create a Docker Compose file.

Run PostgreSQL with Docker in Linux Containers

Create a Docker Compose file (name: docker-compose.yml) to bootstrap PostgreSQL using Linux containers. More information on the Docker Compose file can be found on the Docker documentation site

version: '3.7'

services:
    pg11:
        image: postgres:11-alpine
        container_name: pg11
        volumes:
            - pg11-database:/var/lib/postgresql/data
        ports:
            - 5432:5432
        environment:
            - POSTGRES_PASSWORD=${PG_PASSWORD}
        restart: on-failure

volumes:
    pg11-database:
        driver: local
        name: pg11-database

Create an environment file (name: .env) to be consumed by Docker Compose. By default the environment file needs to be in the same folder as the Docker Compose file.

PG_PASSWORD=P@ssw0rd

Sample files for these can be downloaded from the download panel on the right.

Data Retention and Docker Compose

Once you have set up your docker-compose.yml and .env files and placed them in a folder (e.g. C:\PGDockerSetup), navigate to that folder in PowerShell and run docker-compose. This utility reads the docker-compose.yml configuration file and runs all of the containers described in that file. 

To bring up the environment: 

C:\PGDockerSetup>docker-compose up -d

To stop the volumes and containers:

C:\PGDockerSetup>docker-compose down

To stop the services and remove them, but retain the data in separate volumes:

C:\PGDockerSetup>docker-compose down -v

Configure pgpass.conf

Create a pgpass.conf file. Note that the password should be your postgres superuser password and it should match the password in your environment file.

localhost:5432:*:postgres:P@ssw0rd

Set the environment variable PGPASSFILE to the location of the pgpass file that was created, which is the recommended approach. Optionally, the file can be saved in %APPDATA%/postgresql/pgpass.conf.

You can test the environment variable setup using:  

C:\> get-item env:pgpassfile

Name                           Value
----                           -----
PGPASSFILE                     C:\PGDockerSetup\pgpass.conf

Step 3. Download the Ed-Fi ODS / API Installer Packages

The Ed-Fi ODS / API installation packages can be downloaded from the following links:

The required release packages to install the Ed-Fi ODS / API can be found at the links below. We recommend you to stay current with the latest patch update that has been promoted to release.


For each of the downloads, right-click and select "Properties." Update the file extension (from .nupkg to .zip). Remove the version number (optional). Check the box next to Unblock (this will prevent Powershell from asking for permission to load every module in the installer) and click OK.

You may need to configure TLS while running the installation scripts described in steps below.
[Net.ServicePointManager]::SecurityProtocol += [Net.SecurityProtocolType]::Tls12

Step 4. Install the Ed-Fi Databases

Extract the contents of the EdFi.Suite3.RestApi.Databases package. The paths in these instructions assume that the package was extracted to a folder with the name of the package (e.g., C:\temp\EdFi.Suite3.RestApi.Databases).

Download and install the TPDM Database Deployment Scripts

Download the minimal and populated scripts for your chosen database engine (MS SQL Server or PostgreSQL) and copy them to the Ed-Fi-ODS-Implementation\DatabaseTemplate\Scripts folder of the EdFi.Suite3.RestApi.Databases extracted above

SQL Server:  Populated Template Script  Minimal Template Script

PostgreSQL: Populated Template Script  Minimal Template Script

Edit the configuration.json File

There are several settings in the configuration file that are left empty as they depend on whether you are opting of SQL Server or PostgreSQL backend. Update the settings by consulting the samples provided below.

SQL Server
 "ConnectionStrings": {
     "EdFi_Ods": "server=(local);trusted_connection=True;database=EdFi_{0};Application Name=EdFi.Ods.WebApi",
     "EdFi_Security": "server=(local);trusted_connection=True;database=EdFi_Security;persist security info=True;Application Name=EdFi.Ods.WebApi",
     "EdFi_Admin": "server=(local);trusted_connection=True;database=EdFi_Admin;Application Name=EdFi.Ods.WebApi",
     "EdFi_Master": "server=(local);trusted_connection=True;database=master;Application Name=EdFi.Ods.WebApi"
  },
  "ApiSettings": {
  "Mode": "SharedInstance",
  "Engine": "SQLServer",
  "MinimalTemplateScript": "TPDMCommunityMinimalTemplate",
  "PopulatedTemplateScript": "TPDMCommunityPopulatedTemplate",
   ...
  }

PostgreSQL
 "ConnectionStrings": {
   "EdFi_Ods": "host=localhost;port=5432;username=postgres;database=EdFi_{0};Application Name=EdFi.Ods.WebApi",
   "EdFi_Security": "host=localhost;port=5432;username=postgres;database=EdFi_Security;Application Name=EdFi.Ods.WebApi",
   "EdFi_Admin": "host=localhost;port=5432;username=postgres;database=EdFi_Admin;Application Name=EdFi.Ods.WebApi",
   "EdFi_Master": "host=localhost;port=5432;username=postgres;database=postgres;Application Name=EdFi.Ods.WebApi"
  },
  "ApiSettings": {
  "Mode": "SharedInstance",
  "Engine": "PostgreSQL",
  "MinimalTemplateScript": "PostgreSqlTPDMCommunityMinimalTemplate",
  "PopulatedTemplateScript": "PostgreSqlTPDMCommunityPopulatedTemplate",
   ...
  }

Edit the Plugin section of the configuration file and update the Folder and Scripts values to the following:

"Plugin": {
    "Folder": "../../Plugin",
    "Scripts": [
    ]
  }

Extract the contents of the TPDM-Community package downloaded in step 3 and place the extracted folder in the Ed-Fi-ODS-Implementation\Plugin folder of the EdFi.Suite3.RestApi.Databases 


Open a PowerShell window in Administrator mode and navigate to the
EdFi.Suite3.RestApi.Databases package folder and run the following Powershell command to load modules for installationRun Installation Script

Import-Module .\Deployment.psm1

Finally execute the following command in PowerShell:

Initialize-DeploymentEnvironment

Step 5. Install WebApi

Extract the contents of the EdFi.Suite3.Installer.WebApi package. The paths in these instructions assume that the package was extracted to a folder with the name of the package (e.g., C:\temp\EdFi.Suite3.Installer.WebApi).

Prepare Installation script

Open a PowerShell window in Administrator mode and navigate to the EdFi.Suite3.Installer.WebApi package folder and run the following Powershell command to load modules for installation:

Import-Module .\Install-EdFiOdsWebApi.psm1

The WebApi installer can take a number of parameters to tailor the install experience (more examples can be found in the Install-EdFiOdsWebApi.psm1 file. At a minimum, database connection info is required. Copy and modify the following parameter code to fit your connection information.

$parameters = @{
    PackageVersion = "5.2.14406"
    DbConnectionInfo = @{
        Engine="SqlServer"
        Server="localhost"
        UseIntegratedSecurity=$true
    }
    InstallType = "SharedInstance"   
}

Paste the modified parameter code into your PowerShell window and hit enter.

Run the Installation Script

Run the following command in the PowerShell window.

Install-EdFiOdsWebApi @parameters

Copy the TPDM-Community package folder into C:\inetpub\Ed-Fi\WebApi\plugins, delete any existing TPDM plugin in the plugins folder.

Enable tpdm in appsettings.json 

Open the appsettings.json file found in C:\inetpub\Ed-Fi\WebApi.

Edit the Plugin section of the configuration file and update the Folder and Scripts values to the following:

"Plugin": {
    "Folder": "./Plugin",
    "Scripts": [
      "tpdm"
    ]
  },


Step 6. Install Swagger

Extract the contents of the EdFi.Suite3.Installer.SwaggerUI package. The paths in these instructions assume that the package was extracted to a folder with the name of the package (e.g., C:\temp\EdFi.Suite3.Installer.SwaggerUI).

Prepare Installation Script

Open a PowerShell window in Administrator mode and navigate to the EdFi.Suite3.Installer.SwaggerUI folder and run the following Powershell command to load modules for installation:

Import-Module .\Install-EdFiOdsSwaggerUI.psm1

The Swagger UI installer can take a number of parameters to tailor the install experience (more examples can be found in the Install-EdFiOdsWebApi.psm1 file). At a minimum, WebAPI connection information is required. Copy and modify the following parameter code to add your site name.

$parameters = @{
    PackageVersion = "5.2.14406"
    WebApiVersionUrl = "https://YOUR_SITE_OR_SERVER_NAME_HERE/WebApi"
}

Paste the modified parameter into your PowerShell window and execute the code.

Run the Installation Script

Run the following command in the PowerShell window:

Install-EdFiOdsSwaggerUI @parameters

Step 7. Install Admin App 

Admin App v2.2.1 or higher is required for TPDM support

The Admin App provides a graphical interface for platform hosts to administer and manage non-sandbox instances of the Ed-Fi ODS / API. Follow the installation steps here. Alternatively, API keys and secrets can be administered by database administrators via SQL queries as outlined in the article How To: Configure Key / Secret.

Step 8. Restart your Website

  • Open IIS (Press the Windows key Windows logo on your keyboard, type IIS, select Internet Information Services (IIS), and press Enter.
  • Right-click on the server (alternatively, you can right-click the EdFi web site), and select Stop.

  • Right-click the server (or EdFi website) again and select Start.

You are now ready to use the Ed-Fi ODS/API. The following URLs are available:

WebsiteURL
Ed-Fi ODS/APIhttps://YOUR_SERVER_NAME_HERE/WebApi/data/v3
Ed-Fi ODS/API Documentationhttps://YOUR_SERVER_NAME_HERE/SwaggerUI
Downloads

The following link contains sample docker setup files for PostgreSQL

PGDockerSetup.zip

2 Comments

  1. Step 4 links to nuget packages, not PowerShell scripts, and there's nothing in the nuget packages equivalent to the Minimal- and PopulatedTemplateScript values specified (TPDMCommunityMinimalTemplate and TPDMCommunityPopulatedTemplate, respectively).  Simply saving the nuget packages as instructed leads to the following PowerShell error in Reset-OdsDatabase:

    Invoke-TemplateScript : Cannot bind argument to parameter 'scriptPath' because it is an empty string.
    At C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS-Implementation\DatabaseTemplate\Modules\database-tem
    plate-source.psm1:122 char:43

  2. Mimicking the other database template scripts and placing the requisite entries in configuration.packages.json allows database deployment to proceed, but an upgrade process fails due to duplicate descriptor tables (see below).  We've decided to use TPDM Core instead of Community for a proof-of-concept project today, but if someone could post when there's a functioning deployment for Community, that would be appreciated.  Thank you.

    Executing SQLServerDatabaseScriptStrategy...
    & C:\users\mark\downloads\edfi.suite3.restapi.databases\tools\EdFi.Db.Deploy Deploy --engine SQLServer --database ODS --connectionString server=(local);trusted_connection=True;database=EdFi_Ods;application name=EdFi.Ods.WebApi --timeOut 600 --filePaths C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS,C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS-Implementation,C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS\Application\EdFi.Ods.Standard,C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS-Implementation\Plugin\edfi.suite3.ods.extensions.tpdm.community --features changes
    2022-02-03 09:41:04,416 [1] INFO  SqlServerCreateDatabaseCommand - Master ConnectionString => Data Source=(local);Initial Catalog=master;Integrated Security=True;Password=;Application Name=EdFi.Ods.WebApi
    2022-02-03 09:41:04,552 [1] INFO  SqlServerDeployDatabaseFromPathCommand - Deploying database from path C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS\Application\EdFi.Ods.Standard\Artifacts\MsSql\Structure\Ods
    2022-02-03 09:41:04,596 [1] INFO  SqlServerUpgradeEngineFactory - Checking whether journal table exists..
    2022-02-03 09:41:04,601 [1] INFO  SqlServerUpgradeEngineFactory - Fetching list of already executed scripts.
    2022-02-03 09:41:04,618 [1] INFO  SqlServerUpgradeEngineFactory - Beginning database upgrade
    2022-02-03 09:41:04,618 [1] INFO  SqlServerUpgradeEngineFactory - Checking whether journal table exists..
    2022-02-03 09:41:04,618 [1] INFO  SqlServerUpgradeEngineFactory - Fetching list of already executed scripts.
    2022-02-03 09:41:04,624 [1] INFO  SqlServerUpgradeEngineFactory - No new scripts need to be executed - completing.
    2022-02-03 09:41:04,624 [1] INFO  SqlServerDeployDatabaseFromPathCommand - Deploying database from path C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS-Implementation\Plugin\edfi.suite3.ods.extensions.tpdm.community\Artifacts\MsSql\Structure\Ods
    2022-02-03 09:41:04,625 [1] INFO  SqlServerUpgradeEngineFactory - Beginning database upgrade
    2022-02-03 09:41:04,625 [1] INFO  SqlServerUpgradeEngineFactory - Checking whether journal table exists..
    2022-02-03 09:41:04,625 [1] INFO  SqlServerUpgradeEngineFactory - Fetching list of already executed scripts.
    2022-02-03 09:41:04,629 [1] INFO  SqlServerUpgradeEngineFactory - Executing Database Server script 'edfi.suite3.ods.extensions.tpdm.community.Artifacts.MsSql.Structure.Ods.0010-EXTENSION-TPDM-Schemas.sql'
    2022-02-03 09:41:04,633 [1] INFO  SqlServerUpgradeEngineFactory - Checking whether journal table exists..
    2022-02-03 09:41:04,656 [1] INFO  SqlServerUpgradeEngineFactory - Executing Database Server script 'edfi.suite3.ods.extensions.tpdm.community.Artifacts.MsSql.Structure.Ods.0020-EXTENSION-TPDM-Tables.sql'
    2022-02-03 09:41:04,665 [1] INFO  SqlServerUpgradeEngineFactory - SQL exception has occured in script: 'edfi.suite3.ods.extensions.tpdm.community.Artifacts.MsSql.Structure.Ods.0020-EXTENSION-TPDM-Tables.sql'
    2022-02-03 09:41:04,665 [1] ERROR SqlServerUpgradeEngineFactory - Script block number: 0; Block line 2; Procedure ; Number 2714; Message: There is already an object named 'AccreditationStatusDescriptor' in the database.
    2022-02-03 09:41:04,675 [1] ERROR SqlServerUpgradeEngineFactory - System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AccreditationStatusDescriptor' in the database.
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
       at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
       at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at DbUp.Support.ScriptExecutor.ExecuteNonQuery(IDbCommand command)
       at DbUp.Support.ScriptExecutor.<>c__DisplayClass18_2.<Execute>b__1()
       at DbUp.SqlServer.SqlScriptExecutor.ExecuteCommandsWithinExceptionHandler(Int32 index, SqlScript script, Action executeCommand)
    ClientConnectionId:629d6bd6-3b0e-40a6-8809-57d02b434e30
    Error Number:2714,State:6,Class:16
    2022-02-03 09:41:04,675 [1] INFO  SqlServerUpgradeEngineFactory - DB exception has occured in script: 'edfi.suite3.ods.extensions.tpdm.community.Artifacts.MsSql.Structure.Ods.0020-EXTENSION-TPDM-Tables.sql'
    2022-02-03 09:41:04,675 [1] ERROR SqlServerUpgradeEngineFactory - Script block number: 0; Message: There is already an object named 'AccreditationStatusDescriptor' in the database.
    2022-02-03 09:41:04,675 [1] ERROR SqlServerUpgradeEngineFactory - System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AccreditationStatusDescriptor' in the database.
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
       at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
       at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at DbUp.Support.ScriptExecutor.ExecuteNonQuery(IDbCommand command)
       at DbUp.Support.ScriptExecutor.<>c__DisplayClass18_2.<Execute>b__1()
       at DbUp.SqlServer.SqlScriptExecutor.ExecuteCommandsWithinExceptionHandler(Int32 index, SqlScript script, Action executeCommand)
       at DbUp.Support.ScriptExecutor.<>c__DisplayClass18_0.<Execute>b__0(Func`1 dbCommandFactory)
       at DbUp.Engine.Transactions.NoTransactionStrategy.Execute(Action`1 action)
       at DbUp.Engine.Transactions.DatabaseConnectionManager.ExecuteCommandsWithManagedConnection(Action`1 action)
       at DbUp.Support.ScriptExecutor.Execute(SqlScript script, IDictionary`2 variables)
    ClientConnectionId:629d6bd6-3b0e-40a6-8809-57d02b434e30
    Error Number:2714,State:6,Class:16
    2022-02-03 09:41:04,675 [1] ERROR SqlServerUpgradeEngineFactory - Upgrade failed due to an unexpected exception:
    System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AccreditationStatusDescriptor' in the database.
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
       at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
       at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at DbUp.Support.ScriptExecutor.ExecuteNonQuery(IDbCommand command)
       at DbUp.Support.ScriptExecutor.<>c__DisplayClass18_2.<Execute>b__1()
       at DbUp.SqlServer.SqlScriptExecutor.ExecuteCommandsWithinExceptionHandler(Int32 index, SqlScript script, Action executeCommand)
       at DbUp.Support.ScriptExecutor.<>c__DisplayClass18_0.<Execute>b__0(Func`1 dbCommandFactory)
       at DbUp.Engine.Transactions.NoTransactionStrategy.Execute(Action`1 action)
       at DbUp.Engine.Transactions.DatabaseConnectionManager.ExecuteCommandsWithManagedConnection(Action`1 action)
       at DbUp.Support.ScriptExecutor.Execute(SqlScript script, IDictionary`2 variables)
       at DbUp.Engine.UpgradeEngine.PerformUpgrade()
    ClientConnectionId:629d6bd6-3b0e-40a6-8809-57d02b434e30
    Error Number:2714,State:6,Class:16
    2022-02-03 09:41:04,676 [1] INFO  SqlServerDeployDatabaseFromPathCommand - Deploying database from path C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS\Application\EdFi.Ods.Standard\Artifacts\MsSql\Data\Ods
    2022-02-03 09:41:04,676 [1] INFO  SqlServerUpgradeEngineFactory - Beginning database upgrade
    2022-02-03 09:41:04,676 [1] INFO  SqlServerUpgradeEngineFactory - Checking whether journal table exists..
    2022-02-03 09:41:04,677 [1] INFO  SqlServerUpgradeEngineFactory - Fetching list of already executed scripts.
    2022-02-03 09:41:04,679 [1] INFO  SqlServerUpgradeEngineFactory - No new scripts need to be executed - completing.
    2022-02-03 09:41:04,679 [1] ERROR ApplicationRunner - System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AccreditationStatusDescriptor' in the database.
       at EdFi.Db.Deploy.ApplicationRunner.Run() in D:\BuildAgent\work\f4e8de816b1e4fa6\src\EdFi.Db.Deploy\ApplicationRunner.cs:line 81
    ClientConnectionId:629d6bd6-3b0e-40a6-8809-57d02b434e30
    Error Number:2714,State:6,Class:16
    C:\users\mark\downloads\edfi.suite3.restapi.databases\tools\EdFi.Db.Deploy exited with code -1
    At C:\users\mark\downloads\edfi.suite3.restapi.databases\Ed-Fi-ODS-Implementation\logistics\scripts\modules\tools\Tools
    Helper.psm1:288 char:5
    +     Throw "$tool exited with code $LASTEXITCODE"
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : OperationStopped: (C:\users\mark\d...ed with code -1:String) [], RuntimeException
        + FullyQualifiedErrorId : C:\users\mark\downloads\edfi.suite3.restapi.databases\tools\EdFi.Db.Deploy exited with c
       ode -1