RavenDB - Update Properties within a Document
Octopus.Script exported 11/26/2015 by timhunt303 belongs to 'RavenDB' category.
Retrieves the specified document by a Raven Query, updates selected variables with values from octopus Variables. Replaces the current document with the newly created document with the updated values. IMPORTANT: Any variable that is being updated MUST have an Octopus Variable that has exactly the same name (including capitals, any special characters, etc.) prefixed with “Property_”. This is the case of BOTH document variables and Metadata variables. I.E. if you wanted TestMode change, you MUST have an Octopus Variable named Property_TestMode (same name, and capitals, etc.).
Parameters
When steps based on the template are included in a project's deployment process, the parameters below can be set.
URL of the Database
The URL of the database.
For example: http://localhost:8080/
Name of the Database
Name of the database in Raven
Name of the Document
Name of the document in Raven that the program will retrieve.
List of Included Document Variables
A List of document variables that the program will update based on values within Octopus Variables
IMPORTANT: The names of the variables MUST be the same (including capitals, special characters, etc.)
List of Excluded Document Variables
A list of document variables that the step will exclude from the updated version.
For example: if TestMode is in both the include and exclude document list, then TestMode will be excluded from the update.
List of Included Metadata Variables
A List of Metadata variables that the program will update based on values within Octopus Variables
IMPORTANT: The names of the variables MUST be the same (including capitals, special characters, etc.)
List of Excluded Metadata Variables
A list of Metadata variables that the step will exclude from the updated version.
For example: if Raven-Entity-Name is in both the include and exclude metadata lists, then Raven-Entity-Name will be excluded from the update.
Script body
#Variables
#--------------------------------------------------------------------
#RavenDB database variables
#URL address of RavenDB
$ravenDatabaseURL = $OctopusParameters["ravenDatabaseURL"]
#Name of the database
$ravenDatabaseName = $OctopusParameters["ravenDatabaseName"]
#--------------------------------------------------------------------
#RavenDB Query variables
#Raven Query
#$ravenQuery = $OctopusParameters["ravenQuery"]
#Name of the settings document
$ravenDocumentName = $OctopusParameters["ravenDocumentName"]
#--------------------------------------------------------------------
#Setting Variables
#list of settings variables that are to be changed
$includeSettingList = $OctopusParameters["includeSettingList"]
#list of settings variables that are NOT to be changed
$excludeSettingList = $OctopusParameters["excludeSettingList"]
#--------------------------------------------------------------------
#Metadata variables
#list of metadata variables that are to be changed
$includeMetadataList = $OctopusParameters["includeMetadataList"]
#list of metadata variables that are NOT to be changed
$excludeMetadataList = $OctopusParameters["excludeMetadataList"]
#--------------------------------------------------------------------
#other variables
$octopusVariableList = $OctopusParameters.GetEnumerator()
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#checks to see if the entered database exists, return a Boolean value depending on the outcome
function doesRavenDBExist([string] $databaseChecking, [string]$URL)
{
#retrieves the list of databases at the specified URL
$database_list = Invoke-RestMethod -Uri "$ravenDatabaseURL/databases" -Method Get
#checks if the database is at the specified URL
if ($database_list -contains $databaseChecking.ToString())
{
return $TRUE
}
else
{
return $FALSE
}
}#ends does ravenDB exist function
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#check to see if the database exists
Write-Output "Checking if $ravenDatabaseName exists"
$database_exists = doesRavenDBExist -databaseChecking $ravenDatabaseName -URL $ravenDatabaseURL
#only proceeds if database exists
if ($database_exists -eq $TRUE)
{
Write-Output "$ravenDatabaseName exists"
}#ends database exists if statement
else
{
Write-Error "$ravenDatabaseName doesn't exists. `nMake sure the database exists before continuing" -ErrorId E4
Exit 1
}
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#Get current setings and change them accordingly
$allSettingsJSON = $null
Write-Output "Getting Document: $ravenDatabaseName"
$settingsURI = "$ravenDatabaseURL/databases/$ravenDatabaseName/docs/$ravenDocumentName"
try {
#Gets settings from the specific Uri
$allSettings = Invoke-RestMethod -Uri $settingsURI -Method Get
} catch {
if ($_.Exception.Response.StatusCode.Value__ -ne 404) {
$_.Exception
}
}
#check to make sure the query return some results
if($allSettings -eq $null)
{
Write-Error "An error occurred while querying the database. `nThe query did not return any values. `nPlease enter a new query" -ErrorId E4
Exit 1
}
$includeList = @()
($includeSettingList.Split(", ") | ForEach {
$includeList += $_.ToString()
})
Write-Output "Updating the Settings document"
try
{
#changes the values of the included settings within the original settings document to values from Octopus Variables
for($i = 0; $i -lt $includeList.length; $i++)
{
#checks if the any of the include setting list is in the exclude setting list
if($excludeSettingList -notcontains $includeList[$i])
{
$octopusVariableList = $OctopusParameters.GetEnumerator()
#loops through the variable list to find the corresponding value to the settings variable
foreach($varKey in $octopusVariableList)
{
$newSettingVar = $includeList[$i].ToString()
$newSettingVar = "Property_$newSettingVar"
#sets the setting variable to the correct variable in octopus
if($varKey.Key -eq $newSettingVar)
{
$allSettings.($includeList[$i]) = $varKey.Value
}#ends if
}#ends for each
}#ends check if settings in excluded list
}#ends for
}#ends try
catch
{
Write-Error "An error occurred while trying to find the Setting Variables." -ErrorId E4
Exit 1
}
Write-Output "Update complete"
Write-Output "`n-----------------------------"
#--------------------------------------------------------------------
#set update metadata information
Write-Output "Updating the Metadata of the document"
$metadata = @{}
$metadataList = @()
($includeMetadataList.Split(", ") | Foreach {
$metadataList += $_.ToString()
})
try
{
for($i = 0; $i -lt $metadataList.length; $i++)
{
if($excludeMetadataList -notcontains $metadataList[$i])
{
$octopusVariableList = $OctopusParameters.GetEnumerator()
foreach($varKey in $octopusVariableList)
{
$newMetadataVar = $metadataList[$i]
$newMetadataVar = "Property_$newMetadataVar"
if($varKey.Key -eq $newMetadataVar)
{
$temp = $metadataList[$i].ToString()
$metadata.Add("$temp", $varKey.Value)
}
}#ends foreach
}#ends if
}#Ends for
}#ends try
catch
{
Write-Error "An error occurred while trying to find the Metadata Variables." -ErrorId E4
Exit 1
}
Write-Output "Metadata update complete"
#--------------------------------------------------------------------
#converting settings to a JSON document
Write-Output "Converting settings to a JSON document"
#Converts allSettings to JSON so it can be added to RavenDB
if ($allSettingsJSON -eq $null)
{
$allSettingsJSON = ConvertTo-Json -InputObject $allSettings
}
Write-Output "`n-------------------------`n"
#--------------------------------------------------------------------
#inserting settings document
Write-Output "Restoring Document: $ravenDatabaseName . Inserting the new settings document to the database"
#URL to put the JSON document
$putSettingsURI = "$ravenDatabaseURL/databases/$ravenDatabaseName/docs/$ravenDocumentName"
#Puts the settings and metadata in the specified RavenDB
try
{
Invoke-RestMethod -Uri $putSettingsURI -Headers $metadata -Body $allSettingsJSON -Method Put
Write-Output "New settings have been successfully added to the database"
}
catch
{
Write-Error "An error occurred while inserting the new settings document to the database" -ErrorId E4
}
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
Show JSON{
"Id": "89806198-6216-4034-a934-6de6a3f445b0",
"Name": "RavenDB - Update Properties within a Document",
"Description": "Retrieves the specified document by a Raven Query, updates selected variables with values from octopus Variables. Replaces the current document with the newly created document with the updated values.\n**IMPORTANT**: Any variable that is being updated **MUST** have an Octopus Variable that has exactly the same name (including capitals, any special characters, etc.) prefixed with “Property_”. This is the case of **BOTH** document variables and Metadata variables. I.E. if you wanted TestMode change, you **MUST** have an Octopus Variable named Property_TestMode (same name, and capitals, etc.).\n",
"Version": 50,
"ExportedAt": "2015-11-26T22:00:53.359+00:00",
"ActionType": "Octopus.Script",
"Author": "timhunt303",
"Parameters": [
{
"Name": "ravenDatabaseURL",
"Label": "URL of the Database",
"HelpText": "The URL of the database.\n\nFor example: **http://localhost:8080/**",
"DefaultValue": "http://localhost:8080/",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "ravenDatabaseName",
"Label": "Name of the Database",
"HelpText": "Name of the database in Raven",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "ravenDocumentName",
"Label": "Name of the Document",
"HelpText": "Name of the document in Raven that the program will retrieve.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "includeSettingList",
"Label": "List of Included Document Variables",
"HelpText": "A List of document variables that the program will update based on values within Octopus Variables\n\n**IMPORTANT:** The names of the variables **MUST** be the same (including capitals, special characters, etc.)",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "excludeSettingList",
"Label": "List of Excluded Document Variables",
"HelpText": "A list of document variables that the step will exclude from the updated version. \n\nFor example: if TestMode is in both the include and exclude document list, then TestMode will be excluded from the update.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "includeMetadataList",
"Label": "List of Included Metadata Variables",
"HelpText": "A List of Metadata variables that the program will update based on values within Octopus Variables\n\n**IMPORTANT:** The names of the variables **MUST** be the same (including capitals, special characters, etc.)",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "excludeMetadataList",
"Label": "List of Excluded Metadata Variables",
"HelpText": "A list of Metadata variables that the step will exclude from the updated version. \n\nFor example: if Raven-Entity-Name is in both the include and exclude metadata lists, then Raven-Entity-Name will be excluded from the update.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "\n#Variables\n\n#--------------------------------------------------------------------\n#RavenDB database variables\n\n#URL address of RavenDB\n$ravenDatabaseURL = $OctopusParameters[\"ravenDatabaseURL\"]\n\n#Name of the database\n$ravenDatabaseName = $OctopusParameters[\"ravenDatabaseName\"]\n\n#--------------------------------------------------------------------\n#RavenDB Query variables\n\n#Raven Query\n#$ravenQuery = $OctopusParameters[\"ravenQuery\"]\n\n#Name of the settings document\n$ravenDocumentName = $OctopusParameters[\"ravenDocumentName\"]\n\n#--------------------------------------------------------------------\n#Setting Variables\n\n#list of settings variables that are to be changed\n$includeSettingList = $OctopusParameters[\"includeSettingList\"]\n\n#list of settings variables that are NOT to be changed\n$excludeSettingList = $OctopusParameters[\"excludeSettingList\"]\n\n#--------------------------------------------------------------------\n#Metadata variables\n\n#list of metadata variables that are to be changed\n$includeMetadataList = $OctopusParameters[\"includeMetadataList\"]\n\n#list of metadata variables that are NOT to be changed\n$excludeMetadataList = $OctopusParameters[\"excludeMetadataList\"]\n\n\n#--------------------------------------------------------------------\n#other variables\n\n$octopusVariableList = $OctopusParameters.GetEnumerator()\n\n\n\nWrite-Output \"`n-------------------------`n\"\n#--------------------------------------------------------------------\n#checks to see if the entered database exists, return a Boolean value depending on the outcome\nfunction doesRavenDBExist([string] $databaseChecking, [string]$URL)\n{\n #retrieves the list of databases at the specified URL\n $database_list = Invoke-RestMethod -Uri \"$ravenDatabaseURL/databases\" -Method Get\n #checks if the database is at the specified URL\n if ($database_list -contains $databaseChecking.ToString()) \n {\n return $TRUE\n }\n else \n {\n return $FALSE\n }\n\n \n\n}#ends does ravenDB exist function\n\n\nWrite-Output \"`n-------------------------`n\"\n#-------------------------------------------------------------------- \n#check to see if the database exists\n \n\nWrite-Output \"Checking if $ravenDatabaseName exists\"\n\n$database_exists = doesRavenDBExist -databaseChecking $ravenDatabaseName -URL $ravenDatabaseURL\n\n\n#only proceeds if database exists\nif ($database_exists -eq $TRUE)\n{\n Write-Output \"$ravenDatabaseName exists\"\n \n}#ends database exists if statement \nelse \n{\n Write-Error \"$ravenDatabaseName doesn't exists. `nMake sure the database exists before continuing\" -ErrorId E4\n Exit 1\n}\n\n\nWrite-Output \"`n-------------------------`n\" \n \n#--------------------------------------------------------------------\n#Get current setings and change them accordingly\n\n$allSettingsJSON = $null\n\nWrite-Output \"Getting Document: $ravenDatabaseName\"\n\n$settingsURI = \"$ravenDatabaseURL/databases/$ravenDatabaseName/docs/$ravenDocumentName\"\n\n \n\ntry {\n #Gets settings from the specific Uri\n $allSettings = Invoke-RestMethod -Uri $settingsURI -Method Get\n\n} catch {\n if ($_.Exception.Response.StatusCode.Value__ -ne 404) {\n \n $_.Exception\n }\n}\n\n#check to make sure the query return some results\nif($allSettings -eq $null)\n{\n Write-Error \"An error occurred while querying the database. `nThe query did not return any values. `nPlease enter a new query\" -ErrorId E4\n Exit 1\n}\n\n$includeList = @()\n\n($includeSettingList.Split(\", \") | ForEach {\n $includeList += $_.ToString()\n})\n\n \nWrite-Output \"Updating the Settings document\"\ntry\n{\n \n\n #changes the values of the included settings within the original settings document to values from Octopus Variables\n for($i = 0; $i -lt $includeList.length; $i++)\n {\n \n \n #checks if the any of the include setting list is in the exclude setting list\n if($excludeSettingList -notcontains $includeList[$i])\n {\n \n \n $octopusVariableList = $OctopusParameters.GetEnumerator()\n \n #loops through the variable list to find the corresponding value to the settings variable\n foreach($varKey in $octopusVariableList)\n {\n \n \n $newSettingVar = $includeList[$i].ToString()\n \n $newSettingVar = \"Property_$newSettingVar\"\n \n #sets the setting variable to the correct variable in octopus\n if($varKey.Key -eq $newSettingVar)\n {\n \n \n\n $allSettings.($includeList[$i]) = $varKey.Value \n\n }#ends if\n\n }#ends for each\n\n\n\n }#ends check if settings in excluded list\n\n\n }#ends for\n}#ends try\ncatch\n{\n Write-Error \"An error occurred while trying to find the Setting Variables.\" -ErrorId E4\n Exit 1\n}\n\n\nWrite-Output \"Update complete\"\n\nWrite-Output \"`n-----------------------------\"\n\n#--------------------------------------------------------------------\n#set update metadata information\n\nWrite-Output \"Updating the Metadata of the document\"\n\n$metadata = @{}\n\n$metadataList = @()\n\n($includeMetadataList.Split(\", \") | Foreach {\n $metadataList += $_.ToString()\n})\n\n\ntry\n{\n for($i = 0; $i -lt $metadataList.length; $i++)\n {\n \n if($excludeMetadataList -notcontains $metadataList[$i])\n {\n \n $octopusVariableList = $OctopusParameters.GetEnumerator()\n \n foreach($varKey in $octopusVariableList)\n {\n \n $newMetadataVar = $metadataList[$i]\n \n $newMetadataVar = \"Property_$newMetadataVar\"\n\n if($varKey.Key -eq $newMetadataVar)\n {\n \n $temp = $metadataList[$i].ToString()\n \n $metadata.Add(\"$temp\", $varKey.Value)\n \n \n }\n \n }#ends foreach\n\n }#ends if\n\n }#Ends for \n}#ends try\ncatch\n{\n Write-Error \"An error occurred while trying to find the Metadata Variables.\" -ErrorId E4\n Exit 1\n}\n\n\nWrite-Output \"Metadata update complete\"\n\n\n\n#--------------------------------------------------------------------\n#converting settings to a JSON document\n\nWrite-Output \"Converting settings to a JSON document\"\n\n#Converts allSettings to JSON so it can be added to RavenDB\nif ($allSettingsJSON -eq $null) \n{\n $allSettingsJSON = ConvertTo-Json -InputObject $allSettings\n}\n\n\n\nWrite-Output \"`n-------------------------`n\"\n\n#--------------------------------------------------------------------\n#inserting settings document\n\nWrite-Output \"Restoring Document: $ravenDatabaseName . Inserting the new settings document to the database\"\n\n#URL to put the JSON document\n$putSettingsURI = \"$ravenDatabaseURL/databases/$ravenDatabaseName/docs/$ravenDocumentName\"\n\n#Puts the settings and metadata in the specified RavenDB\ntry\n{\n\n Invoke-RestMethod -Uri $putSettingsURI -Headers $metadata -Body $allSettingsJSON -Method Put\n \n Write-Output \"New settings have been successfully added to the database\"\n}\ncatch\n{\n Write-Error \"An error occurred while inserting the new settings document to the database\" -ErrorId E4\n} \n\n"
},
"Category": "RavenDB",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/ravendb-update-properties-within-a-document.json",
"Website": "/step-templates/89806198-6216-4034-a934-6de6a3f445b0",
"Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRF0Y6OjR8iHx8fW1la0szNmVZZZB8k5crLkIyMwl1evI6QwrCw6uPjsiAh////8/HxjiSEkQAABNlJREFUeNrs24uWmyAUBVBQkKfh//+2gKiYGKMRsWkPnbUmdZLUPfeBEUoe/8gggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggADy/0GceDpgpDSM/SCE9L1SxMweK5swWu/5rdQKlDAUmTCmbZqkYb9UIzZR+p4INxxishlHa1xViBNC7H0Lo5RZvrafBrHDIdY2maUixJ+L2v0W/nxfD41D2cRtsiHtXwAhzz9aQlSMj1CvlDantLYSxPeevRArRHZW/cBymWR0LoJSOirHi51sZ9103lml9GooONssKdUhhszN9CEI2apWn1pJmqdXP7zELtKraVlliHot563ZfQyZJYQo6hV0CtOTpDG1IfRACoqeqrxrJMpwzC0hTVsT4vTTTJFlmf0YHyF8VMIflSZHuWxf7q5iz19Me5F6nNJb7WGQ6LXmVaoRn4P0dIBQStWml8avGFYnL8muUxCjeIIMZeG7G5neMOiG2iKUJsrQ++LZLyXWZBnX+mtlVxWSnzMPTcF/p/NBf+YJEh4FDY/nZw1zbBGT5nW0ByfMryB+Ls8n89hnQ9rwESKIJlE1RSRZxn+ONTuGNJdAyPzbJtkpLdr0CCF0HNPT0t9Xp/i340Aj2A/RMyQ8XOtSU0T0BNFPEP56/bg5zOWQ6YVaE50uYLTiii8hJCReeArNQ2J2Q3b3tP0QwzlfiwhdCU88bS6GUhI0H/xIah2YMc93rfeQsbAHAE8SO3bgDzk1teN9khKQjurt5tz55/jk6sKD4bnyI8R7x8/Hu0r+PKTLIuKzj7+gWKBSLbRW0bIP0kg315J010E0H2b1hxBsmlTyjHqKiJ5IbO880voxPmaXQXhHX++zdP43nkGM9kNYHb8FUghIJD2ao+NTpXwPoZ1YrRe+eE467xSbCInXKe1hyYegfA3xrdV9igjv5kbgg5Ig1L/OfQHZ/oxf9k5jqBeRQ+aI+EcR4r/Mvmo/ll6FIExrsZp+3QTpuoevlvHIV5AtSSGI7jq91hDmiKTrgjH5WPOdxFaFhG71pjR9QM5A3l96FYL4CzGziESn30O6E5C3FX/J0tsWhA6QQxNJm0+N7jaICBcuwy/SshgRsRuyWOmy4VbSu7uTFSBsrItYSmGwfRD/sX3/PYgKq7ozRMgDkINrW1UhKSC7IEfvCteCtNOjXZDjKw4VIFZqqc3cfD9DvrmLWnfnw1wjrGg4akOc8YrmA+TL1Z+6EbGBsQ35dpmh8qaaKSKyULO6CxKLpHl7GX9iUbEyRMfcevdR98zqVWVImEnipXixbnUT5BEiwtch51Z4a0NaHxG5dhf77Jp7bQj3ETErtX56cbc2xPjcYq+1fn43R20Ii93XFi2PWyCuCRfC5sg9xL8T4ud2+bx1q8jeh+qQ1te6u2APR3WIbJaZVWp/UH0IX2QWc78KYSbrWQV3NlaHuCwgsuAe4Bs2+bvy2+fugbTF0+oeiLtgi+ktkLb0/tK7utYV4bhlZi/brG6DyPK74m+BOHnVO+M/iwECCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACSM3xR4ABAI1fHCI0qDDgAAAAAElFTkSuQmCC",
"$Meta": {
"Type": "ActionTemplate"
}
}Provided under the Apache License version 2.0.