From 60d78858a066e7a19f1ad5e8cd4bcaf3d7b229fd Mon Sep 17 00:00:00 2001 From: John Bowdre Date: Wed, 29 Jun 2022 13:38:23 -0500 Subject: [PATCH] add deprovision workflow --- .../Workflows/VM Deprovision/README.md | 14 ++++++++ .../Tasks/01_delete_dns_record.js | 32 ++++++++++++++++++ .../Workflows/VM Deprovision/schema.png | Bin 0 -> 14800 bytes 3 files changed, 46 insertions(+) create mode 100644 Orchestrator/Workflows/VM Deprovision/README.md create mode 100644 Orchestrator/Workflows/VM Deprovision/Tasks/01_delete_dns_record.js create mode 100644 Orchestrator/Workflows/VM Deprovision/schema.png diff --git a/Orchestrator/Workflows/VM Deprovision/README.md b/Orchestrator/Workflows/VM Deprovision/README.md new file mode 100644 index 0000000..a7f18db --- /dev/null +++ b/Orchestrator/Workflows/VM Deprovision/README.md @@ -0,0 +1,14 @@ +# VM Deprovision workflow +Performs cleanup tasks upon deployment deletion (currently just removing the static DNS record). + +![Schema](schema.png) + +## Inputs/Outputs +| Name | Type | Direction | Description | +|:--- |:--- |:---|:---| +| `inputProperties` | Properties | Input | full request payload from vRA | + +## Variables +| Name | Type | Value | Description | +|:--- |:--- |:--- |:--- | +| `dnsHost` | CompositeType(sshHost:string, sshUser:string, sshPass:SecureString, dnsServers:Array/string, supportedDomains:Array/string):dnsHost | `Endpoints: dnsHost` | object which stores endpoint and credential details for DNS operations | diff --git a/Orchestrator/Workflows/VM Deprovision/Tasks/01_delete_dns_record.js b/Orchestrator/Workflows/VM Deprovision/Tasks/01_delete_dns_record.js new file mode 100644 index 0000000..35f3103 --- /dev/null +++ b/Orchestrator/Workflows/VM Deprovision/Tasks/01_delete_dns_record.js @@ -0,0 +1,32 @@ +/* JavaScript: delete dns record + Deletes records in Microsoft DNS by way of an SSH bastion host upon deployment deletion. + Inputs: inputProperties (Properties), dnsHost (CompositeType(sshHost:string,sshUser:string,sshPass:SecureString,dnsServers:Array/string,supportedDomains:Array/string):dnsHost) + Outputs: none +*/ +var hostname = inputProperties.resourceNames[0]; +var dnsDomain = inputProperties.customProperties.domain; +var deleted = false; +if (dnsHost_supportedDomains.indexOf(dnsDomain) >= 0) { + System.log("Attempting to remove DNS record for " + hostname + "..."); + var sshSession = new SSHSession(dnsHost_sshHost, dnsHost_sshUser); + System.debug("Connecting to " + dnsHost_sshHost + "..."); + sshSession.connectWithPassword(dnsHost_sshPass); + for each (var dnsServer in dnsHost_dnsServers) { + if (deleted == false) { + System.debug("Using DNS Server " + dnsServer + "..."); + var sshCommand = 'Remove-DnsServerResourceRecord -ComputerName ' + dnsServer + ' -Name ' + hostname + ' -ZoneName ' + dnsDomain + ' -RRType A -Force'; + System.debug("sshCommand: " + sshCommand); + sshSession.executeCommand(sshCommand, true); + if (sshSession.exitCode == 0) { + System.log("Successfully deleted DNS record."); + deleted = true; + } + } + } + sshSession.disconnect(); + if (deleted == false) { + System.warn("Error! Unable to delete DNS record."); + } +} else { + System.log("No need to remove DNS records."); +} \ No newline at end of file diff --git a/Orchestrator/Workflows/VM Deprovision/schema.png b/Orchestrator/Workflows/VM Deprovision/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..daa58b16ef4717d9b90a0efc5f37f276bc9f21b1 GIT binary patch literal 14800 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