Deploy SSAS from Package

Octopus.Script exported 2020-09-25 by twerthi belongs to ‘SQL Server’ category.

Deploys SSAS packages using Microsoft.AnalysisServices.Deployment.exe.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

SsasPackageStepName

null

Server

SsasServer

null

Database

SsasDatabase

null

Data Source - Server

SrcServer =

null

Data Source - Database

SrcDatabase = Warehouse

null

Script body

Steps based on this template will execute the following PowerShell script.

$ErrorActionPreference = 'Stop'

function Confirm-Argument($name, $value) {
    if (!$value) {
        throw ('Missing required value for parameter ''{0}''.' -f $name)
    }
    return $value
}

# Returns the Microsoft.AnalysisServices.Deployment.exe path
function Get-SSASexe
{
	# Search for file
    $ssasExe = Get-ChildItem -Path "C:\Program Files (x86)" -Recurse | Where-Object {$_.Name -eq "Microsoft.AnalysisServices.Deployment.exe"}
    
    # Check for null
    if ($null -eq $ssasExe)
    {
    	# Display error
        Write-Error "Unable to find Microsoft.AnalysisServices.Deployment.exe!"
    }

    # Check for mulitple results
    if ($ssasExe.GetType().IsArray)
    {
        # Declare local variables
        $highestVersion = $null
        
        # Display multiple returned
        Write-Host "Multiple files returned, finding highest version ..."

        # Loop through results
        foreach ($file in $ssasExe)
        {
            # Check version 
            if (($null -eq $highestVersion) -or ([version]$file.VersionInfo.ProductVersion) -gt [version]$highestVersion.VersionInfo.ProductVersion)
            {
                # Assign it
                $highestVersion = $file
            }
        }

        # Overwrite original
        $ssasExe = $highestVersion
    }
    
    # Return the path
    return $ssasExe.FullName
}

# Update Deploy xml (.deploymenttargets)
function Update-Deploy {
	[xml]$deployContent = Get-Content $file
	$deployContent.DeploymentTarget.Database = $ssasDatabase 
	$deployContent.DeploymentTarget.Server = $ssasServer
	$deployContent.DeploymentTarget.ConnectionString = 'DataSource=' + $ssasServer + ';Timeout=0'
	$deployContent.Save($file)
}
# Update Config xml (.configsettings)
function Update-Config {
	[xml]$configContent = Get-Content $file
    $configContent.ConfigurationSettings.Database.DataSources.DataSource.ConnectionString = 'Provider=SQLNCLI11.1;Data Source=' + $dbServer + ';Integrated Security=SSPI;Initial Catalog=' + $dbDatabase
	$configContent.Save($file)
}
# Update Config xml (.deploymentoptions)
function Update-Option {
	[xml]$optionContent = Get-Content $file
    $optionContent.DeploymentOptions.ProcessingOption = 'DoNotProcess'
	$optionContent.Save($file)
}

# Get arguments
$ssasPackageStepName = Confirm-Argument 'SSAS Package Step Name' $OctopusParameters['SsasPackageStepName']
$ssasServer = Confirm-Argument 'SSAS server name' $OctopusParameters['SsasServer']
$ssasDatabase = Confirm-Argument 'SSAS database name' $OctopusParameters['SsasDatabase']
$dbServer = Confirm-Argument 'SSAS source server' $OctopusParameters['SrcServer']
$dbDatabase = Confirm-Argument 'SSAS source database' $OctopusParameters['SrcDatabase']

# Set .NET CurrentDirectory to package installation path
$installDirPathFormat = 'Octopus.Action[{0}].Output.Package.InstallationDirectoryPath' -f $ssasPackageStepName
$installDirPath = $OctopusParameters[$installDirPathFormat]

Write-Verbose ('Setting CurrentDirectory to ''{0}''' -f $installDirPath)
[System.Environment]::CurrentDirectory = $installDirPath

# Get SSAS exe location
$exe = Get-SSASexe

$files = Get-ChildItem –Path $installDirPath\* -Include *.deploymenttargets
foreach ($file in $files) {
  $name = [IO.Path]::GetFileNameWithoutExtension($file)

  Write-Host 'Updating' $file
  Update-Deploy
  $file = $installDirPath + '\' + $name + '.configsettings'
  if(Test-Path $file) {
      Write-Host 'Updating' $file
      Update-Config
  } else {
    Write-Host "Config settings doesn't exist. Skipping."
  }
  $file = $installDirPath + '\' + $name + '.deploymentoptions'
  Write-Host 'Updating' $file
  Update-Option

  $ssasArguments = @()
  $ssasArguments += ('"' + $installDirPath + '\' + $name + '.asdatabase"')
  $ssasArguments += '/s:"' + $installDirPath + '\Log.txt"'
  
  Write-Host $exe $ssasArguments
  & $exe $ssasArguments
  
  # Get last exit code
  $ssasExitCode = $LastExitcode
  
  # Check to make sure log file exists
  if ((Test-Path -Path "$installDirPath\Log.txt") -eq $true)
  {
    # Upload log as artifact
    New-OctopusArtifact -Path "$installDirPath\Log.txt" -Name "Log.txt"
  }
  else
  {
    # Write error
    Write-Error "Error: $installDirPath\Log.txt not found!"
  }
  
  # Check the code
  if ($ssasExitCode -ne 0)
  {
  	Write-Error "Operation failed, see log for details."
  }
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "1409c3dd-e87d-49f1-9b4f-382af800b75d",
  "Name": "Deploy SSAS from Package",
  "Description": "Deploys SSAS packages using Microsoft.AnalysisServices.Deployment.exe.",
  "Version": 14,
  "ExportedAt": "2020-09-25T23:49:43.003Z",
  "ActionType": "Octopus.Script",
  "Author": "twerthi",
  "Parameters": [
    {
      "Id": "435fbf52-470d-442f-88d3-0b708dfc3657",
      "Name": "SsasPackageStepName",
      "Label": "",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "StepName"
      },
      "Links": {}
    },
    {
      "Id": "a0713297-cdeb-47cd-ac43-4bf9603c8052",
      "Name": "SsasServer",
      "Label": "Server",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "7bf5ec64-3383-40ae-935e-e78c236cdf21",
      "Name": "SsasDatabase",
      "Label": "Database",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "d7d4fcbc-d0d4-4a3b-b477-28d23fbe1f9b",
      "Name": "SrcServer",
      "Label": "Data Source - Server",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "45b60a3f-9339-4c69-bc14-df94b47be9e7",
      "Name": "SrcDatabase",
      "Label": "Data Source - Database",
      "HelpText": null,
      "DefaultValue": "Warehouse",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    }
  ],
  "Properties": {
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "$ErrorActionPreference = 'Stop'\n\nfunction Confirm-Argument($name, $value) {\n    if (!$value) {\n        throw ('Missing required value for parameter ''{0}''.' -f $name)\n    }\n    return $value\n}\n\n# Returns the Microsoft.AnalysisServices.Deployment.exe path\nfunction Get-SSASexe\n{\n\t# Search for file\n    $ssasExe = Get-ChildItem -Path \"C:\\Program Files (x86)\" -Recurse | Where-Object {$_.Name -eq \"Microsoft.AnalysisServices.Deployment.exe\"}\n    \n    # Check for null\n    if ($null -eq $ssasExe)\n    {\n    \t# Display error\n        Write-Error \"Unable to find Microsoft.AnalysisServices.Deployment.exe!\"\n    }\n\n    # Check for mulitple results\n    if ($ssasExe.GetType().IsArray)\n    {\n        # Declare local variables\n        $highestVersion = $null\n        \n        # Display multiple returned\n        Write-Host \"Multiple files returned, finding highest version ...\"\n\n        # Loop through results\n        foreach ($file in $ssasExe)\n        {\n            # Check version \n            if (($null -eq $highestVersion) -or ([version]$file.VersionInfo.ProductVersion) -gt [version]$highestVersion.VersionInfo.ProductVersion)\n            {\n                # Assign it\n                $highestVersion = $file\n            }\n        }\n\n        # Overwrite original\n        $ssasExe = $highestVersion\n    }\n    \n    # Return the path\n    return $ssasExe.FullName\n}\n\n# Update Deploy xml (.deploymenttargets)\nfunction Update-Deploy {\n\t[xml]$deployContent = Get-Content $file\n\t$deployContent.DeploymentTarget.Database = $ssasDatabase \n\t$deployContent.DeploymentTarget.Server = $ssasServer\n\t$deployContent.DeploymentTarget.ConnectionString = 'DataSource=' + $ssasServer + ';Timeout=0'\n\t$deployContent.Save($file)\n}\n# Update Config xml (.configsettings)\nfunction Update-Config {\n\t[xml]$configContent = Get-Content $file\n    $configContent.ConfigurationSettings.Database.DataSources.DataSource.ConnectionString = 'Provider=SQLNCLI11.1;Data Source=' + $dbServer + ';Integrated Security=SSPI;Initial Catalog=' + $dbDatabase\n\t$configContent.Save($file)\n}\n# Update Config xml (.deploymentoptions)\nfunction Update-Option {\n\t[xml]$optionContent = Get-Content $file\n    $optionContent.DeploymentOptions.ProcessingOption = 'DoNotProcess'\n\t$optionContent.Save($file)\n}\n\n# Get arguments\n$ssasPackageStepName = Confirm-Argument 'SSAS Package Step Name' $OctopusParameters['SsasPackageStepName']\n$ssasServer = Confirm-Argument 'SSAS server name' $OctopusParameters['SsasServer']\n$ssasDatabase = Confirm-Argument 'SSAS database name' $OctopusParameters['SsasDatabase']\n$dbServer = Confirm-Argument 'SSAS source server' $OctopusParameters['SrcServer']\n$dbDatabase = Confirm-Argument 'SSAS source database' $OctopusParameters['SrcDatabase']\n\n# Set .NET CurrentDirectory to package installation path\n$installDirPathFormat = 'Octopus.Action[{0}].Output.Package.InstallationDirectoryPath' -f $ssasPackageStepName\n$installDirPath = $OctopusParameters[$installDirPathFormat]\n\nWrite-Verbose ('Setting CurrentDirectory to ''{0}''' -f $installDirPath)\n[System.Environment]::CurrentDirectory = $installDirPath\n\n# Get SSAS exe location\n$exe = Get-SSASexe\n\n$files = Get-ChildItem –Path $installDirPath\\* -Include *.deploymenttargets\nforeach ($file in $files) {\n  $name = [IO.Path]::GetFileNameWithoutExtension($file)\n\n  Write-Host 'Updating' $file\n  Update-Deploy\n  $file = $installDirPath + '\\' + $name + '.configsettings'\n  if(Test-Path $file) {\n      Write-Host 'Updating' $file\n      Update-Config\n  } else {\n    Write-Host \"Config settings doesn't exist. Skipping.\"\n  }\n  $file = $installDirPath + '\\' + $name + '.deploymentoptions'\n  Write-Host 'Updating' $file\n  Update-Option\n\n  $ssasArguments = @()\n  $ssasArguments += ('\"' + $installDirPath + '\\' + $name + '.asdatabase\"')\n  $ssasArguments += '/s:\"' + $installDirPath + '\\Log.txt\"'\n  \n  Write-Host $exe $ssasArguments\n  & $exe $ssasArguments\n  \n  # Get last exit code\n  $ssasExitCode = $LastExitcode\n  \n  # Check to make sure log file exists\n  if ((Test-Path -Path \"$installDirPath\\Log.txt\") -eq $true)\n  {\n    # Upload log as artifact\n    New-OctopusArtifact -Path \"$installDirPath\\Log.txt\" -Name \"Log.txt\"\n  }\n  else\n  {\n    # Write error\n    Write-Error \"Error: $installDirPath\\Log.txt not found!\"\n  }\n  \n  # Check the code\n  if ($ssasExitCode -ne 0)\n  {\n  \tWrite-Error \"Operation failed, see log for details.\"\n  }\n}\n",
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.RunOnServer": "false",
    "Octopus.Action.Script.ScriptFileName": null,
    "Octopus.Action.Package.FeedId": null,
    "Octopus.Action.Package.PackageId": null
  },
  "Category": "SQL Server",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/ssas-deploy-from-package.json",
  "Website": "/step-templates/1409c3dd-e87d-49f1-9b4f-382af800b75d",
  "Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAD9QTFRFlZ+r3DAr6p+dy8/V4G9t////5efp9M7NrLS+wCYm8/T1vcPK1tnd10xK+fn6/PLyUU5O+eXk3+Hk7O3u7/DxS2XoPwAADb9JREFUeNrsnYl6nbgOgMEYDHghGN7/Wa8k70B6s3AOZD5o2umcSaf+0S4bUbX/kat6QB6QB+QBeUAekAfkAXlAHpAH5AF5QB6QB+QBeUAekAckXMv4XwBZVCPVnwcZlZSNXRrzp0HGTkqplrY1zfKHQboGMZwoGvVXQUbVy152QaPUu3XrJJCl6Xsp1/SBfbdunQJiZd/3zVqqmfprIEb1iLHRpLF5s279FsQ0iCH3etQ03R8CQYyq74/MwTbN3wGxQFGRRJTaJiVL815z/wXIIiviQEunq2lsNyZhvdfcfw6iCMPavl9H20jkgV8gP1F2NRRJmvEvgIA4gAS0B8xkpexEYWB3F0ijAyOxfwAkcsBvHQk53QWW71HwGm8PIhJHazIS98HYdUqBar1TJD8EYQOABGNe+w0J0dj3iuSHIOMw6PRHOyDpdhggE2XvDmLYAChsDh4MSPI1g92DWkGaosbbey0kARbOyFCaTCYgDemioQWp3D+O9EO4NGNCRpIFMKQzjlG9TyS/iOwoE64jjeaVwICOzjeoGfgue38QshPRMV57lhpVjbNemZTMK7X+gaQRSRgQzaz2JDX9CjRiDvWV+gMgRniSltWMMV0TSo1fcIEjEAKUa7k/CDiomkjaeeAU8JEmoRAOuoLp/hWidTJp9RBiipkF07our9fj/Lpmn51MeM2TnAx5gnp/cRZj6P2aD6BdWoBu1QUeiESwWoCu8a10OBfzHUFaATIxoFssfjIxUKbZiJobkg/ibFSNny2aM/pa4Lt0y4eoWwJkQP9S11NQNoOmw18Ic0qDDsIIg59TiC517aTDa5a7OBDPLDjRBMemmbgTCIhjEINbNVpHLXzozzxAhI4mg9ETv7i4DwhYiHa6JfA2T9F6dPltaDwgBQifwgG5ZOAMlpNAZlrShEpW8ykG/mgkCaMmX40LXwX3uUBR21wLgoYxoMOtc22agpJlGBM5AYF5pcFUwOkXXr8Ty2n7IxrWgze4sIo6WrvD4LNx6pc8QDtzHVA0uwGIcJ6otO4IQhahfZLCtqYjYiUwsOlqEMMp8S31w4MIHrUKv1PvnZlhsUJjF4NAWHQ5PCRUIoGA5XutEpMJsquPFjvzX6GcB2I0Ybg45wWDpi/Iz7K07QPiOfZQEwtls7gShCL6kGe6U4tBg8Bmk7syfSjRpF0glOVCEDT3Mp0KQZyV+cxeswKEjur1baGcuc8O66bQsM10C0Wa6jy4oG2E7gXkXeAxdOdhmLkMBPxWSLJyFj5vBKJLURAGJ58m0NKNcuLh01UgLLvXU87CWSEQVlDUSOHu/gQp2xgaTSAidRFISICjl83UiyVYl3/NIdHiKQZy73pNEIq4BqTNzZht2w8sCISjXWjnqYtcEZtLwTBM9c2Qci5I+ouDYs2sQMGPZxH+Y5kGiFIE6nskp4LwEPcmTpaBd99MqZTiLHPK2wwRDAQq5sxVjeS+enMBSGhAzMRhQsTIUOK1Lz9w2cWHZqy+YSevkMiknWvSMRfZoGg2mX1ecBA6yHupCyRCEqDkasaqMYsYc/LGRwWUmdHd7j4dG/x4ukIiE3HQ382KVDF546NAN9XHSmQsWo65wkbmuFSdxcdCtQ7yKP2ZgzLdx9dc19kSEbFqF0mzdsYuDgydf/I/RW8m324jPGUgPPgsoTPz0Af5MNn0p5ZgZpDJ9F6QfI2ztxQf/TT3DS+2J8Hm8b/sYAJxmXeCzJukikdnpcUUG5BeKKzQnfpf0UJUX4gmpyaNdVoQJlWzYSGGG9I5Fz0mXtoJGEh9sPc70ZZErBrN+0AMyyTCkkEwr1BJe1hOwnfysEiQyl5dMWneqlp8iGGCstyI4YLIVKT4gwfDJmvMTHDrIUP44FWz4JbEe93vnIUJXlSHyUDi92rnps1c+/LcgBiG7OIghqu6KHHXYxZlMsLLfpAzlAGTfjB0ICzlgLq0jqO5rGbnIAudtU+KqpAfKiI25XghCM3cuYlvn34+D2Qil5rqKDZlWRY/BA97CkM4aWRb89Pz2+eBsIHMedab1smks62fogs0+JMSDmL+3RH080B8a9qDCJMVvXrehgiu6yiP+pRN0epEgQi3SeUkkgeXXUOuDmdWBn7Wbuh5Gz2U67JtgsvqomUdtw4RQnNx3hMNJ269QS2iXRN7DrmUmXXGIYr+48knBqoTLUR4xztTXzRU73OgSPvSmov27OscELCEQWBgQM1hrjqc2tR+EPx1ojgVZMJTc+hzQzXl2sCc0pVMFkDRLa85iHbWyQe0Xoau1rkrg0AMk5VU5pJCmeXOILR9CMGCJ7cL5TuDJCVReDe7Aoi5K8hUUwKYc4A0MoXCLRy/+vHOIKBYPnXnbVk7BY1KS78zCKPNJShmY/9pjo0ToJjW/PErtJHxniCCjjtAxMBds9LXcrYCIZjFau4PAqURxwg+bDvvuJ/WdeiiEGW8PYge9GSEL7yjMNxOlLGd87XjGi3jriC4k4tHY8H5Gn94GUtc56QiCBn5eGcQMHRB9epEe2yDE0boe4y2i0f8jUcBkPV2IHg2nmHDkwk+uAqD573Q1dps0WAqYPTLi0L7r0CAAXs4NR3vxy8mi+fDAKRQI0AZ7wgyD7j8AQ/O0bMjrDFL8cjeYu0m+KEDux2IyLo4qFM0Q6R4GKnbgbQ3BDE6UdRsXpxWdblIrN00p0fiuBfIpCMGbtIafHwS8UAkYaHG2uLpRHBcKzqvW4GM6Skxhs62a6R7fh0fPgyZripARnK8NwOJ8gh9UXz00K0fn5p2v1uUXXZp771AhN6cc8PZLt4ejFJ+3INV8fm3cQkl7nqngOj9le7jJ8ARAwgqF0HFhxDHDq775Vp0SgGb/308XEEjg5KLbUgmo1Kdx8hSlRuBOHlU2bPfBp8GzSIGPn1o246e3BvBB9usKLwPCHPHqPAx42C1thAIkTQKn80fF6tsNtHiTiB0imelAQlBIluBOJmAVPBRXWXL6QM3ATGYslPhKpNEmq1AnJ04kI2vvQnIxAftXWofQRYUyGZxOJMDOXZjd+4BYnU6mZdApOw3AulwcAWR2O2ib9EOEoNOSSCqFi1f4ViXbL2Lokki3ka2MrkDiKryg5IIgqePRpxRozYUjmQxi9o+Pb1e3/tVVTG1yaJuGZz2IHt/nGoEN9zQbBe1di53NOCEi3p3vbwbX8oD7n1PkzfwH5RljX7iDs7fMDQ5yHrrtrmpLFeDyKraqDbpFk6pkRKsO04NckYBJW8a5bZCpWh9s7HrXpMzfhVEVdX2RtLENhpJJSWNcUKMkBqqppgTBmKBPGVEVeu68UIQ4NjPLwtjtUg08KOx2dCK3eQ2SOQtSAMkciHIUlX9/tMmkRQUXiB7JwtlbpbPXwBiqqra3cZVxUlnSaPCHwCLPzo/jYp1JUi/U6yuwZltNH6uPxh8YuXRHKcRdMsCSHsViK0KjzUqWSWMvt8bj5EHY3LR3MfWdt1yGUiVCQRFUdGXBNWqjklU6KhkOmUpD4Yqq1uvAmkAZHVdBZrXBhQ0CXcBDmcm2y4c+uHCnGxIVJZNlfVWkIpcVgf330HY0e19UIqyODMpyUGzlkwYWb4FkfFFtv7/QSwtP0CYTFCUxq877VpzgWASmWXAdtN7fCdIUKcyUEBo6StSKU9i8s6Q7Lyboiw4a9JhfL8KpE/j/3Lr7WMzyJHEiqTzAjEuoy+cs/Nc14CYqjoK62AxMnnbPqTAVC+iQHBQOUbFctnYUjFXSYQU6yD36vNAntTL0sCzhvL57d03arfP8GaJVJu/fu03xUnn1KtznSGXCO/vPVYmS3uljWx1q/eRJQ/mfr6sT+ibIy+LFZZpr/VayyZE7lPCzk2XpQmznwxffulova/FkUIk3VFxAiWIT+jlZwOL15eOcftSZK+KpR94MaNkVmF9MggQQ7y5EERVpXKBoZfeyNhYmXjVOjYRTFXaC0G8SIKb2lbvnYzlFU2PX7y977TotZr1FZDFk7ipnoWhLzJUJqBO1BmiXpYfxVyuGzdNzKUglMgHmWQRfWloSDmkYW6BaZwppryeJenYi8eBfqn50ESZNMFARuUyYhnbV2qbBVuXpjQuczdF+nhVO6j3JIszENO4MCkzmx59C3VbpvuWtrUvHr/+9QZdcMPGyUJu2gtyN4U5erV1wZHlLx7H/NWWaRNAKK3fh2572IaIFkNiMXcACb4LKI5KCih8q+PH7QxVV0v36pHlX99WMLLaBfmi8D2I5ytOlZYY6ZtXv2rhOztWNghlp1gdvpxgr1ApnR9f/qaFb+0hRqFsh6tjMNmJIo+J9uWvI/nm9vQaUfIb3JQG0imXz2fRsHn5C2K+e2DArH1QsNhvGKuUR462OWhsr/Llbyf4yaEaGR2Yu83gsVaftLgMUtqN4b/hFR4/O69lk1iUsVTTG+VFofbbz+YN73776VFAH99dG1Iu7l09Uh1bdCdf/wqlXxyXHRML5sD/GBD/jpfx/fJsvOttu589vnXv2KhAIBgYQQNfNg//hBdyQcio+vCjxxpks1gLApmqj+rjox0/5G1BgteVfbaPhTjR6Okwl/kAFtl/9PcGyWqpPutEYFW1dM5CAARkcneJlDwLlVP+dVDhMNdHW8mP45TzriBZ7k+Xi4W9kbMS0v5JkDdeD8gD8oA8IA/IA/KAPCAPyAPygDwgD8gD8oA8IA/IA/IXr/8JMAAhf0RDrOWy2QAAAABJRU5ErkJggg==",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Friday, September 25, 2020