15 Nov 2017 03:58 PM
Hi,
I am writing a powershell script to delete and create maintenance windows. Firstly, if I try to create a maintenance window for the the API and theres already a window of the same name, does it update the existing window or does it just fail (i.e. do I need to delete the existing window first?).
Secondly, when trying to delete a window I am running the following command..
(Invoke-WebRequest -Headers @{"Authorization"="Api-Token $token"} "https://$id.live.dynatrace.com/api/v1/maintenance").Content | ConvertFrom-Json
id : TEST
type : Planned
description : test
suppressAlerts : False
suppressProblems : False
scope :
schedule : @{t......}
Invoke-WebRequest -Method Delete -Headers @{"Authorization"="Api-Token $token"}
"https://$id.live.dynatrace.com/api/v1/maintenance/TEST"
StatusCode : 204 StatusDescription : No Content Content : {} RawContent : HTTP/1.1 204 No Content Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, DELETE, PUT Access-Control-Allow-Headers: * X-RateLimit-Limit: 50 X-RateLimit-Remaining: 49 X-Rate... Headers : {[Access-Control-Allow-Origin, *], [Access-Control-Allow-Methods, GET, POST, DELETE, PUT], [Access-Control-Allow-Headers, *], [X-RateLimit-Limit, 50]...} RawContentLength : 0
I get the status 204 but the window does not get deleted. Can someone point out what I am doing wrong? Sure it is something obvious.
Solved! Go to Solution.
16 Nov 2017 11:44 AM
Not got the delete to work yet via the API. Have managed to get it to create a window using the API but only if there is no scope. what I am doing is using powershell to do an invoke webrequest to get all maintenance windows, then cycling through looking for one of a particular name. When it finds it, the script changes the start and end times, and does webrequest to post it back either with the same id or a new one (the name of the window). This works if I choose to efficitively amend a window that affects the 'entire environment' but I get the following error when trying to create a window with scope.
Invoke-WebRequest -Headers @{"Authorization"="Api-Token $token"} "https://$id.live.dynatrace.com/api/v1/maintenance" -ContentType 'application/json' -Method POST -Body ($window | ConvertTo-Json)
Invoke-WebRequest : {"error":{"code":400,"message":"failed processing (parsing, generating) JSON content"}}
At C:\Scripts\ruxit api.ps1:26 char:9
+ Invoke-WebRequest -Headers @{"Authorization"="Api-Token $token"} "https: ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
16 Nov 2017 11:44 AM
Here is the JSON object I am trying to send....
{
"id": "UAT",
"type": "Planned",
"description": "Testing maintenance window",
"suppressAlerts": true,
"suppressProblems": true,
"scope": {
"entities": [
"SYNTHETIC_TEST-00000000000037DF"
],
"matches": [
"@{type=HOST; tags=System.Object[]}"
]
},
"schedule": {
"type": "Once",
"timezoneId": "Europe/London",
"maintenanceStart": "2017-11-16 11:41",
"maintenanceEnd": "2018-11-16 11:41"
}
}
16 Nov 2017 11:47 AM
Run the same script with no scope set, and it works fine...
{
"id": "TEST",
"type": "Planned",
"description": "test",
"suppressAlerts": false,
"suppressProblems": false,
"scope": null,
"schedule": {
"type": "Once",
"timezoneId": "Europe/London",
"maintenanceStart": "2017-11-16 11:45",
"maintenanceEnd": "2018-11-16 11:45"
}
}
StatusCode : 204
StatusDescription : No Content
Content : {}
RawContent : HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Access-Control-Allow-Headers: *
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 49
X-Rate...
Headers : {[Access-Control-Allow-Origin, *], [Access-Control-Allow-Methods, GET, POST, DELETE, PUT], [Access-Control-Allow-Headers, *], [X-RateLimit-Limit, 50]...}
RawContentLength :
28 Feb 2018 09:14 AM
Delete of maintenance window should of course work with a HTTP DELETE request to following path:
HTTP DELETE https://{your_domain}/api/v1/maintenance/theWindo...
Also an update of an existing config is possible, just use the same HTTP POST payload and change some infos.
HTTP POST https://{your_domain}/api/v1/maintenance
change the values within your maintenance window config object but keep the same "id" : "theWindowId" field.
The POST with your scope does not work because of wrong format. See my example below:
"scope" : {
"entities" : [ ],
"matches" : [
{
"type" : "HOST",
"tags" : [ {"key" : "myTag" }
]
},
{
"type" : "SERVICE",
"tags" : [ {"key" : "myTag" }
]
}
]
}
And please keep in mind that at least one service and one host must have that tag 'myTag' otherwise the call fails because there is no match.