From 9f543b8f2d9153a091c32cdf72cef4d22e39674f Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 23 Mar 2020 12:18:01 -0400 Subject: [PATCH] Restructure files --- Functions/Circuits/Circuits.ps1 | 93 - Functions/Circuits/Get-NetboxCircuit.ps1 | 83 + .../Circuits/Get-NetboxCircuitsChoices.ps1 | 38 + Functions/DCIM/DCIM.Devices.ps1 | 428 -- Functions/DCIM/DCIM.Interfaces.ps1 | 495 --- .../DCIM/Devices/Get-NetboxDCIMDevice.ps1 | 99 + .../DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1 | 62 + .../DCIM/Devices/Get-NetboxDCIMDeviceType.ps1 | 61 + .../DCIM/Devices/New-NetboxDCIMDevice.ps1 | 90 + .../DCIM/Devices/Remove-NetboxDCIMDevice.ps1 | 68 + .../DCIM/Devices/Set-NetboxDCIMDevice.ps1 | 95 + Functions/DCIM/Get-NetboxDCIMChoices.ps1 | 25 + .../{DCIM.ps1 => Get-NetboxDCIMPlatform.ps1} | 53 +- .../Interfaces/Add-NetboxDCIMInterface.ps1 | 84 + .../Add-NetboxDCIMInterfaceConnection.ps1 | 67 + .../Interfaces/Get-NetboxDCIMInterface.ps1 | 61 + .../Get-NetboxDCIMInterfaceConnection.ps1 | 46 + .../Interfaces/Remove-NetboxDCIMInterface.ps1 | 68 + .../Remove-NetboxDCIMInterfaceConnection.ps1 | 51 + .../Interfaces/Set-NetboxDCIMInterface.ps1 | 98 + .../Set-NetboxDCIMInterfaceConnection.ps1 | 92 + ...CIM.Support.ps1 => ValidateDCIMChoice.ps1} | 0 Functions/Helpers.ps1 | 2 +- .../IPAM/Address/Get-NetboxIPAMAddress.ps1 | 63 + .../Address/Get-NetboxIPAMAvailableIP.ps1 | 64 + .../IPAM/Address/New-NetboxIPAMAddress.ps1 | 99 + .../IPAM/Address/Remove-NetboxIPAMAddress.ps1 | 65 + .../IPAM/Address/Set-NetboxIPAMAddress.ps1 | 74 + .../Aggregate/Get-NetboxIPAMAggregate.ps1 | 49 + Functions/IPAM/Get-NetboxIPAMChoices.ps1 | 25 + Functions/IPAM/IPAM.ps1 | 597 --- .../IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 | 160 + .../IPAM/Prefix/New-NetboxIPAMPrefix.ps1 | 59 + Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 | 68 + Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 | 73 + Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 | 85 + ...PAM.Support.ps1 => ValidateIPAMChoice.ps1} | 18 +- .../Tenancy/Get-NetboxTenancyChoices.ps1 | 25 + Functions/Tenancy/Get-NetboxTenant.ps1 | 45 + Functions/Tenancy/Tenancy.ps1 | 44 +- .../Get-NetboxVirtualizationChoices.ps1 | 25 + ...t.ps1 => ValidateVirtualizationChoice.ps1} | 15 +- .../Get-NetboxVirtualMachine.ps1 | 155 + .../New-NetboxVirtualMachine.ps1 | 58 + .../Remove-NetboxVirtualMachine.ps1 | 68 + .../Set-NetboxVirtualMachine.ps1 | 72 + .../Add-NetboxVirtualMachineInterface.ps1 | 45 + .../Get-NetboxVirtualMachineInterface.ps1 | 92 + .../Set-NetboxVirtualMachineInterface.ps1 | 65 + Functions/Virtualization/Virtualization.ps1 | 677 --- .../Get-NetboxVirtualizationCluster.ps1 | 125 + .../Get-NetboxVirtualizationClusterGroup.ps1 | 48 + NetboxPS.psd1 | 2 +- NetboxPS.psm1 | 3635 ++++++++++++++++- NetboxPS.psproj | 65 +- dist/NetboxPS.psd1 | 2 +- dist/NetboxPS.psm1 | 3169 +++++++------- dist/Tests/DCIM.Devices.Tests.ps1 | 512 --- dist/Tests/DCIM.Interfaces.Tests.ps1 | 505 --- dist/Tests/DCIM.Platforms.Tests.ps1 | 121 - dist/Tests/DCIM.Tests.ps1 | 315 -- dist/Tests/Helpers.Tests.ps1 | 744 ---- dist/Tests/IPAM.Tests.ps1 | 573 --- dist/Tests/IPAMChoices.json | 1 - dist/Tests/Virtualization.Tests.ps1 | 543 --- dist/Tests/VirtualizationChoices.json | 1 - 66 files changed, 8277 insertions(+), 7228 deletions(-) create mode 100644 Functions/Circuits/Get-NetboxCircuit.ps1 create mode 100644 Functions/Circuits/Get-NetboxCircuitsChoices.ps1 delete mode 100644 Functions/DCIM/DCIM.Devices.ps1 delete mode 100644 Functions/DCIM/DCIM.Interfaces.ps1 create mode 100644 Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1 create mode 100644 Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1 create mode 100644 Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1 create mode 100644 Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 create mode 100644 Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1 create mode 100644 Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 create mode 100644 Functions/DCIM/Get-NetboxDCIMChoices.ps1 rename Functions/DCIM/{DCIM.ps1 => Get-NetboxDCIMPlatform.ps1} (71%) create mode 100644 Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 create mode 100644 Functions/DCIM/Interfaces/Add-NetboxDCIMInterfaceConnection.ps1 create mode 100644 Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1 create mode 100644 Functions/DCIM/Interfaces/Get-NetboxDCIMInterfaceConnection.ps1 create mode 100644 Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1 create mode 100644 Functions/DCIM/Interfaces/Remove-NetboxDCIMInterfaceConnection.ps1 create mode 100644 Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 create mode 100644 Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 rename Functions/DCIM/{DCIM.Support.ps1 => ValidateDCIMChoice.ps1} (100%) create mode 100644 Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 create mode 100644 Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1 create mode 100644 Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 create mode 100644 Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 create mode 100644 Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 create mode 100644 Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 create mode 100644 Functions/IPAM/Get-NetboxIPAMChoices.ps1 delete mode 100644 Functions/IPAM/IPAM.ps1 create mode 100644 Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 create mode 100644 Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 create mode 100644 Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 create mode 100644 Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 create mode 100644 Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 rename Functions/IPAM/{IPAM.Support.ps1 => ValidateIPAMChoice.ps1} (87%) create mode 100644 Functions/Tenancy/Get-NetboxTenancyChoices.ps1 create mode 100644 Functions/Tenancy/Get-NetboxTenant.ps1 create mode 100644 Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 rename Functions/Virtualization/{Virtualization.Support.ps1 => ValidateVirtualizationChoice.ps1} (80%) create mode 100644 Functions/Virtualization/VirtualMachine/Get-NetboxVirtualMachine.ps1 create mode 100644 Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 create mode 100644 Functions/Virtualization/VirtualMachine/Remove-NetboxVirtualMachine.ps1 create mode 100644 Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 create mode 100644 Functions/Virtualization/VirtualMachineInterface/Add-NetboxVirtualMachineInterface.ps1 create mode 100644 Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 create mode 100644 Functions/Virtualization/VirtualMachineInterface/Set-NetboxVirtualMachineInterface.ps1 delete mode 100644 Functions/Virtualization/Virtualization.ps1 create mode 100644 Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 create mode 100644 Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 delete mode 100644 dist/Tests/DCIM.Devices.Tests.ps1 delete mode 100644 dist/Tests/DCIM.Interfaces.Tests.ps1 delete mode 100644 dist/Tests/DCIM.Platforms.Tests.ps1 delete mode 100644 dist/Tests/DCIM.Tests.ps1 delete mode 100644 dist/Tests/Helpers.Tests.ps1 delete mode 100644 dist/Tests/IPAM.Tests.ps1 delete mode 100644 dist/Tests/IPAMChoices.json delete mode 100644 dist/Tests/Virtualization.Tests.ps1 delete mode 100644 dist/Tests/VirtualizationChoices.json diff --git a/Functions/Circuits/Circuits.ps1 b/Functions/Circuits/Circuits.ps1 index 913b99b..967548f 100644 --- a/Functions/Circuits/Circuits.ps1 +++ b/Functions/Circuits/Circuits.ps1 @@ -11,97 +11,4 @@ Circuit object functions #> -function Get-NetboxCircuitsChoices { -<# - .SYNOPSIS - Gets the choices associated with circuits - - .DESCRIPTION - A detailed description of the Get-NetboxCircuitsChoices function. - - .EXAMPLE - PS C:\> Get-NetboxCircuitsChoices - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices')) - $uri = BuildNewURI -Segments $uriSegments - - InvokeNetboxRequest -URI $uri -} -function Get-NetboxCircuit { -<# - .SYNOPSIS - Gets one or more circuits - - .DESCRIPTION - A detailed description of the Get-NetboxCircuit function. - - .PARAMETER CID - Circuit ID - - .PARAMETER InstallDate - Date of installation - - .PARAMETER CommitRate - Committed rate in Kbps - - .PARAMETER Query - A raw search query... As if you were searching the web site - - .PARAMETER Provider - The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs - - .PARAMETER Type - Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs - - .PARAMETER Site - Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs - - .PARAMETER Tenant - Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs - - .PARAMETER Id - Database ID of circuit. This will query for exactly the IDs provided - - .PARAMETER ID__IN - Multiple unique DB IDs to retrieve - - .EXAMPLE - PS C:\> Get-NetboxCircuit - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [string]$CID, - - [datetime]$InstallDate, - - [uint32]$CommitRate, - - [string]$Query, - - [object]$Provider, - - [object]$Type, - - [string]$Site, - - [string]$Tenant, - - [uint16[]]$Id - ) - - #TODO: Place script here -} diff --git a/Functions/Circuits/Get-NetboxCircuit.ps1 b/Functions/Circuits/Get-NetboxCircuit.ps1 new file mode 100644 index 0000000..54c6b21 --- /dev/null +++ b/Functions/Circuits/Get-NetboxCircuit.ps1 @@ -0,0 +1,83 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuit.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxCircuit { +<# + .SYNOPSIS + Gets one or more circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuit function. + + .PARAMETER CID + Circuit ID + + .PARAMETER InstallDate + Date of installation + + .PARAMETER CommitRate + Committed rate in Kbps + + .PARAMETER Query + A raw search query... As if you were searching the web site + + .PARAMETER Provider + The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs + + .PARAMETER Type + Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs + + .PARAMETER Site + Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs + + .PARAMETER Tenant + Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs + + .PARAMETER Id + Database ID of circuit. This will query for exactly the IDs provided + + .PARAMETER ID__IN + Multiple unique DB IDs to retrieve + + .EXAMPLE + PS C:\> Get-NetboxCircuit + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [string]$CID, + + [datetime]$InstallDate, + + [uint32]$CommitRate, + + [string]$Query, + + [object]$Provider, + + [object]$Type, + + [string]$Site, + + [string]$Tenant, + + [uint16[]]$Id + ) + + #TODO: Place script here +} \ No newline at end of file diff --git a/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 b/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 new file mode 100644 index 0000000..67fbbdf --- /dev/null +++ b/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 @@ -0,0 +1,38 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitsChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxCircuitsChoices { +<# + .SYNOPSIS + Gets the choices associated with circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuitsChoices function. + + .EXAMPLE + PS C:\> Get-NetboxCircuitsChoices + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices')) + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri +} diff --git a/Functions/DCIM/DCIM.Devices.ps1 b/Functions/DCIM/DCIM.Devices.ps1 deleted file mode 100644 index a0155b2..0000000 --- a/Functions/DCIM/DCIM.Devices.ps1 +++ /dev/null @@ -1,428 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/25/2018 2:52 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Devices.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - -#region GET commands - -function Get-NetboxDCIMDevice { - [CmdletBinding()] - #region Parameters - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Parameter(ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Query, - - [string]$Name, - - [uint16]$Manufacturer_Id, - - [string]$Manufacturer, - - [uint16]$Device_Type_Id, - - [uint16]$Role_Id, - - [string]$Role, - - [uint16]$Tenant_Id, - - [string]$Tenant, - - [uint16]$Platform_Id, - - [string]$Platform, - - [string]$Asset_Tag, - - [uint16]$Site_Id, - - [string]$Site, - - [uint16]$Rack_Group_Id, - - [uint16]$Rack_Id, - - [uint16]$Cluster_Id, - - [uint16]$Model, - - [object]$Status, - - [bool]$Is_Full_Depth, - - [bool]$Is_Console_Server, - - [bool]$Is_PDU, - - [bool]$Is_Network_Device, - - [string]$MAC_Address, - - [bool]$Has_Primary_IP, - - [uint16]$Virtual_Chassis_Id, - - [uint16]$Position, - - [string]$Serial, - - [switch]$Raw - ) - - #endregion Parameters - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw -} - -function Get-NetboxDCIMDeviceType { - [CmdletBinding()] - #region Parameters - param - ( - [uint16]$Offset, - - [uint16]$Limit, - - [uint16[]]$Id, - - [string]$Query, - - [string]$Slug, - - [string]$Manufacturer, - - [uint16]$Manufacturer_Id, - - [string]$Model, - - [string]$Part_Number, - - [uint16]$U_Height, - - [bool]$Is_Full_Depth, - - [bool]$Is_Console_Server, - - [bool]$Is_PDU, - - [bool]$Is_Network_Device, - - [uint16]$Subdevice_Role, - - [switch]$Raw - ) - #endregion Parameters - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-types')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw -} - -function Get-NetboxDCIMDeviceRole { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Parameter(ParameterSetName = 'ById')] - [uint16[]]$Id, - - [string]$Name, - - [string]$Slug, - - [string]$Color, - - [bool]$VM_Role, - - [switch]$Raw - ) - - switch ($PSCmdlet.ParameterSetName) { - 'ById' { - foreach ($DRId in $Id) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles', $DRId)) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw - } - - break - } - - default { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw - } - } -} - -#endregion GET commands - - -#region NEW commands - -function New-NetboxDCIMDevice { - [CmdletBinding()] - [OutputType([pscustomobject])] - #region Parameters - param - ( - [Parameter(Mandatory = $true)] - [string]$Name, - - [Parameter(Mandatory = $true)] - [object]$Device_Role, - - [Parameter(Mandatory = $true)] - [object]$Device_Type, - - [Parameter(Mandatory = $true)] - [uint16]$Site, - - [object]$Status = 'Active', - - [uint16]$Platform, - - [uint16]$Tenant, - - [uint16]$Cluster, - - [uint16]$Rack, - - [uint16]$Position, - - [object]$Face, - - [string]$Serial, - - [string]$Asset_Tag, - - [uint16]$Virtual_Chassis, - - [uint16]$VC_Priority, - - [uint16]$VC_Position, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [string]$Comments, - - [hashtable]$Custom_Fields - ) - #endregion Parameters - - if ($null -ne $Device_Role) { - # Validate device role? - } - - if ($null -ne $Device_Type) { - # Validate device type? - } - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus - } - - if ($null -ne $Face) { - $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace - } - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST -} - -#endregion NEW commands - - -#region SET commands - -function Set-NetboxDCIMDevice { - [CmdletBinding(SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Name, - - [object]$Device_Role, - - [object]$Device_Type, - - [uint16]$Site, - - [object]$Status, - - [uint16]$Platform, - - [uint16]$Tenant, - - [uint16]$Cluster, - - [uint16]$Rack, - - [uint16]$Position, - - [object]$Face, - - [string]$Serial, - - [string]$Asset_Tag, - - [uint16]$Virtual_Chassis, - - [uint16]$VC_Priority, - - [uint16]$VC_Position, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [string]$Comments, - - [hashtable]$Custom_Fields, - - [switch]$Force - ) - - begin { - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus - } - - if ($null -ne $Face) { - $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace - } - } - - process { - foreach ($DeviceID in $Id) { - $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("$($CurrentDevice.Name)", "Set")) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end { - - } -} - -#endregion SET commands - - -#region REMOVE commands - -function Remove-NetboxDCIMDevice { -<# - .SYNOPSIS - Delete a device - - .DESCRIPTION - Deletes a device from Netbox by ID - - .PARAMETER Id - Database ID of the device - - .PARAMETER Force - Force deletion without any prompts - - .EXAMPLE - PS C:\> Remove-NetboxDCIMDevice -Id $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($DeviceID in $Id) { - $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentDevice.Name) | ID: $($CurrentDevice.Id)", "Remove")) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) - - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - - } -} - -#endregion REMOVE commands \ No newline at end of file diff --git a/Functions/DCIM/DCIM.Interfaces.ps1 b/Functions/DCIM/DCIM.Interfaces.ps1 deleted file mode 100644 index 65bf7e6..0000000 --- a/Functions/DCIM/DCIM.Interfaces.ps1 +++ /dev/null @@ -1,495 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/25/2018 2:57 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Interfaces.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - -#region GET Commands - -function Get-NetboxDCIMInterface { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Parameter(ValueFromPipelineByPropertyName = $true)] - [uint16]$Id, - - [uint16]$Name, - - [object]$Form_Factor, - - [bool]$Enabled, - - [uint16]$MTU, - - [bool]$MGMT_Only, - - [string]$Device, - - [uint16]$Device_Id, - - [uint16]$Type, - - [uint16]$LAG_Id, - - [string]$MAC_Address, - - [switch]$Raw - ) - - if ($null -ne $Form_Factor) { - $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor - } - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw -} - -function Get-NetboxDCIMInterfaceConnection { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [uint16]$Id, - - [object]$Connection_Status, - - [uint16]$Site, - - [uint16]$Device, - - [switch]$Raw - ) - - if ($null -ne $Connection_Status) { - $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw -} - -#endregion GET Commands - - -#region ADD/NEW commands - -function Add-NetboxDCIMInterface { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [uint16]$Device, - - [Parameter(Mandatory = $true)] - [string]$Name, - - [bool]$Enabled, - - [object]$Form_Factor, - - [uint16]$MTU, - - [string]$MAC_Address, - - [bool]$MGMT_Only, - - [uint16]$LAG, - - [string]$Description, - - [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] - [string]$Mode, - - [ValidateRange(1, 4094)] - [uint16]$Untagged_VLAN, - - [ValidateRange(1, 4094)] - [uint16[]]$Tagged_VLANs - ) - - if ($null -ne $Form_Factor) { - $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor - } - - if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { - $PSBoundParameters.Mode = switch ($Mode) { - 'Access' { - 100 - break - } - - 'Tagged' { - 200 - break - } - - 'Tagged All' { - 300 - break - } - - default { - $_ - } - } - } - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST -} - -function Add-NetboxDCIMInterfaceConnection { -<# - .SYNOPSIS - Create a new connection between two interfaces - - .DESCRIPTION - Create a new connection between two interfaces - - .PARAMETER Connection_Status - Is it connected or planned? - - .PARAMETER Interface_A - Database ID of interface A - - .PARAMETER Interface_B - Database ID of interface B - - .EXAMPLE - PS C:\> Add-NetboxDCIMInterfaceConnection -Interface_A $value1 -Interface_B $value2 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [object]$Connection_Status, - - [Parameter(Mandatory = $true)] - [uint16]$Interface_A, - - [Parameter(Mandatory = $true)] - [uint16]$Interface_B - ) - - if ($null -ne $Connection_Status) { - $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus - } - - # Verify if both Interfaces exist - $I_A = Get-NetboxDCIMInterface -Id $Interface_A -ErrorAction Stop - $I_B = Get-NetboxDCIMInterface -Id $Interface_B -ErrorAction Stop - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST -} - -#endregion ADD/NEW commands - - -#region SET Commands - -function Set-NetboxDCIMInterface { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [uint16]$Device, - - [string]$Name, - - [bool]$Enabled, - - [object]$Form_Factor, - - [uint16]$MTU, - - [string]$MAC_Address, - - [bool]$MGMT_Only, - - [uint16]$LAG, - - [string]$Description, - - [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] - [string]$Mode, - - [ValidateRange(1, 4094)] - [uint16]$Untagged_VLAN, - - [ValidateRange(1, 4094)] - [uint16[]]$Tagged_VLANs - ) - - begin { - if ($null -ne $Form_Factor) { - $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor - } - - if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { - $PSBoundParameters.Mode = switch ($Mode) { - 'Access' { - 100 - break - } - - 'Tagged' { - 200 - break - } - - 'Tagged All' { - 300 - break - } - - default { - $_ - } - } - } - } - - process { - foreach ($InterfaceId in $Id) { - $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' - - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - - end { - - } -} - -function Set-NetboxDCIMInterfaceConnection { -<# - .SYNOPSIS - Update an interface connection - - .DESCRIPTION - Update an interface connection - - .PARAMETER Id - A description of the Id parameter. - - .PARAMETER Connection_Status - A description of the Connection_Status parameter. - - .PARAMETER Interface_A - A description of the Interface_A parameter. - - .PARAMETER Interface_B - A description of the Interface_B parameter. - - .PARAMETER Force - A description of the Force parameter. - - .EXAMPLE - PS C:\> Set-NetboxDCIMInterfaceConnection -Id $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [object]$Connection_Status, - - [uint16]$Interface_A, - - [uint16]$Interface_B, - - [switch]$Force - ) - - begin { - if ($null -ne $Connection_Status) { - $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus - } - - if ((@($ID).Count -gt 1) -and ($Interface_A -or $Interface_B)) { - throw "Cannot set multiple connections to the same interface" - } - } - - process { - foreach ($ConnectionID in $Id) { - $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop - - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) - - if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($CurrentConnection.Id)", "Set")) { - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end { - - } -} - -#endregion SET Commands - - -#region REMOVE commands - -function Remove-NetboxDCIMInterface { -<# - .SYNOPSIS - Removes an interface - - .DESCRIPTION - Removes an interface by ID from a device - - .PARAMETER Id - A description of the Id parameter. - - .PARAMETER Force - A description of the Force parameter. - - .EXAMPLE - PS C:\> Remove-NetboxDCIMInterface -Id $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($InterfaceId in $Id) { - $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentInterface.Name) | ID: $($CurrentInterface.Id)", "Remove")) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) - - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - - } -} - -function Remove-NetboxDCIMInterfaceConnection { - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - [OutputType([void])] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($ConnectionID in $Id) { - $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($ConnectionID.Id)", "REMOVE")) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - - } -} - -#endregion REMOVE commands - diff --git a/Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1 new file mode 100644 index 0000000..a14c1cc --- /dev/null +++ b/Functions/DCIM/Devices/Get-NetboxDCIMDevice.ps1 @@ -0,0 +1,99 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:06 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMDevice { + [CmdletBinding()] + #region Parameters + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [uint16]$Manufacturer_Id, + + [string]$Manufacturer, + + [uint16]$Device_Type_Id, + + [uint16]$Role_Id, + + [string]$Role, + + [uint16]$Tenant_Id, + + [string]$Tenant, + + [uint16]$Platform_Id, + + [string]$Platform, + + [string]$Asset_Tag, + + [uint16]$Site_Id, + + [string]$Site, + + [uint16]$Rack_Group_Id, + + [uint16]$Rack_Id, + + [uint16]$Cluster_Id, + + [uint16]$Model, + + [object]$Status, + + [bool]$Is_Full_Depth, + + [bool]$Is_Console_Server, + + [bool]$Is_PDU, + + [bool]$Is_Network_Device, + + [string]$MAC_Address, + + [bool]$Has_Primary_IP, + + [uint16]$Virtual_Chassis_Id, + + [uint16]$Position, + + [string]$Serial, + + [switch]$Raw + ) + + #endregion Parameters + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1 b/Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1 new file mode 100644 index 0000000..3ca2974 --- /dev/null +++ b/Functions/DCIM/Devices/Get-NetboxDCIMDeviceRole.ps1 @@ -0,0 +1,62 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceRole.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMDeviceRole { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [string]$Name, + + [string]$Slug, + + [string]$Color, + + [bool]$VM_Role, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($DRId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles', $DRId)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} \ No newline at end of file diff --git a/Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1 b/Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1 new file mode 100644 index 0000000..ffba0e2 --- /dev/null +++ b/Functions/DCIM/Devices/Get-NetboxDCIMDeviceType.ps1 @@ -0,0 +1,61 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceType.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMDeviceType { + [CmdletBinding()] + #region Parameters + param + ( + [uint16]$Offset, + + [uint16]$Limit, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Slug, + + [string]$Manufacturer, + + [uint16]$Manufacturer_Id, + + [string]$Model, + + [string]$Part_Number, + + [uint16]$U_Height, + + [bool]$Is_Full_Depth, + + [bool]$Is_Console_Server, + + [bool]$Is_PDU, + + [bool]$Is_Network_Device, + + [uint16]$Subdevice_Role, + + [switch]$Raw + ) + #endregion Parameters + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-types')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 new file mode 100644 index 0000000..f209a93 --- /dev/null +++ b/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 @@ -0,0 +1,90 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function New-NetboxDCIMDevice { + [CmdletBinding()] + [OutputType([pscustomobject])] + #region Parameters + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [object]$Device_Role, + + [Parameter(Mandatory = $true)] + [object]$Device_Type, + + [Parameter(Mandatory = $true)] + [uint16]$Site, + + [object]$Status = 'Active', + + [uint16]$Platform, + + [uint16]$Tenant, + + [uint16]$Cluster, + + [uint16]$Rack, + + [uint16]$Position, + + [object]$Face, + + [string]$Serial, + + [string]$Asset_Tag, + + [uint16]$Virtual_Chassis, + + [uint16]$VC_Priority, + + [uint16]$VC_Position, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [string]$Comments, + + [hashtable]$Custom_Fields + ) + #endregion Parameters + + if ($null -ne $Device_Role) { + # Validate device role? + } + + if ($null -ne $Device_Type) { + # Validate device type? + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + if ($null -ne $Face) { + $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST +} \ No newline at end of file diff --git a/Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1 new file mode 100644 index 0000000..e654b9e --- /dev/null +++ b/Functions/DCIM/Devices/Remove-NetboxDCIMDevice.ps1 @@ -0,0 +1,68 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Remove-NetboxDCIMDevice { +<# + .SYNOPSIS + Delete a device + + .DESCRIPTION + Deletes a device from Netbox by ID + + .PARAMETER Id + Database ID of the device + + .PARAMETER Force + Force deletion without any prompts + + .EXAMPLE + PS C:\> Remove-NetboxDCIMDevice -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($DeviceID in $Id) { + $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentDevice.Name) | ID: $($CurrentDevice.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 new file mode 100644 index 0000000..e15ce9f --- /dev/null +++ b/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 @@ -0,0 +1,95 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxDCIMDevice { + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Name, + + [object]$Device_Role, + + [object]$Device_Type, + + [uint16]$Site, + + [object]$Status, + + [uint16]$Platform, + + [uint16]$Tenant, + + [uint16]$Cluster, + + [uint16]$Rack, + + [uint16]$Position, + + [object]$Face, + + [string]$Serial, + + [string]$Asset_Tag, + + [uint16]$Virtual_Chassis, + + [uint16]$VC_Priority, + + [uint16]$VC_Position, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force + ) + + begin { + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + if ($null -ne $Face) { + $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace + } + } + + process { + foreach ($DeviceID in $Id) { + $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("$($CurrentDevice.Name)", "Set")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } +} diff --git a/Functions/DCIM/Get-NetboxDCIMChoices.ps1 b/Functions/DCIM/Get-NetboxDCIMChoices.ps1 new file mode 100644 index 0000000..55104dd --- /dev/null +++ b/Functions/DCIM/Get-NetboxDCIMChoices.ps1 @@ -0,0 +1,25 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('dcim', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri +} \ No newline at end of file diff --git a/Functions/DCIM/DCIM.ps1 b/Functions/DCIM/Get-NetboxDCIMPlatform.ps1 similarity index 71% rename from Functions/DCIM/DCIM.ps1 rename to Functions/DCIM/Get-NetboxDCIMPlatform.ps1 index 138be0a..4ae982f 100644 --- a/Functions/DCIM/DCIM.ps1 +++ b/Functions/DCIM/Get-NetboxDCIMPlatform.ps1 @@ -1,30 +1,16 @@ <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/22/2018 4:47 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen Organization: NEOnet - Filename: DCIM.ps1 + Filename: Get-NetboxDCIMPlatform.ps1 =========================================================================== .DESCRIPTION A description of the file. #> -function Get-NetboxDCIMChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('dcim', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters - - InvokeNetboxRequest -URI $uri -} - - -#region GET commands function Get-NetboxDCIMPlatform { [CmdletBinding()] @@ -74,33 +60,4 @@ function Get-NetboxDCIMPlatform { InvokeNetboxRequest -URI $URI -Raw:$Raw } } -} - -#endregion GET commands - - - -#region NEW/ADD commands - -#endregion NEW/ADD commands - - - -#region SET commands - -#endregion SET commands - - - -#region REMOVE commands - -#endregion REMOVE commands - - - - - - - - - +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 new file mode 100644 index 0000000..a19da07 --- /dev/null +++ b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 @@ -0,0 +1,84 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Add-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$Device, + + [Parameter(Mandatory = $true)] + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Add-NetboxDCIMInterfaceConnection.ps1 b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterfaceConnection.ps1 new file mode 100644 index 0000000..f98c2e3 --- /dev/null +++ b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterfaceConnection.ps1 @@ -0,0 +1,67 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Add-NetboxDCIMInterfaceConnection { +<# + .SYNOPSIS + Create a new connection between two interfaces + + .DESCRIPTION + Create a new connection between two interfaces + + .PARAMETER Connection_Status + Is it connected or planned? + + .PARAMETER Interface_A + Database ID of interface A + + .PARAMETER Interface_B + Database ID of interface B + + .EXAMPLE + PS C:\> Add-NetboxDCIMInterfaceConnection -Interface_A $value1 -Interface_B $value2 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [object]$Connection_Status, + + [Parameter(Mandatory = $true)] + [uint16]$Interface_A, + + [Parameter(Mandatory = $true)] + [uint16]$Interface_B + ) + + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + # Verify if both Interfaces exist + $I_A = Get-NetboxDCIMInterface -Id $Interface_A -ErrorAction Stop + $I_B = Get-NetboxDCIMInterface -Id $Interface_B -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1 new file mode 100644 index 0000000..671f013 --- /dev/null +++ b/Functions/DCIM/Interfaces/Get-NetboxDCIMInterface.ps1 @@ -0,0 +1,61 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:09 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [uint16]$Name, + + [object]$Form_Factor, + + [bool]$Enabled, + + [uint16]$MTU, + + [bool]$MGMT_Only, + + [string]$Device, + + [uint16]$Device_Id, + + [uint16]$Type, + + [uint16]$LAG_Id, + + [string]$MAC_Address, + + [switch]$Raw + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Get-NetboxDCIMInterfaceConnection.ps1 b/Functions/DCIM/Interfaces/Get-NetboxDCIMInterfaceConnection.ps1 new file mode 100644 index 0000000..f3fe97d --- /dev/null +++ b/Functions/DCIM/Interfaces/Get-NetboxDCIMInterfaceConnection.ps1 @@ -0,0 +1,46 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxDCIMInterfaceConnection { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$Id, + + [object]$Connection_Status, + + [uint16]$Site, + + [uint16]$Device, + + [switch]$Raw + ) + + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1 new file mode 100644 index 0000000..1996a1c --- /dev/null +++ b/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterface.ps1 @@ -0,0 +1,68 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Remove-NetboxDCIMInterface { +<# + .SYNOPSIS + Removes an interface + + .DESCRIPTION + Removes an interface by ID from a device + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Force + A description of the Force parameter. + + .EXAMPLE + PS C:\> Remove-NetboxDCIMInterface -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentInterface.Name) | ID: $($CurrentInterface.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterfaceConnection.ps1 b/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterfaceConnection.ps1 new file mode 100644 index 0000000..52e13dc --- /dev/null +++ b/Functions/DCIM/Interfaces/Remove-NetboxDCIMInterfaceConnection.ps1 @@ -0,0 +1,51 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:12 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Remove-NetboxDCIMInterfaceConnection { + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + [OutputType([void])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($ConnectionID in $Id) { + $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($ConnectionID.Id)", "REMOVE")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 new file mode 100644 index 0000000..fbfb552 --- /dev/null +++ b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 @@ -0,0 +1,98 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [uint16]$Device, + + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + begin { + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 new file mode 100644 index 0000000..2e2496f --- /dev/null +++ b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 @@ -0,0 +1,92 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxDCIMInterfaceConnection { +<# + .SYNOPSIS + Update an interface connection + + .DESCRIPTION + Update an interface connection + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Connection_Status + A description of the Connection_Status parameter. + + .PARAMETER Interface_A + A description of the Interface_A parameter. + + .PARAMETER Interface_B + A description of the Interface_B parameter. + + .PARAMETER Force + A description of the Force parameter. + + .EXAMPLE + PS C:\> Set-NetboxDCIMInterfaceConnection -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [object]$Connection_Status, + + [uint16]$Interface_A, + + [uint16]$Interface_B, + + [switch]$Force + ) + + begin { + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + if ((@($ID).Count -gt 1) -and ($Interface_A -or $Interface_B)) { + throw "Cannot set multiple connections to the same interface" + } + } + + process { + foreach ($ConnectionID in $Id) { + $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) + + if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($CurrentConnection.Id)", "Set")) { + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/DCIM/DCIM.Support.ps1 b/Functions/DCIM/ValidateDCIMChoice.ps1 similarity index 100% rename from Functions/DCIM/DCIM.Support.ps1 rename to Functions/DCIM/ValidateDCIMChoice.ps1 diff --git a/Functions/Helpers.ps1 b/Functions/Helpers.ps1 index 296e78b..35d53e1 100644 --- a/Functions/Helpers.ps1 +++ b/Functions/Helpers.ps1 @@ -233,7 +233,7 @@ function GetChoiceValidValues { function ValidateChoice { [CmdletBinding()] - [OutputType([uint16],[string], [bool])] + [OutputType([uint16], [string], [bool])] param ( [Parameter(Mandatory = $true)] diff --git a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 new file mode 100644 index 0000000..4c41387 --- /dev/null +++ b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 @@ -0,0 +1,63 @@ +function Get-NetboxIPAMAddress { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$Parent, + + [byte]$Mask_Length, + + [string]$VRF, + + [uint16]$VRF_Id, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$Device, + + [uint16]$Device_ID, + + [string]$Virtual_Machine, + + [uint16]$Virtual_Machine_Id, + + [uint16]$Interface_Id, + + [object]$Status, + + [object]$Role, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1 b/Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1 new file mode 100644 index 0000000..d152cb2 --- /dev/null +++ b/Functions/IPAM/Address/Get-NetboxIPAMAvailableIP.ps1 @@ -0,0 +1,64 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:50 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMAvailableIP.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxIPAMAvailableIP { +<# + .SYNOPSIS + A convenience method for returning available IP addresses within a prefix + + .DESCRIPTION + By default, the number of IPs returned will be equivalent to PAGINATE_COUNT. An arbitrary limit + (up to MAX_PAGE_SIZE, if set) may be passed, however results will not be paginated + + .PARAMETER Prefix_ID + A description of the Prefix_ID parameter. + + .PARAMETER Limit + A description of the Limit parameter. + + .PARAMETER Raw + A description of the Raw parameter. + + .PARAMETER NumberOfIPs + A description of the NumberOfIPs parameter. + + .EXAMPLE + PS C:\> Get-NetboxIPAMAvaiableIP -Prefix_ID $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [Alias('Id')] + [uint16]$Prefix_ID, + + [Alias('NumberOfIPs')] + [uint16]$Limit, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID, 'available-ips')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'prefix_id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 new file mode 100644 index 0000000..0ee365a --- /dev/null +++ b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 @@ -0,0 +1,99 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:51 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function New-NetboxIPAMAddress { +<# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Address, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 new file mode 100644 index 0000000..da80014 --- /dev/null +++ b/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 @@ -0,0 +1,65 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + +function Remove-NetboxIPAMAddress { +<# + .SYNOPSIS + Remove an IP address from Netbox + + .DESCRIPTION + Removes/deletes an IP address from Netbox by ID and optional other filters + + .PARAMETER Id + Database ID of the IP address object. + + .PARAMETER Force + Do not confirm. + + .EXAMPLE + PS C:\> Remove-NetboxIPAMAddress -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + } + + process { + foreach ($IPId in $Id) { + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) { + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + } +} \ No newline at end of file diff --git a/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 new file mode 100644 index 0000000..de2d07e --- /dev/null +++ b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 @@ -0,0 +1,74 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:53 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxIPAMAddress { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Address, + + [object]$Status, + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Force + ) + + begin { + if ($Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + } + + process { + foreach ($IPId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + Write-Verbose "Obtaining IPs from ID $IPId" + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + } +} \ No newline at end of file diff --git a/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 b/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 new file mode 100644 index 0000000..03e5255 --- /dev/null +++ b/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 @@ -0,0 +1,49 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:49 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMAggregate.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxIPAMAggregate { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [datetime]$Date_Added, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$RIR_Id, + + [string]$RIR, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Get-NetboxIPAMChoices.ps1 b/Functions/IPAM/Get-NetboxIPAMChoices.ps1 new file mode 100644 index 0000000..13d1c99 --- /dev/null +++ b/Functions/IPAM/Get-NetboxIPAMChoices.ps1 @@ -0,0 +1,25 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:54 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxIPAMChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri +} \ No newline at end of file diff --git a/Functions/IPAM/IPAM.ps1 b/Functions/IPAM/IPAM.ps1 deleted file mode 100644 index 3066391..0000000 --- a/Functions/IPAM/IPAM.ps1 +++ /dev/null @@ -1,597 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/10/2018 3:41 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: IPAM.ps1 - =========================================================================== - .DESCRIPTION - IPAM Object functions -#> - -function Get-NetboxIPAMChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters - - InvokeNetboxRequest -URI $uri -} - -#region GET commands - -function Get-NetboxIPAMAggregate { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [datetime]$Date_Added, - - [uint16[]]$Id, - - [string]$Query, - - [uint16]$RIR_Id, - - [string]$RIR, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxIPAMAddress { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [uint16[]]$Id, - - [string]$Query, - - [uint16]$Parent, - - [byte]$Mask_Length, - - [string]$VRF, - - [uint16]$VRF_Id, - - [string]$Tenant, - - [uint16]$Tenant_Id, - - [string]$Device, - - [uint16]$Device_ID, - - [string]$Virtual_Machine, - - [uint16]$Virtual_Machine_Id, - - [uint16]$Interface_Id, - - [object]$Status, - - [object]$Role, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily - } - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - } - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxIPAMAvailableIP { -<# - .SYNOPSIS - A convenience method for returning available IP addresses within a prefix - - .DESCRIPTION - By default, the number of IPs returned will be equivalent to PAGINATE_COUNT. An arbitrary limit - (up to MAX_PAGE_SIZE, if set) may be passed, however results will not be paginated - - .PARAMETER Prefix_ID - A description of the Prefix_ID parameter. - - .PARAMETER Limit - A description of the Limit parameter. - - .PARAMETER Raw - A description of the Raw parameter. - - .PARAMETER NumberOfIPs - A description of the NumberOfIPs parameter. - - .EXAMPLE - PS C:\> Get-NetboxIPAMAvaiableIP -Prefix_ID $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [Alias('Id')] - [uint16]$Prefix_ID, - - [Alias('NumberOfIPs')] - [uint16]$Limit, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID, 'available-ips')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'prefix_id' - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxIPAMPrefix { -<# - .SYNOPSIS - A brief description of the Get-NetboxIPAMPrefix function. - - .DESCRIPTION - A detailed description of the Get-NetboxIPAMPrefix function. - - .PARAMETER Limit - A description of the Limit parameter. - - .PARAMETER Offset - A description of the Offset parameter. - - .PARAMETER Family - A description of the Family parameter. - - .PARAMETER Is_Pool - A description of the Is_Pool parameter. - - .PARAMETER Id - A description of the Id parameter. - - .PARAMETER Query - A description of the Query parameter. - - .PARAMETER Within - Should be a CIDR notation prefix such as '10.0.0.0/16' - - .PARAMETER Within_Include - Should be a CIDR notation prefix such as '10.0.0.0/16' - - .PARAMETER Contains - A description of the Contains parameter. - - .PARAMETER Mask_Length - CIDR mask length value - - .PARAMETER VRF - A description of the VRF parameter. - - .PARAMETER VRF_Id - A description of the VRF_Id parameter. - - .PARAMETER Tenant - A description of the Tenant parameter. - - .PARAMETER Tenant_Id - A description of the Tenant_Id parameter. - - .PARAMETER Site - A description of the Site parameter. - - .PARAMETER Site_Id - A description of the Site_Id parameter. - - .PARAMETER Vlan_VId - A description of the Vlan_VId parameter. - - .PARAMETER Vlan_Id - A description of the Vlan_Id parameter. - - .PARAMETER Status - A description of the Status parameter. - - .PARAMETER Role - A description of the Role parameter. - - .PARAMETER Role_Id - A description of the Role_Id parameter. - - .PARAMETER Raw - A description of the Raw parameter. - - .EXAMPLE - PS C:\> Get-NetboxIPAMPrefix - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [boolean]$Is_Pool, - - [uint16[]]$Id, - - [string]$Query, - - [string]$Within, - - [string]$Within_Include, - - [string]$Contains, - - [ValidateRange(0, 127)] - [byte]$Mask_Length, - - [string]$VRF, - - [uint16]$VRF_Id, - - [string]$Tenant, - - [uint16]$Tenant_Id, - - [string]$Site, - - [uint16]$Site_Id, - - [string]$Vlan_VId, - - [uint16]$Vlan_Id, - - [object]$Status, - - [string]$Role, - - [uint16]$Role_Id, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily - } - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -#endregion GET commands - - -#region NEW commands - -function New-NetboxIPAMAddress { -<# - .SYNOPSIS - Create a new IP address to Netbox - - .DESCRIPTION - Create a new IP address to Netbox with a status of Active by default. - - .PARAMETER Address - IP address in CIDR notation: 192.168.1.1/24 - - .PARAMETER Status - Status of the IP. Defaults to Active - - .PARAMETER Tenant - Tenant ID - - .PARAMETER VRF - VRF ID - - .PARAMETER Role - Role such as anycast, loopback, etc... Defaults to nothing - - .PARAMETER NAT_Inside - ID of IP for NAT - - .PARAMETER Custom_Fields - Custom field hash table. Will be validated by the API service - - .PARAMETER Interface - ID of interface to apply IP - - .PARAMETER Description - Description of IP address - - .PARAMETER Raw - Return raw results from API service - - .EXAMPLE - PS C:\> Create-NetboxIPAMAddress - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [string]$Address, - - [object]$Status = 'Active', - - [uint16]$Tenant, - - [uint16]$VRF, - - [object]$Role, - - [uint16]$NAT_Inside, - - [hashtable]$Custom_Fields, - - [uint16]$Interface, - - [string]$Description, - - [switch]$Raw - ) - - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw -} - -function New-NetboxIPAMPrefix { - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [string]$Prefix, - - [object]$Status = 'Active', - - [uint16]$Tenant, - - [object]$Role, - - [bool]$IsPool, - - [string]$Description, - - [uint16]$Site, - - [uint16]$VRF, - - [uint16]$VLAN, - - [hashtable]$Custom_Fields, - - [switch]$Raw - ) - - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus - - <# - # As of 2018/10/18, this does not appear to be a validated IPAM choice - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole - } - #> - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw -} - - -#endregion ADD commands - - -#region REMOVE commands - -function Remove-NetboxIPAMAddress { -<# - .SYNOPSIS - Remove an IP address from Netbox - - .DESCRIPTION - Removes/deletes an IP address from Netbox by ID and optional other filters - - .PARAMETER Id - Database ID of the IP address object. - - .PARAMETER Force - Do not confirm. - - .EXAMPLE - PS C:\> Remove-NetboxIPAMAddress -Id $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - } - - process { - foreach ($IPId in $Id) { - $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - - if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) { - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - } -} - -#endregion REMOVE commands - - -#region SET commands - -function Set-NetboxIPAMAddress { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Address, - - [object]$Status, - - [uint16]$Tenant, - - [uint16]$VRF, - - [object]$Role, - - [uint16]$NAT_Inside, - - [hashtable]$Custom_Fields, - - [uint16]$Interface, - - [string]$Description, - - [switch]$Force - ) - - begin { - if ($Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - } - - if ($Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - } - - process{ - foreach ($IPId in $Id) { - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - - Write-Verbose "Obtaining IPs from ID $IPId" - $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop - - if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end{ - } -} - -#endregion SET commands - - - - - - - - - diff --git a/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 new file mode 100644 index 0000000..993e438 --- /dev/null +++ b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 @@ -0,0 +1,160 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:51 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxIPAMPrefix { +<# + .SYNOPSIS + A brief description of the Get-NetboxIPAMPrefix function. + + .DESCRIPTION + A detailed description of the Get-NetboxIPAMPrefix function. + + .PARAMETER Limit + A description of the Limit parameter. + + .PARAMETER Offset + A description of the Offset parameter. + + .PARAMETER Family + A description of the Family parameter. + + .PARAMETER Is_Pool + A description of the Is_Pool parameter. + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Query + A description of the Query parameter. + + .PARAMETER Within + Should be a CIDR notation prefix such as '10.0.0.0/16' + + .PARAMETER Within_Include + Should be a CIDR notation prefix such as '10.0.0.0/16' + + .PARAMETER Contains + A description of the Contains parameter. + + .PARAMETER Mask_Length + CIDR mask length value + + .PARAMETER VRF + A description of the VRF parameter. + + .PARAMETER VRF_Id + A description of the VRF_Id parameter. + + .PARAMETER Tenant + A description of the Tenant parameter. + + .PARAMETER Tenant_Id + A description of the Tenant_Id parameter. + + .PARAMETER Site + A description of the Site parameter. + + .PARAMETER Site_Id + A description of the Site_Id parameter. + + .PARAMETER Vlan_VId + A description of the Vlan_VId parameter. + + .PARAMETER Vlan_Id + A description of the Vlan_Id parameter. + + .PARAMETER Status + A description of the Status parameter. + + .PARAMETER Role + A description of the Role parameter. + + .PARAMETER Role_Id + A description of the Role_Id parameter. + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxIPAMPrefix + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [boolean]$Is_Pool, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Within, + + [string]$Within_Include, + + [string]$Contains, + + [ValidateRange(0, 127)] + [byte]$Mask_Length, + + [string]$VRF, + + [uint16]$VRF_Id, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Vlan_VId, + + [uint16]$Vlan_Id, + + [object]$Status, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 new file mode 100644 index 0000000..a085eab --- /dev/null +++ b/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 @@ -0,0 +1,59 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function New-NetboxIPAMPrefix { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Prefix, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [object]$Role, + + [bool]$IsPool, + + [string]$Description, + + [uint16]$Site, + + [uint16]$VRF, + + [uint16]$VLAN, + + [hashtable]$Custom_Fields, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + + <# + # As of 2018/10/18, this does not appear to be a validated IPAM choice + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole + } + #> + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 new file mode 100644 index 0000000..03cbb64 --- /dev/null +++ b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 @@ -0,0 +1,68 @@ + +function Get-NetboxIPAMRole { +<# + .SYNOPSIS + Get IPAM Prefix/VLAN roles + + .DESCRIPTION + A role indicates the function of a prefix or VLAN. For example, you might define Data, Voice, and Security roles. Generally, a prefix will be assigned the same functional role as the VLAN to which it is assigned (if any). + + .PARAMETER Id + Unique ID + + .PARAMETER Query + Search query + + .PARAMETER Name + Role name + + .PARAMETER Slug + Role URL slug + + .PARAMETER Brief + Brief format + + .PARAMETER Limit + Result limit + + .PARAMETER Offset + Result offset + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxIPAMRole + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Slug, + + [switch]$Brief, + + [uint16]$Limit, + + [uint16]$Offset, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 new file mode 100644 index 0000000..025c028 --- /dev/null +++ b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 @@ -0,0 +1,73 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/16/2020 16:34 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMVLAN.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxIPAMVLAN { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$VID, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$TenantGroup, + + [uint16]$TenantGroup_Id, + + [object]$Status, + + [string]$Region, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} + + + + diff --git a/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 b/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 new file mode 100644 index 0000000..4ed2883 --- /dev/null +++ b/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 @@ -0,0 +1,85 @@ +function New-NetboxIPAMAddress { +<# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$VID, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/IPAM/IPAM.Support.ps1 b/Functions/IPAM/ValidateIPAMChoice.ps1 similarity index 87% rename from Functions/IPAM/IPAM.Support.ps1 rename to Functions/IPAM/ValidateIPAMChoice.ps1 index 9d00acf..6b46427 100644 --- a/Functions/IPAM/IPAM.Support.ps1 +++ b/Functions/IPAM/ValidateIPAMChoice.ps1 @@ -1,4 +1,18 @@ -function ValidateIPAMChoice { +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:54 + Created by: Claussen + Organization: NEOnet + Filename: ValidateIPAMChoice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function ValidateIPAMChoice { <# .SYNOPSIS Internal function to verify provided values for static choices @@ -92,4 +106,4 @@ ) ValidateChoice -MajorObject 'IPAM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue -} +} \ No newline at end of file diff --git a/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 b/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 new file mode 100644 index 0000000..1017a91 --- /dev/null +++ b/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 @@ -0,0 +1,25 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenancyChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxTenancyChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('tenancy', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri +} \ No newline at end of file diff --git a/Functions/Tenancy/Get-NetboxTenant.ps1 b/Functions/Tenancy/Get-NetboxTenant.ps1 new file mode 100644 index 0000000..4686223 --- /dev/null +++ b/Functions/Tenancy/Get-NetboxTenant.ps1 @@ -0,0 +1,45 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenant.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxTenant { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [string]$Name, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Group, + + [uint16]$GroupID, + + [hashtable]$CustomFields, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/Tenancy/Tenancy.ps1 b/Functions/Tenancy/Tenancy.ps1 index 6964cb2..1c8de41 100644 --- a/Functions/Tenancy/Tenancy.ps1 +++ b/Functions/Tenancy/Tenancy.ps1 @@ -11,52 +11,12 @@ A description of the file. #> -function Get-NetboxTenancyChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('tenancy', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments - - InvokeNetboxRequest -URI $uri -} + #region GET commands -function Get-NetboxTenant { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [string]$Name, - - [uint16[]]$Id, - - [string]$Query, - - [string]$Group, - - [uint16]$GroupID, - - [hashtable]$CustomFields, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} + #endregion GET commands diff --git a/Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 b/Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 new file mode 100644 index 0000000..1e12a9d --- /dev/null +++ b/Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 @@ -0,0 +1,25 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxVirtualizationChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri +} \ No newline at end of file diff --git a/Functions/Virtualization/Virtualization.Support.ps1 b/Functions/Virtualization/ValidateVirtualizationChoice.ps1 similarity index 80% rename from Functions/Virtualization/Virtualization.Support.ps1 rename to Functions/Virtualization/ValidateVirtualizationChoice.ps1 index 08be703..76ccf6b 100644 --- a/Functions/Virtualization/Virtualization.Support.ps1 +++ b/Functions/Virtualization/ValidateVirtualizationChoice.ps1 @@ -1,4 +1,17 @@ -function ValidateVirtualizationChoice { +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:12 + Created by: Claussen + Organization: NEOnet + Filename: ValidateVirtualizationChoice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + +function ValidateVirtualizationChoice { <# .SYNOPSIS Internal function to verify provided values for static choices diff --git a/Functions/Virtualization/VirtualMachine/Get-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/Get-NetboxVirtualMachine.ps1 new file mode 100644 index 0000000..65a5161 --- /dev/null +++ b/Functions/Virtualization/VirtualMachine/Get-NetboxVirtualMachine.ps1 @@ -0,0 +1,155 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxVirtualMachine { +<# + .SYNOPSIS + Obtains virtual machines from Netbox. + + .DESCRIPTION + Obtains one or more virtual machines based on provided filters. + + .PARAMETER Limit + Number of results to return per page + + .PARAMETER Offset + The initial index from which to return the results + + .PARAMETER Query + A general query used to search for a VM + + .PARAMETER Name + Name of the VM + + .PARAMETER Id + Database ID of the VM + + .PARAMETER Status + Status of the VM + + .PARAMETER Tenant + String value of tenant + + .PARAMETER Tenant_ID + Database ID of the tenant. + + .PARAMETER Platform + String value of the platform + + .PARAMETER Platform_ID + Database ID of the platform + + .PARAMETER Cluster_Group + String value of the cluster group. + + .PARAMETER Cluster_Group_Id + Database ID of the cluster group. + + .PARAMETER Cluster_Type + String value of the Cluster type. + + .PARAMETER Cluster_Type_Id + Database ID of the cluster type. + + .PARAMETER Cluster_Id + Database ID of the cluster. + + .PARAMETER Site + String value of the site. + + .PARAMETER Site_Id + Database ID of the site. + + .PARAMETER Role + String value of the role. + + .PARAMETER Role_Id + Database ID of the role. + + .PARAMETER Raw + A description of the Raw parameter. + + .PARAMETER TenantID + Database ID of tenant + + .PARAMETER PlatformID + Database ID of the platform + + .PARAMETER id__in + Database IDs of VMs + + .EXAMPLE + PS C:\> Get-NetboxVirtualMachine + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Alias('q')] + [string]$Query, + + [string]$Name, + + [uint16[]]$Id, + + [object]$Status, + + [string]$Tenant, + + [uint16]$Tenant_ID, + + [string]$Platform, + + [uint16]$Platform_ID, + + [string]$Cluster_Group, + + [uint16]$Cluster_Group_Id, + + [string]$Cluster_Type, + + [uint16]$Cluster_Type_Id, + + [uint16]$Cluster_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 new file mode 100644 index 0000000..31bc926 --- /dev/null +++ b/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 @@ -0,0 +1,58 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function New-NetboxVirtualMachine { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Cluster, + + [uint16]$Tenant, + + [object]$Status = 'Active', + + [uint16]$Role, + + [uint16]$Platform, + + [uint16]$vCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [hashtable]$Custom_Fields, + + [string]$Comments + ) + + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachine/Remove-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/Remove-NetboxVirtualMachine.ps1 new file mode 100644 index 0000000..4e599a3 --- /dev/null +++ b/Functions/Virtualization/VirtualMachine/Remove-NetboxVirtualMachine.ps1 @@ -0,0 +1,68 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:45 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Remove-NetboxVirtualMachine { +<# + .SYNOPSIS + Delete a virtual machine + + .DESCRIPTION + Deletes a virtual machine from Netbox by ID + + .PARAMETER Id + Database ID of the virtual machine + + .PARAMETER Force + Force deletion without any prompts + + .EXAMPLE + PS C:\> Remove-NetboxVirtualMachine -Id $value1 + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($VMId in $Id) { + $CurrentVM = Get-NetboxVirtualMachine -Id $VMId -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("$($CurrentVM.Name)/$($CurrentVM.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $CurrentVM.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 new file mode 100644 index 0000000..3cb7aff --- /dev/null +++ b/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 @@ -0,0 +1,72 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:45 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxVirtualMachine { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [string]$Name, + + [uint16]$Role, + + [uint16]$Cluster, + + [object]$Status, + + [uint16]$Platform, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [byte]$VCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Tenant, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $Id)) + + Write-Verbose "Obtaining VM from ID $Id" + + $CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop + + Write-Verbose "Finished obtaining VM" + + if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachineInterface/Add-NetboxVirtualMachineInterface.ps1 b/Functions/Virtualization/VirtualMachineInterface/Add-NetboxVirtualMachineInterface.ps1 new file mode 100644 index 0000000..f9b0b56 --- /dev/null +++ b/Functions/Virtualization/VirtualMachineInterface/Add-NetboxVirtualMachineInterface.ps1 @@ -0,0 +1,45 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:46 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Add-NetboxVirtualMachineInterface { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Virtual_Machine, + + [boolean]$Enabled = $true, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) + + $PSBoundParameters.Enabled = $Enabled + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $uri -Method POST -Body $URIComponents.Parameters +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 b/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 new file mode 100644 index 0000000..e1438e4 --- /dev/null +++ b/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 @@ -0,0 +1,92 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxVirtualMachineInterface { +<# + .SYNOPSIS + Gets VM interfaces + + .DESCRIPTION + Obtains the interface objects for one or more VMs + + .PARAMETER Limit + Number of results to return per page. + + .PARAMETER Offset + The initial index from which to return the results. + + .PARAMETER Id + Database ID of the interface + + .PARAMETER Name + Name of the interface + + .PARAMETER Enabled + True/False if the interface is enabled + + .PARAMETER MTU + Maximum Transmission Unit size. Generally 1500 or 9000 + + .PARAMETER Virtual_Machine_Id + ID of the virtual machine to which the interface(s) are assigned. + + .PARAMETER Virtual_Machine + Name of the virtual machine to get interfaces + + .PARAMETER MAC_Address + MAC address assigned to the interface + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxVirtualMachineInterface + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipeline = $true)] + [uint16]$Id, + + [string]$Name, + + [boolean]$Enabled, + + [uint16]$MTU, + + [uint16]$Virtual_Machine_Id, + + [string]$Virtual_Machine, + + [string]$MAC_Address, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualMachineInterface/Set-NetboxVirtualMachineInterface.ps1 b/Functions/Virtualization/VirtualMachineInterface/Set-NetboxVirtualMachineInterface.ps1 new file mode 100644 index 0000000..ab2ef49 --- /dev/null +++ b/Functions/Virtualization/VirtualMachineInterface/Set-NetboxVirtualMachineInterface.ps1 @@ -0,0 +1,65 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxVirtualMachineInterface { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Name, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [boolean]$Enabled, + + [uint16]$Virtual_Machine, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($VMI_ID in $Id) { + Write-Verbose "Obtaining VM Interface..." + $CurrentVMI = Get-NetboxVirtualMachineInterface -Id $VMI_ID -ErrorAction Stop + Write-Verbose "Finished obtaining VM Interface" + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces', $CurrentVMI.Id)) + + if ($Force -or $pscmdlet.ShouldProcess("Interface $($CurrentVMI.Id) on VM $($CurrentVMI.Virtual_Machine.Name)", "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } +} \ No newline at end of file diff --git a/Functions/Virtualization/Virtualization.ps1 b/Functions/Virtualization/Virtualization.ps1 deleted file mode 100644 index ce122d1..0000000 --- a/Functions/Virtualization/Virtualization.ps1 +++ /dev/null @@ -1,677 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/8/2018 3:59 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: Virtualization.ps1 - =========================================================================== - .DESCRIPTION - Virtualization object functions -#> - -#region GET commands - -function Get-NetboxVirtualizationChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments - - InvokeNetboxRequest -URI $uri -} - -function Get-NetboxVirtualMachine { -<# - .SYNOPSIS - Obtains virtual machines from Netbox. - - .DESCRIPTION - Obtains one or more virtual machines based on provided filters. - - .PARAMETER Limit - Number of results to return per page - - .PARAMETER Offset - The initial index from which to return the results - - .PARAMETER Query - A general query used to search for a VM - - .PARAMETER Name - Name of the VM - - .PARAMETER Id - Database ID of the VM - - .PARAMETER Status - Status of the VM - - .PARAMETER Tenant - String value of tenant - - .PARAMETER Tenant_ID - Database ID of the tenant. - - .PARAMETER Platform - String value of the platform - - .PARAMETER Platform_ID - Database ID of the platform - - .PARAMETER Cluster_Group - String value of the cluster group. - - .PARAMETER Cluster_Group_Id - Database ID of the cluster group. - - .PARAMETER Cluster_Type - String value of the Cluster type. - - .PARAMETER Cluster_Type_Id - Database ID of the cluster type. - - .PARAMETER Cluster_Id - Database ID of the cluster. - - .PARAMETER Site - String value of the site. - - .PARAMETER Site_Id - Database ID of the site. - - .PARAMETER Role - String value of the role. - - .PARAMETER Role_Id - Database ID of the role. - - .PARAMETER Raw - A description of the Raw parameter. - - .PARAMETER TenantID - Database ID of tenant - - .PARAMETER PlatformID - Database ID of the platform - - .PARAMETER id__in - Database IDs of VMs - - .EXAMPLE - PS C:\> Get-NetboxVirtualMachine - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Alias('q')] - [string]$Query, - - [string]$Name, - - [uint16[]]$Id, - - [object]$Status, - - [string]$Tenant, - - [uint16]$Tenant_ID, - - [string]$Platform, - - [uint16]$Platform_ID, - - [string]$Cluster_Group, - - [uint16]$Cluster_Group_Id, - - [string]$Cluster_Type, - - [uint16]$Cluster_Type_Id, - - [uint16]$Cluster_Id, - - [string]$Site, - - [uint16]$Site_Id, - - [string]$Role, - - [uint16]$Role_Id, - - [switch]$Raw - ) - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxVirtualMachineInterface { -<# - .SYNOPSIS - Gets VM interfaces - - .DESCRIPTION - Obtains the interface objects for one or more VMs - - .PARAMETER Limit - Number of results to return per page. - - .PARAMETER Offset - The initial index from which to return the results. - - .PARAMETER Id - Database ID of the interface - - .PARAMETER Name - Name of the interface - - .PARAMETER Enabled - True/False if the interface is enabled - - .PARAMETER MTU - Maximum Transmission Unit size. Generally 1500 or 9000 - - .PARAMETER Virtual_Machine_Id - ID of the virtual machine to which the interface(s) are assigned. - - .PARAMETER Virtual_Machine - Name of the virtual machine to get interfaces - - .PARAMETER MAC_Address - MAC address assigned to the interface - - .PARAMETER Raw - A description of the Raw parameter. - - .EXAMPLE - PS C:\> Get-NetboxVirtualMachineInterface - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Parameter(ValueFromPipeline = $true)] - [uint16]$Id, - - [string]$Name, - - [boolean]$Enabled, - - [uint16]$MTU, - - [uint16]$Virtual_Machine_Id, - - [string]$Virtual_Machine, - - [string]$MAC_Address, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxVirtualizationCluster { -<# - .SYNOPSIS - Obtains virtualization clusters from Netbox. - - .DESCRIPTION - Obtains one or more virtualization clusters based on provided filters. - - .PARAMETER Limit - Number of results to return per page - - .PARAMETER Offset - The initial index from which to return the results - - .PARAMETER Query - A general query used to search for a cluster - - .PARAMETER Name - Name of the cluster - - .PARAMETER Id - Database ID(s) of the cluster - - .PARAMETER Group - String value of the cluster group. - - .PARAMETER Group_Id - Database ID of the cluster group. - - .PARAMETER Type - String value of the Cluster type. - - .PARAMETER Type_Id - Database ID of the cluster type. - - .PARAMETER Site - String value of the site. - - .PARAMETER Site_Id - Database ID of the site. - - .PARAMETER Raw - A description of the Raw parameter. - - .EXAMPLE - PS C:\> Get-NetboxVirtualizationCluster - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [Alias('q')] - [string]$Query, - - [string]$Name, - - [Alias('id__in')] - [uint16[]]$Id, - - [string]$Group, - - [uint16]$Group_Id, - - [string]$Type, - - [uint16]$Type_Id, - - [string]$Site, - - [uint16]$Site_Id, - - [switch]$Raw - ) - - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) - - $URIParameters = @{ - } - - foreach ($CmdletParameterName in $PSBoundParameters.Keys) { - if ($CmdletParameterName -in $CommonParameterNames) { - # These are common parameters and should not be appended to the URI - Write-Debug "Skipping parameter $CmdletParameterName" - continue - } - - if ($CmdletParameterName -eq 'Id') { - # Check if there is one or more values for Id and build a URI or query as appropriate - if (@($PSBoundParameters[$CmdletParameterName]).Count -gt 1) { - $URIParameters['id__in'] = $Id -join ',' - } else { - [void]$uriSegments.Add($PSBoundParameters[$CmdletParameterName]) - } - } elseif ($CmdletParameterName -eq 'Query') { - $URIParameters['q'] = $PSBoundParameters[$CmdletParameterName] - } else { - $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] - } - } - - $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -function Get-NetboxVirtualizationClusterGroup { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [string]$Name, - - [string]$Slug, - - [switch]$Raw - ) - - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) - - $URIParameters = @{} - - foreach ($CmdletParameterName in $PSBoundParameters.Keys) { - if ($CmdletParameterName -in $CommonParameterNames) { - # These are common parameters and should not be appended to the URI - Write-Debug "Skipping parameter $CmdletParameterName" - continue - } - - $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] - } - - $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw -} - -#endregion GET commands - - -#region ADD/NEW commands - -function New-NetboxVirtualMachine { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [string]$Name, - - [Parameter(Mandatory = $true)] - [uint16]$Cluster, - - [uint16]$Tenant, - - [object]$Status = 'Active', - - [uint16]$Role, - - [uint16]$Platform, - - [uint16]$vCPUs, - - [uint16]$Memory, - - [uint16]$Disk, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [hashtable]$Custom_Fields, - - [string]$Comments - ) - - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -} - -function Add-NetboxVirtualMachineInterface { - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [string]$Name, - - [Parameter(Mandatory = $true)] - [uint16]$Virtual_Machine, - - [boolean]$Enabled = $true, - - [string]$MAC_Address, - - [uint16]$MTU, - - [string]$Description, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) - - $PSBoundParameters.Enabled = $Enabled - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $uri -Method POST -Body $URIComponents.Parameters -} - -#endregion ADD commands - - -#region SET commands - -function Set-NetboxVirtualMachine { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16]$Id, - - [string]$Name, - - [uint16]$Role, - - [uint16]$Cluster, - - [object]$Status, - - [uint16]$Platform, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [byte]$VCPUs, - - [uint16]$Memory, - - [uint16]$Disk, - - [uint16]$Tenant, - - [string]$Comments, - - [hashtable]$Custom_Fields, - - [switch]$Force - ) - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $Id)) - - Write-Verbose "Obtaining VM from ID $Id" - - $CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop - - Write-Verbose "Finished obtaining VM" - - if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } -} - -function Set-NetboxVirtualMachineInterface { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Name, - - [string]$MAC_Address, - - [uint16]$MTU, - - [string]$Description, - - [boolean]$Enabled, - - [uint16]$Virtual_Machine, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($VMI_ID in $Id) { - Write-Verbose "Obtaining VM Interface..." - $CurrentVMI = Get-NetboxVirtualMachineInterface -Id $VMI_ID -ErrorAction Stop - Write-Verbose "Finished obtaining VM Interface" - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces', $CurrentVMI.Id)) - - if ($Force -or $pscmdlet.ShouldProcess("Interface $($CurrentVMI.Id) on VM $($CurrentVMI.Virtual_Machine.Name)", "Set")) { - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end { - - } -} - - - -#endregion SET commands - - -#region REMOVE commands - -function Remove-NetboxVirtualMachine { -<# - .SYNOPSIS - Delete a virtual machine - - .DESCRIPTION - Deletes a virtual machine from Netbox by ID - - .PARAMETER Id - Database ID of the virtual machine - - .PARAMETER Force - Force deletion without any prompts - - .EXAMPLE - PS C:\> Remove-NetboxVirtualMachine -Id $value1 - - .NOTES - Additional information about the function. -#> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($VMId in $Id) { - $CurrentVM = Get-NetboxVirtualMachine -Id $VMId -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("$($CurrentVM.Name)/$($CurrentVM.Id)", "Remove")) { - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $CurrentVM.Id)) - - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - - } -} - - -#endregion REMOVE commands - - - - - - - - - - - - - - - - - - - - - diff --git a/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 new file mode 100644 index 0000000..327d948 --- /dev/null +++ b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 @@ -0,0 +1,125 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationCluster.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxVirtualizationCluster { +<# + .SYNOPSIS + Obtains virtualization clusters from Netbox. + + .DESCRIPTION + Obtains one or more virtualization clusters based on provided filters. + + .PARAMETER Limit + Number of results to return per page + + .PARAMETER Offset + The initial index from which to return the results + + .PARAMETER Query + A general query used to search for a cluster + + .PARAMETER Name + Name of the cluster + + .PARAMETER Id + Database ID(s) of the cluster + + .PARAMETER Group + String value of the cluster group. + + .PARAMETER Group_Id + Database ID of the cluster group. + + .PARAMETER Type + String value of the Cluster type. + + .PARAMETER Type_Id + Database ID of the cluster type. + + .PARAMETER Site + String value of the site. + + .PARAMETER Site_Id + Database ID of the site. + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxVirtualizationCluster + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Alias('q')] + [string]$Query, + + [string]$Name, + + [Alias('id__in')] + [uint16[]]$Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Type, + + [uint16]$Type_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [switch]$Raw + ) + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) + + $URIParameters = @{ + } + + foreach ($CmdletParameterName in $PSBoundParameters.Keys) { + if ($CmdletParameterName -in $CommonParameterNames) { + # These are common parameters and should not be appended to the URI + Write-Debug "Skipping parameter $CmdletParameterName" + continue + } + + if ($CmdletParameterName -eq 'Id') { + # Check if there is one or more values for Id and build a URI or query as appropriate + if (@($PSBoundParameters[$CmdletParameterName]).Count -gt 1) { + $URIParameters['id__in'] = $Id -join ',' + } else { + [void]$uriSegments.Add($PSBoundParameters[$CmdletParameterName]) + } + } elseif ($CmdletParameterName -eq 'Query') { + $URIParameters['q'] = $PSBoundParameters[$CmdletParameterName] + } else { + $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] + } + } + + $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 new file mode 100644 index 0000000..f558bd8 --- /dev/null +++ b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 @@ -0,0 +1,48 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:11 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationClusterGroup.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Get-NetboxVirtualizationClusterGroup { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [string]$Name, + + [string]$Slug, + + [switch]$Raw + ) + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) + + $URIParameters = @{ + } + + foreach ($CmdletParameterName in $PSBoundParameters.Keys) { + if ($CmdletParameterName -in $CommonParameterNames) { + # These are common parameters and should not be appended to the URI + Write-Debug "Skipping parameter $CmdletParameterName" + continue + } + + $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] + } + + $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} \ No newline at end of file diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index 0ed2e76..868ae3b 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -19,7 +19,7 @@ ModuleToProcess = 'NetboxPS.psm1' # Version number of this module. - ModuleVersion = '1.0.2' + ModuleVersion = '1.0.3' # ID used to uniquely identify this module GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' diff --git a/NetboxPS.psm1 b/NetboxPS.psm1 index 562b0f0..822afb0 100644 --- a/NetboxPS.psm1 +++ b/NetboxPS.psm1 @@ -1,10 +1,3629 @@ -# Build a list of common paramters so we can omit them to build URI parameters -$script:CommonParameterNames = New-Object System.Collections.ArrayList -[void]$script:CommonParameterNames.AddRange(@([System.Management.Automation.PSCmdlet]::CommonParameters)) -[void]$script:CommonParameterNames.AddRange(@([System.Management.Automation.PSCmdlet]::OptionalCommonParameters)) -[void]$script:CommonParameterNames.Add('Raw') +<# + .NOTES + -------------------------------------------------------------------------------- + Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Generated on: 3/23/2020 12:17 + Generated by: Claussen + Organization: NEOnet + -------------------------------------------------------------------------------- + .DESCRIPTION + Script generated by PowerShell Studio 2020 +#> -SetupNetboxConfigVariable -Export-ModuleMember -Function * -#Export-ModuleMember -Function *-* \ No newline at end of file +#region Invoke-Helpers_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 + Created on: 2/28/2018 3:33 PM + Created by: Ben Claussen + Organization: NEOnet + Filename: Helpers.ps1 + =========================================================================== + .DESCRIPTION + These function are internal functions and generally are not + exposed to the end user + #> + + function CheckNetboxIsConnected { + [CmdletBinding()] + param () + + Write-Verbose "Checking connection status" + if (-not $script:NetboxConfig.Connected) { + throw "Not connected to a Netbox API! Please run 'Connect-NetboxAPI'" + } + } + + function BuildNewURI { + <# + .SYNOPSIS + Create a new URI for Netbox + + .DESCRIPTION + Internal function used to build a URIBuilder object. + + .PARAMETER Hostname + Hostname of the Netbox API + + .PARAMETER Segments + Array of strings for each segment in the URL path + + .PARAMETER Parameters + Hashtable of query parameters to include + + .PARAMETER HTTPS + Whether to use HTTPS or HTTP + + .PARAMETER Port + A description of the Port parameter. + + .PARAMETER APIInfo + A description of the APIInfo parameter. + + .EXAMPLE + PS C:\> BuildNewURI + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([System.UriBuilder])] + param + ( + [Parameter(Mandatory = $false)] + [string]$Hostname, + + [Parameter(Mandatory = $false)] + [string[]]$Segments, + + [Parameter(Mandatory = $false)] + [hashtable]$Parameters, + + [Parameter(Mandatory = $false)] + [boolean]$HTTPS = $true, + + [ValidateRange(1, 65535)] + [uint16]$Port = 443, + + [switch]$SkipConnectedCheck + ) + + Write-Verbose "Building URI" + + if (-not $SkipConnectedCheck) { + # There is no point in continuing if we have not successfully connected to an API + $null = CheckNetboxIsConnected + } + + if (-not $Hostname) { + $Hostname = Get-NetboxHostname + } + + if ($HTTPS) { + Write-Verbose " Setting scheme to HTTPS" + $Scheme = 'https' + } else { + Write-Warning " Connecting via non-secure HTTP is not-recommended" + + Write-Verbose " Setting scheme to HTTP" + $Scheme = 'http' + + if (-not $PSBoundParameters.ContainsKey('Port')) { + # Set the port to 80 if the user did not supply it + Write-Verbose " Setting port to 80 as default because it was not supplied by the user" + $Port = 80 + } + } + + # Begin a URI builder with HTTP/HTTPS and the provided hostname + $uriBuilder = [System.UriBuilder]::new($Scheme, $Hostname, $Port) + + # Generate the path by trimming excess slashes and whitespace from the $segments[] and joining together + $uriBuilder.Path = "api/{0}/" -f ($Segments.ForEach({$_.trim('/').trim()}) -join '/') + + Write-Verbose " URIPath: $($uriBuilder.Path)" + + if ($parameters) { + # Loop through the parameters and use the HttpUtility to create a Query string + [System.Collections.Specialized.NameValueCollection]$URIParams = [System.Web.HttpUtility]::ParseQueryString([String]::Empty) + + foreach ($param in $Parameters.GetEnumerator()) { + Write-Verbose " Adding URI parameter $($param.Key):$($param.Value)" + $URIParams[$param.Key] = $param.Value + } + + $uriBuilder.Query = $URIParams.ToString() + } + + Write-Verbose " Completed building URIBuilder" + # Return the entire UriBuilder object + $uriBuilder + } + + function BuildURIComponents { + [CmdletBinding()] + [OutputType([hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.ArrayList]$URISegments, + + [Parameter(Mandatory = $true)] + [object]$ParametersDictionary, + + [string[]]$SkipParameterByName + ) + + Write-Verbose "Building URI components" + + $URIParameters = @{} + + foreach ($CmdletParameterName in $ParametersDictionary.Keys) { + if ($CmdletParameterName -in $script:CommonParameterNames) { + # These are common parameters and should not be appended to the URI + Write-Debug "Skipping common parameter $CmdletParameterName" + continue + } + + if ($CmdletParameterName -in $SkipParameterByName) { + Write-Debug "Skipping parameter $CmdletParameterName by SkipParameterByName" + continue + } + + switch ($CmdletParameterName) { + "id" { + # Check if there is one or more values for Id and build a URI or query as appropriate + if (@($ParametersDictionary[$CmdletParameterName]).Count -gt 1) { + Write-Verbose " Joining IDs for parameter" + $URIParameters['id__in'] = $ParametersDictionary[$CmdletParameterName] -join ',' + } else { + Write-Verbose " Adding ID to segments" + [void]$uriSegments.Add($ParametersDictionary[$CmdletParameterName]) + } + + break + } + + 'Query' { + Write-Verbose " Adding query parameter" + $URIParameters['q'] = $ParametersDictionary[$CmdletParameterName] + break + } + + 'CustomFields' { + Write-Verbose " Adding custom field query parameters" + foreach ($field in $ParametersDictionary[$CmdletParameterName].GetEnumerator()) { + Write-Verbose " Adding parameter 'cf_$($field.Key) = $($field.Value)" + $URIParameters["cf_$($field.Key.ToLower())"] = $field.Value + } + + break + } + + default { + Write-Verbose " Adding $($CmdletParameterName.ToLower()) parameter" + $URIParameters[$CmdletParameterName.ToLower()] = $ParametersDictionary[$CmdletParameterName] + break + } + } + } + + return @{ + 'Segments' = [System.Collections.ArrayList]$URISegments + 'Parameters' = $URIParameters + } + } + + function GetChoiceValidValues { + [CmdletBinding()] + [OutputType([System.Collections.ArrayList])] + param + ( + [Parameter(Mandatory = $true)] + [string]$MajorObject, + + [Parameter(Mandatory = $true)] + [object]$Choice + ) + + $ValidValues = New-Object System.Collections.ArrayList + + if (-not $script:NetboxConfig.Choices.$MajorObject.$Choice) { + throw "Missing choices for $Choice" + } + + [void]$ValidValues.AddRange($script:NetboxConfig.Choices.$MajorObject.$Choice.value) + [void]$ValidValues.AddRange($script:NetboxConfig.Choices.$MajorObject.$Choice.label) + + if ($ValidValues.Count -eq 0) { + throw "Missing valid values for $MajorObject.$Choice" + } + + return [System.Collections.ArrayList]$ValidValues + } + + function ValidateChoice { + [CmdletBinding()] + [OutputType([uint16], [string], [bool])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Circuits', 'DCIM', 'Extras', 'IPAM', 'Virtualization', IgnoreCase = $true)] + [string]$MajorObject, + + [Parameter(Mandatory = $true)] + [string]$ChoiceName, + + [Parameter(Mandatory = $true)] + [object]$ProvidedValue + ) + + $ValidValues = GetChoiceValidValues -MajorObject $MajorObject -Choice $ChoiceName + + Write-Verbose "Validating $ChoiceName" + Write-Verbose "Checking '$ProvidedValue' against [$($ValidValues -join ', ')]" + + # Coercing everything to strings for matching... + # some values are integers, some are strings, some are booleans + # Join the valid values with a pipe as a delimeter, because some values have spaces + if (([string]($ValidValues -join '|') -split '\|') -inotcontains [string]$ProvidedValue) { + throw "Invalid value '$ProvidedValue' for '$ChoiceName'. Must be one of: $($ValidValues -join ', ')" + } + + switch -wildcard ("$MajorObject/$ChoiceName") { + "Circuits" { + # This has things that are not integers + } + + "DCIM/*connection_status" { + # This has true/false values instead of integers + try { + $val = [bool]::Parse($ProvidedValue) + } catch { + # It must not be a true/false value + $val = $script:NetboxConfig.Choices.$MajorObject.$ChoiceName.Where({ $_.Label -eq $ProvidedValue }).Value + } + + return $val + } + + default { + # Convert the ProvidedValue to the integer value + try { + $intVal = [uint16]"$ProvidedValue" + } catch { + # It must not be a number, get the value from the label + $intVal = [uint16]$script:NetboxConfig.Choices.$MajorObject.$ChoiceName.Where({ $_.Label -eq $ProvidedValue }).Value + } + + return $intVal + } + } + } + + + function GetNetboxAPIErrorBody { + param + ( + [Parameter(Mandatory = $true)] + [System.Net.HttpWebResponse]$Response + ) + + # This takes the $Response stream and turns it into a useable object... generally a string. + # If the body is JSON, you should be able to use ConvertFrom-Json + + $reader = New-Object System.IO.StreamReader($Response.GetResponseStream()) + $reader.BaseStream.Position = 0 + $reader.DiscardBufferedData() + $reader.ReadToEnd() + } + + function InvokeNetboxRequest { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.UriBuilder]$URI, + + [Hashtable]$Headers = @{}, + + [pscustomobject]$Body = $null, + + [ValidateRange(0, 60)] + [uint16]$Timeout = 5, + + [ValidateSet('GET', 'PATCH', 'PUT', 'POST', 'DELETE', IgnoreCase = $true)] + [string]$Method = 'GET', + + [switch]$Raw + ) + + $creds = Get-NetboxCredential + + $Headers.Authorization = "Token {0}" -f $creds.GetNetworkCredential().Password + + $splat = @{ + 'Method' = $Method + 'Uri' = $URI.Uri.AbsoluteUri # This property auto generates the scheme, hostname, path, and query + 'Headers' = $Headers + 'TimeoutSec' = $Timeout + 'ContentType' = 'application/json' + 'ErrorAction' = 'Stop' + 'Verbose' = $VerbosePreference + } + + if ($Body) { + Write-Verbose "BODY: $($Body | ConvertTo-Json -Compress)" + $null = $splat.Add('Body', ($Body | ConvertTo-Json -Compress)) + } + + $result = Invoke-RestMethod @splat + + #region TODO: Handle errors a little more gracefully... + + <# + try { + Write-Verbose "Sending request..." + $result = Invoke-RestMethod @splat + Write-Verbose $result + } catch { + Write-Verbose "Caught exception" + if ($_.Exception.psobject.properties.Name.contains('Response')) { + Write-Verbose "Exception contains a response property" + if ($Raw) { + Write-Verbose "RAW provided...throwing raw exception" + throw $_ + } + + Write-Verbose "Converting response to object" + $myError = GetNetboxAPIErrorBody -Response $_.Exception.Response | ConvertFrom-Json + } else { + Write-Verbose "No response property found" + $myError = $_ + } + } + + Write-Verbose "MyError is $($myError.GetType().FullName)" + + if ($myError -is [Exception]) { + throw $_ + } elseif ($myError -is [pscustomobject]) { + throw $myError.detail + } + #> + + #endregion TODO: Handle errors a little more gracefully... + + # If the user wants the raw value from the API... otherwise return only the actual result + if ($Raw) { + Write-Verbose "Returning raw result by choice" + return $result + } else { + if ($result.psobject.Properties.Name.Contains('results')) { + Write-Verbose "Found Results property on data, returning results directly" + return $result.Results + } else { + Write-Verbose "Did NOT find results property on data, returning raw result" + return $result + } + } + } + + + + + #region Troubleshooting commands + + function ThrowNetboxRESTError { + $uriSegments = [System.Collections.ArrayList]::new(@('fake', 'url')) + + $URIParameters = @{} + + $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters + + InvokeNetboxRequest -URI $uri -Raw + } + + function CreateEnum { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$EnumName, + + [Parameter(Mandatory = $true)] + [pscustomobject]$Values, + + [switch]$PassThru + ) + + $definition = @" +public enum $EnumName +{`n$(foreach ($value in $values) {"`t$($value.label) = $($value.value),`n"}) +} +"@ + if (-not ([System.Management.Automation.PSTypeName]"$EnumName").Type) { + #Write-Host $definition -ForegroundColor Green + Add-Type -TypeDefinition $definition -PassThru:$PassThru + } else { + Write-Warning "EnumType $EnumName already exists." + } + } + + #endregion Troubleshooting commands + + + + +#endregion + +#region Invoke-Setup_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 + Created on: 2/28/2018 3:33 PM + Created by: Ben Claussen + Organization: NEOnet + Filename: Setup.ps1 + =========================================================================== + .DESCRIPTION + These are the function used to setup the environment for connecting + to a Netbox API + #> + + function Set-NetboxHostName { + [CmdletBinding(ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] + [OutputType([string])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Hostname + ) + + if ($PSCmdlet.ShouldProcess('Netbox Hostname', 'Set')) { + $script:NetboxConfig.Hostname = $Hostname.Trim() + $script:NetboxConfig.Hostname + } + } + + function Get-NetboxHostname { + [CmdletBinding()] + param () + + Write-Verbose "Getting Netbox hostname" + if ($null -eq $script:NetboxConfig.Hostname) { + throw "Netbox Hostname is not set! You may set it with Set-NetboxHostname -Hostname 'hostname.domain.tld'" + } + + $script:NetboxConfig.Hostname + } + + function Set-NetboxCredential { + [CmdletBinding(DefaultParameterSetName = 'CredsObject', + ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] + [OutputType([pscredential])] + param + ( + [Parameter(ParameterSetName = 'CredsObject', + Mandatory = $true)] + [pscredential]$Credential, + + [Parameter(ParameterSetName = 'UserPass', + Mandatory = $true)] + [securestring]$Token + ) + + if ($PSCmdlet.ShouldProcess('Netbox Credentials', 'Set')) { + switch ($PsCmdlet.ParameterSetName) { + 'CredsObject' { + $script:NetboxConfig.Credential = $Credential + break + } + + 'UserPass' { + $script:NetboxConfig.Credential = [System.Management.Automation.PSCredential]::new('notapplicable', $Token) + break + } + } + + $script:NetboxConfig.Credential + } + } + + function Get-NetboxCredential { + [CmdletBinding()] + [OutputType([pscredential])] + param () + + if (-not $script:NetboxConfig.Credential) { + throw "Netbox Credentials not set! You may set with Set-NetboxCredential" + } + + $script:NetboxConfig.Credential + } + + function Connect-NetboxAPI { + <# + .SYNOPSIS + Connects to the Netbox API and ensures Credential work properly + + .DESCRIPTION + A detailed description of the Connect-NetboxAPI function. + + .PARAMETER Hostname + A description of the Hostname parameter. + + .PARAMETER Credential + A description of the Credential parameter. + + .EXAMPLE + PS C:\> Connect-NetboxAPI -Hostname "netbox.domain.com" + + This will prompt for Credential, then proceed to attempt a connection to Netbox + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Hostname, + + [Parameter(Mandatory = $false)] + [pscredential]$Credential + ) + + if (-not $Credential) { + try { + $Credential = Get-NetboxCredential -ErrorAction Stop + } catch { + # Credentials are not set... Try to obtain from the user + if (-not ($Credential = Get-Credential -UserName 'username-not-applicable' -Message "Enter token for Netbox")) { + throw "Token is necessary to connect to a Netbox API." + } + } + } + + $null = Set-NetboxHostName -Hostname $Hostname + $null = Set-NetboxCredential -Credential $Credential + + try { + Write-Verbose "Verifying API connectivity..." + $null = VerifyAPIConnectivity + $script:NetboxConfig.Connected = $true + Write-Verbose "Successfully connected!" + } catch { + Write-Verbose "Failed to connect. Generating error" + Write-Verbose $_.Exception.Message + if (($_.Exception.Response) -and ($_.Exception.Response.StatusCode -eq 403)) { + throw "Invalid token" + } else { + throw $_ + } + } + + Write-Verbose "Caching static choices" + $script:NetboxConfig.Choices.Circuits = Get-NetboxCircuitsChoices + $script:NetboxConfig.Choices.DCIM = Get-NetboxDCIMChoices # Not completed yet + $script:NetboxConfig.Choices.Extras = Get-NetboxExtrasChoices + $script:NetboxConfig.Choices.IPAM = Get-NetboxIPAMChoices + #$script:NetboxConfig.Choices.Secrets = Get-NetboxSecretsChoices # Not completed yet + #$script:NetboxConfig.Choices.Tenancy = Get-NetboxTenancyChoices + $script:NetboxConfig.Choices.Virtualization = Get-NetboxVirtualizationChoices + + Write-Verbose "Connection process completed" + } + + + + + + + + + + +#endregion + +#region Invoke-Extras_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 + Created on: 2/28/2018 3:43 PM + Created by: Ben Claussen + Organization: NEOnet + Filename: Extras.ps1 + =========================================================================== + .DESCRIPTION + Extras objects functions + #> + + function Get-NetboxExtrasChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri + } + +#endregion + +#region Invoke-ValidateDCIMChoice_ps1 + function ValidateDCIMChoice { + <# + .SYNOPSIS + Internal function to validate provided values for static choices + + .DESCRIPTION + When users connect to the API, choices for each major object are cached to the config variable. + These values are then utilized to validate if the provided value from a user is valid. + + .PARAMETER ProvidedValue + The value to validate against static choices + + .PARAMETER PowerConnectionStatus + Validate against power connection status values + + .PARAMETER InterfaceTemplateFormFactor + Validate against interface template form factor values + + .PARAMETER InterfaceConnectionStatus + Validate against interface connection status values + + .PARAMETER InterfaceFormFactor + Validate against interface form factor values + + .PARAMETER ConsolePortConnectionStatus + Validate against console port connection status values + + .PARAMETER DeviceStatus + Validate against device status values + + .PARAMETER DeviceFace + Validate against device face values + + .PARAMETER RackType + Validate against rack type values + + .PARAMETER RackWidth + Validate against rack width values. + + .EXAMPLE + PS C:\> ValidateDCIMChoice -ProvidedValue 'rear' -DeviceFace + + .EXAMPLE + PS C:\> ValidateDCIMChoice -ProvidedValue 'middle' -DeviceFace + >> Invalid value middle for device:face. Must be one of: 0, 1, Front, Rear + + .OUTPUTS + This function returns the integer value if valid. Otherwise, it will throw an error. + + .NOTES + Additional information about the function. + + .FUNCTIONALITY + This cmdlet is intended to be used internally and not exposed to the user + #> + + [CmdletBinding()] + [OutputType([uint16])] + param + ( + [Parameter(Mandatory = $true)] + [object]$ProvidedValue, + + [Parameter(ParameterSetName = 'power-port:connection_status', + Mandatory = $true)] + [switch]$PowerConnectionStatus, + + [Parameter(ParameterSetName = 'interface-template:form_factor', + Mandatory = $true)] + [switch]$InterfaceTemplateFormFactor, + + [Parameter(ParameterSetName = 'interface-connection:connection_status', + Mandatory = $true)] + [switch]$InterfaceConnectionStatus, + + [Parameter(ParameterSetName = 'interface:form_factor', + Mandatory = $true)] + [switch]$InterfaceFormFactor, + + [Parameter(ParameterSetName = 'console-port:connection_status', + Mandatory = $true)] + [switch]$ConsolePortConnectionStatus, + + [Parameter(ParameterSetName = 'device:status', + Mandatory = $true)] + [switch]$DeviceStatus, + + [Parameter(ParameterSetName = 'device:face', + Mandatory = $true)] + [switch]$DeviceFace, + + [Parameter(ParameterSetName = 'rack:type', + Mandatory = $true)] + [switch]$RackType, + + [Parameter(ParameterSetName = 'rack:width', + Mandatory = $true)] + [switch]$RackWidth + ) + + ValidateChoice -MajorObject 'DCIM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue + } +#endregion + +#region Invoke-Setup_Support_ps1 + function VerifyAPIConnectivity { + [CmdletBinding()] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck + + InvokeNetboxRequest -URI $uri + } + + function SetupNetboxConfigVariable { + [CmdletBinding()] + param + ( + [switch]$Overwrite + ) + + Write-Verbose "Checking for NetboxConfig hashtable" + if ((-not ($script:NetboxConfig)) -or $Overwrite) { + Write-Verbose "Creating NetboxConfig hashtable" + $script:NetboxConfig = @{ + 'Connected' = $false + 'Choices' = @{ + } + } + } + + Write-Verbose "NetboxConfig hashtable already exists" + } + + function GetNetboxConfigVariable { + return $script:NetboxConfig + } +#endregion + +#region Invoke-Get-NetboxIPAMVLAN_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/16/2020 16:34 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMVLAN.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxIPAMVLAN { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$VID, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$TenantGroup, + + [uint16]$TenantGroup_Id, + + [object]$Status, + + [string]$Region, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + + + + +#endregion + +#region Invoke-New-NetboxIPAMVLAN_ps1 + function New-NetboxIPAMAddress { + <# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$VID, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMRole_ps1 + + function Get-NetboxIPAMRole { + <# + .SYNOPSIS + Get IPAM Prefix/VLAN roles + + .DESCRIPTION + A role indicates the function of a prefix or VLAN. For example, you might define Data, Voice, and Security roles. Generally, a prefix will be assigned the same functional role as the VLAN to which it is assigned (if any). + + .PARAMETER Id + Unique ID + + .PARAMETER Query + Search query + + .PARAMETER Name + Role name + + .PARAMETER Slug + Role URL slug + + .PARAMETER Brief + Brief format + + .PARAMETER Limit + Result limit + + .PARAMETER Offset + Result offset + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxIPAMRole + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Slug, + + [switch]$Brief, + + [uint16]$Limit, + + [uint16]$Offset, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMAggregate_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:49 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMAggregate.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxIPAMAggregate { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [datetime]$Date_Added, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$RIR_Id, + + [string]$RIR, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMAddress_ps1 + function Get-NetboxIPAMAddress { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$Parent, + + [byte]$Mask_Length, + + [string]$VRF, + + [uint16]$VRF_Id, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$Device, + + [uint16]$Device_ID, + + [string]$Virtual_Machine, + + [uint16]$Virtual_Machine_Id, + + [uint16]$Interface_Id, + + [object]$Status, + + [object]$Role, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-New-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:51 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxIPAMAddress { + <# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Address, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-New-NetboxIPAMPrefix_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxIPAMPrefix { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Prefix, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [object]$Role, + + [bool]$IsPool, + + [string]$Description, + + [uint16]$Site, + + [uint16]$VRF, + + [uint16]$VLAN, + + [hashtable]$Custom_Fields, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + + <# + # As of 2018/10/18, this does not appear to be a validated IPAM choice + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole + } + #> + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-Remove-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + function Remove-NetboxIPAMAddress { + <# + .SYNOPSIS + Remove an IP address from Netbox + + .DESCRIPTION + Removes/deletes an IP address from Netbox by ID and optional other filters + + .PARAMETER Id + Database ID of the IP address object. + + .PARAMETER Force + Do not confirm. + + .EXAMPLE + PS C:\> Remove-NetboxIPAMAddress -Id $value1 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + } + + process { + foreach ($IPId in $Id) { + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) { + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + } + } +#endregion + +#region Invoke-Set-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:53 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxIPAMAddress { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Address, + + [object]$Status, + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Force + ) + + begin { + if ($Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + } + + process { + foreach ($IPId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + Write-Verbose "Obtaining IPs from ID $IPId" + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + } + } +#endregion + +#region Invoke-Get-NetboxIPAMChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:54 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxIPAMChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxTenant_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenant.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxTenant { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [string]$Name, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Group, + + [uint16]$GroupID, + + [hashtable]$CustomFields, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxTenancyChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenancyChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxTenancyChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('tenancy', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxVirtualMachine { + <# + .SYNOPSIS + Obtains virtual machines from Netbox. + + .DESCRIPTION + Obtains one or more virtual machines based on provided filters. + + .PARAMETER Limit + Number of results to return per page + + .PARAMETER Offset + The initial index from which to return the results + + .PARAMETER Query + A general query used to search for a VM + + .PARAMETER Name + Name of the VM + + .PARAMETER Id + Database ID of the VM + + .PARAMETER Status + Status of the VM + + .PARAMETER Tenant + String value of tenant + + .PARAMETER Tenant_ID + Database ID of the tenant. + + .PARAMETER Platform + String value of the platform + + .PARAMETER Platform_ID + Database ID of the platform + + .PARAMETER Cluster_Group + String value of the cluster group. + + .PARAMETER Cluster_Group_Id + Database ID of the cluster group. + + .PARAMETER Cluster_Type + String value of the Cluster type. + + .PARAMETER Cluster_Type_Id + Database ID of the cluster type. + + .PARAMETER Cluster_Id + Database ID of the cluster. + + .PARAMETER Site + String value of the site. + + .PARAMETER Site_Id + Database ID of the site. + + .PARAMETER Role + String value of the role. + + .PARAMETER Role_Id + Database ID of the role. + + .PARAMETER Raw + A description of the Raw parameter. + + .PARAMETER TenantID + Database ID of tenant + + .PARAMETER PlatformID + Database ID of the platform + + .PARAMETER id__in + Database IDs of VMs + + .EXAMPLE + PS C:\> Get-NetboxVirtualMachine + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Alias('q')] + [string]$Query, + + [string]$Name, + + [uint16[]]$Id, + + [object]$Status, + + [string]$Tenant, + + [uint16]$Tenant_ID, + + [string]$Platform, + + [uint16]$Platform_ID, + + [string]$Cluster_Group, + + [uint16]$Cluster_Group_Id, + + [string]$Cluster_Type, + + [uint16]$Cluster_Type_Id, + + [uint16]$Cluster_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-New-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxVirtualMachine { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Cluster, + + [uint16]$Tenant, + + [object]$Status = 'Active', + + [uint16]$Role, + + [uint16]$Platform, + + [uint16]$vCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [hashtable]$Custom_Fields, + + [string]$Comments + ) + + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters + } +#endregion + +#region Invoke-Set-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:45 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxVirtualMachine { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [string]$Name, + + [uint16]$Role, + + [uint16]$Cluster, + + [object]$Status, + + [uint16]$Platform, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [byte]$VCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Tenant, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $Id)) + + Write-Verbose "Obtaining VM from ID $Id" + + $CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop + + Write-Verbose "Finished obtaining VM" + + if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } +#endregion + +#region Invoke-Add-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:46 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Add-NetboxVirtualMachineInterface { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Virtual_Machine, + + [boolean]$Enabled = $true, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) + + $PSBoundParameters.Enabled = $Enabled + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $uri -Method POST -Body $URIComponents.Parameters + } +#endregion + +#region Invoke-Get-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxVirtualMachineInterface { + <# + .SYNOPSIS + Gets VM interfaces + + .DESCRIPTION + Obtains the interface objects for one or more VMs + + .PARAMETER Limit + Number of results to return per page. + + .PARAMETER Offset + The initial index from which to return the results. + + .PARAMETER Id + Database ID of the interface + + .PARAMETER Name + Name of the interface + + .PARAMETER Enabled + True/False if the interface is enabled + + .PARAMETER MTU + Maximum Transmission Unit size. Generally 1500 or 9000 + + .PARAMETER Virtual_Machine_Id + ID of the virtual machine to which the interface(s) are assigned. + + .PARAMETER Virtual_Machine + Name of the virtual machine to get interfaces + + .PARAMETER MAC_Address + MAC address assigned to the interface + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxVirtualMachineInterface + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipeline = $true)] + [uint16]$Id, + + [string]$Name, + + [boolean]$Enabled, + + [uint16]$MTU, + + [uint16]$Virtual_Machine_Id, + + [string]$Virtual_Machine, + + [string]$MAC_Address, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Set-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxVirtualMachineInterface { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Name, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [boolean]$Enabled, + + [uint16]$Virtual_Machine, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($VMI_ID in $Id) { + Write-Verbose "Obtaining VM Interface..." + $CurrentVMI = Get-NetboxVirtualMachineInterface -Id $VMI_ID -ErrorAction Stop + Write-Verbose "Finished obtaining VM Interface" + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces', $CurrentVMI.Id)) + + if ($Force -or $pscmdlet.ShouldProcess("Interface $($CurrentVMI.Id) on VM $($CurrentVMI.Virtual_Machine.Name)", "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Get-NetboxVirtualizationChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxVirtualizationChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxVirtualizationCluster_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationCluster.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxVirtualizationCluster { + <# + .SYNOPSIS + Obtains virtualization clusters from Netbox. + + .DESCRIPTION + Obtains one or more virtualization clusters based on provided filters. + + .PARAMETER Limit + Number of results to return per page + + .PARAMETER Offset + The initial index from which to return the results + + .PARAMETER Query + A general query used to search for a cluster + + .PARAMETER Name + Name of the cluster + + .PARAMETER Id + Database ID(s) of the cluster + + .PARAMETER Group + String value of the cluster group. + + .PARAMETER Group_Id + Database ID of the cluster group. + + .PARAMETER Type + String value of the Cluster type. + + .PARAMETER Type_Id + Database ID of the cluster type. + + .PARAMETER Site + String value of the site. + + .PARAMETER Site_Id + Database ID of the site. + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxVirtualizationCluster + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Alias('q')] + [string]$Query, + + [string]$Name, + + [Alias('id__in')] + [uint16[]]$Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Type, + + [uint16]$Type_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [switch]$Raw + ) + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) + + $URIParameters = @{ + } + + foreach ($CmdletParameterName in $PSBoundParameters.Keys) { + if ($CmdletParameterName -in $CommonParameterNames) { + # These are common parameters and should not be appended to the URI + Write-Debug "Skipping parameter $CmdletParameterName" + continue + } + + if ($CmdletParameterName -eq 'Id') { + # Check if there is one or more values for Id and build a URI or query as appropriate + if (@($PSBoundParameters[$CmdletParameterName]).Count -gt 1) { + $URIParameters['id__in'] = $Id -join ',' + } else { + [void]$uriSegments.Add($PSBoundParameters[$CmdletParameterName]) + } + } elseif ($CmdletParameterName -eq 'Query') { + $URIParameters['q'] = $PSBoundParameters[$CmdletParameterName] + } else { + $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] + } + } + + $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-ValidateVirtualizationChoice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:12 + Created by: Claussen + Organization: NEOnet + Filename: ValidateVirtualizationChoice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + function ValidateVirtualizationChoice { + <# + .SYNOPSIS + Internal function to verify provided values for static choices + + .DESCRIPTION + When users connect to the API, choices for each major object are cached to the config variable. + These values are then utilized to verify if the provided value from a user is valid. + + .PARAMETER ProvidedValue + The value to validate against static choices + + .PARAMETER AggregateFamily + Verify against aggregate family values + + .PARAMETER PrefixFamily + Verify against prefix family values + + .PARAMETER PrefixStatus + Verify against prefix status values + + .PARAMETER IPAddressFamily + Verify against ip-address family values + + .PARAMETER IPAddressStatus + Verify against ip-address status values + + .PARAMETER IPAddressRole + Verify against ip-address role values + + .PARAMETER VLANStatus + Verify against VLAN status values + + .PARAMETER ServiceProtocol + Verify against service protocol values + + .EXAMPLE + PS C:\> VerifyIPAMChoices -ProvidedValue 'loopback' -IPAddressRole + + .EXAMPLE + PS C:\> VerifyIPAMChoices -ProvidedValue 'Loopback' -IPAddressFamily + >> Invalid value Loopback for ip-address:family. Must be one of: 4, 6, IPv4, IPv6 + + .FUNCTIONALITY + This cmdlet is intended to be used internally and not exposed to the user + + .OUTPUT + This function returns nothing if the value is valid. Otherwise, it will throw an error. + #> + + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [object]$ProvidedValue, + + [Parameter(ParameterSetName = 'virtual-machine:status', + Mandatory = $true)] + [switch]$VirtualMachineStatus + ) + + ValidateChoice -MajorObject 'Virtualization' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue + } +#endregion + +#region Invoke-Get-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:06 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMDevice { + [CmdletBinding()] + #region Parameters + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [uint16]$Manufacturer_Id, + + [string]$Manufacturer, + + [uint16]$Device_Type_Id, + + [uint16]$Role_Id, + + [string]$Role, + + [uint16]$Tenant_Id, + + [string]$Tenant, + + [uint16]$Platform_Id, + + [string]$Platform, + + [string]$Asset_Tag, + + [uint16]$Site_Id, + + [string]$Site, + + [uint16]$Rack_Group_Id, + + [uint16]$Rack_Id, + + [uint16]$Cluster_Id, + + [uint16]$Model, + + [object]$Status, + + [bool]$Is_Full_Depth, + + [bool]$Is_Console_Server, + + [bool]$Is_PDU, + + [bool]$Is_Network_Device, + + [string]$MAC_Address, + + [bool]$Has_Primary_IP, + + [uint16]$Virtual_Chassis_Id, + + [uint16]$Position, + + [string]$Serial, + + [switch]$Raw + ) + + #endregion Parameters + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxDCIMDeviceType_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceType.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMDeviceType { + [CmdletBinding()] + #region Parameters + param + ( + [uint16]$Offset, + + [uint16]$Limit, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Slug, + + [string]$Manufacturer, + + [uint16]$Manufacturer_Id, + + [string]$Model, + + [string]$Part_Number, + + [uint16]$U_Height, + + [bool]$Is_Full_Depth, + + [bool]$Is_Console_Server, + + [bool]$Is_PDU, + + [bool]$Is_Network_Device, + + [uint16]$Subdevice_Role, + + [switch]$Raw + ) + #endregion Parameters + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-types')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxDCIMDeviceRole_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceRole.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMDeviceRole { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [string]$Name, + + [string]$Slug, + + [string]$Color, + + [bool]$VM_Role, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($DRId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles', $DRId)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'device-roles')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + } +#endregion + +#region Invoke-New-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxDCIMDevice { + [CmdletBinding()] + [OutputType([pscustomobject])] + #region Parameters + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [object]$Device_Role, + + [Parameter(Mandatory = $true)] + [object]$Device_Type, + + [Parameter(Mandatory = $true)] + [uint16]$Site, + + [object]$Status = 'Active', + + [uint16]$Platform, + + [uint16]$Tenant, + + [uint16]$Cluster, + + [uint16]$Rack, + + [uint16]$Position, + + [object]$Face, + + [string]$Serial, + + [string]$Asset_Tag, + + [uint16]$Virtual_Chassis, + + [uint16]$VC_Priority, + + [uint16]$VC_Position, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [string]$Comments, + + [hashtable]$Custom_Fields + ) + #endregion Parameters + + if ($null -ne $Device_Role) { + # Validate device role? + } + + if ($null -ne $Device_Type) { + # Validate device type? + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + if ($null -ne $Face) { + $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST + } +#endregion + +#region Invoke-Set-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxDCIMDevice { + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Name, + + [object]$Device_Role, + + [object]$Device_Type, + + [uint16]$Site, + + [object]$Status, + + [uint16]$Platform, + + [uint16]$Tenant, + + [uint16]$Cluster, + + [uint16]$Rack, + + [uint16]$Position, + + [object]$Face, + + [string]$Serial, + + [string]$Asset_Tag, + + [uint16]$Virtual_Chassis, + + [uint16]$VC_Priority, + + [uint16]$VC_Position, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force + ) + + begin { + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus + } + + if ($null -ne $Face) { + $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace + } + } + + process { + foreach ($DeviceID in $Id) { + $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("$($CurrentDevice.Name)", "Set")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } + } + +#endregion + +#region Invoke-Remove-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Remove-NetboxDCIMDevice { + <# + .SYNOPSIS + Delete a device + + .DESCRIPTION + Deletes a device from Netbox by ID + + .PARAMETER Id + Database ID of the device + + .PARAMETER Force + Force deletion without any prompts + + .EXAMPLE + PS C:\> Remove-NetboxDCIMDevice -Id $value1 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($DeviceID in $Id) { + $CurrentDevice = Get-NetboxDCIMDevice -Id $DeviceID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentDevice.Name) | ID: $($CurrentDevice.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'devices', $CurrentDevice.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Get-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:09 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [uint16]$Name, + + [object]$Form_Factor, + + [bool]$Enabled, + + [uint16]$MTU, + + [bool]$MGMT_Only, + + [string]$Device, + + [uint16]$Device_Id, + + [uint16]$Type, + + [uint16]$LAG_Id, + + [string]$MAC_Address, + + [switch]$Raw + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMInterfaceConnection { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$Id, + + [object]$Connection_Status, + + [uint16]$Site, + + [uint16]$Device, + + [switch]$Raw + ) + + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } +#endregion + +#region Invoke-Add-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Add-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$Device, + + [Parameter(Mandatory = $true)] + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST + } +#endregion + +#region Invoke-Add-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Add-NetboxDCIMInterfaceConnection { + <# + .SYNOPSIS + Create a new connection between two interfaces + + .DESCRIPTION + Create a new connection between two interfaces + + .PARAMETER Connection_Status + Is it connected or planned? + + .PARAMETER Interface_A + Database ID of interface A + + .PARAMETER Interface_B + Database ID of interface B + + .EXAMPLE + PS C:\> Add-NetboxDCIMInterfaceConnection -Interface_A $value1 -Interface_B $value2 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [object]$Connection_Status, + + [Parameter(Mandatory = $true)] + [uint16]$Interface_A, + + [Parameter(Mandatory = $true)] + [uint16]$Interface_B + ) + + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + # Verify if both Interfaces exist + $I_A = Get-NetboxDCIMInterface -Id $Interface_A -ErrorAction Stop + $I_B = Get-NetboxDCIMInterface -Id $Interface_B -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST + } +#endregion + +#region Invoke-Set-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxDCIMInterface { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [uint16]$Device, + + [string]$Name, + + [bool]$Enabled, + + [object]$Form_Factor, + + [uint16]$MTU, + + [string]$MAC_Address, + + [bool]$MGMT_Only, + + [uint16]$LAG, + + [string]$Description, + + [ValidateSet('Access', 'Tagged', 'Tagged All', '100', '200', '300', IgnoreCase = $true)] + [string]$Mode, + + [ValidateRange(1, 4094)] + [uint16]$Untagged_VLAN, + + [ValidateRange(1, 4094)] + [uint16[]]$Tagged_VLANs + ) + + begin { + if ($null -ne $Form_Factor) { + $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor + } + + if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { + $PSBoundParameters.Mode = switch ($Mode) { + 'Access' { + 100 + break + } + + 'Tagged' { + 200 + break + } + + 'Tagged All' { + 300 + break + } + + default { + $_ + } + } + } + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + + end { + + } + } +#endregion + +#region Invoke-Set-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxDCIMInterfaceConnection { + <# + .SYNOPSIS + Update an interface connection + + .DESCRIPTION + Update an interface connection + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Connection_Status + A description of the Connection_Status parameter. + + .PARAMETER Interface_A + A description of the Interface_A parameter. + + .PARAMETER Interface_B + A description of the Interface_B parameter. + + .PARAMETER Force + A description of the Force parameter. + + .EXAMPLE + PS C:\> Set-NetboxDCIMInterfaceConnection -Id $value1 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [object]$Connection_Status, + + [uint16]$Interface_A, + + [uint16]$Interface_B, + + [switch]$Force + ) + + begin { + if ($null -ne $Connection_Status) { + $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus + } + + if ((@($ID).Count -gt 1) -and ($Interface_A -or $Interface_B)) { + throw "Cannot set multiple connections to the same interface" + } + } + + process { + foreach ($ConnectionID in $Id) { + $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) + + if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($CurrentConnection.Id)", "Set")) { + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Remove-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Remove-NetboxDCIMInterface { + <# + .SYNOPSIS + Removes an interface + + .DESCRIPTION + Removes an interface by ID from a device + + .PARAMETER Id + A description of the Id parameter. + + .PARAMETER Force + A description of the Force parameter. + + .EXAMPLE + PS C:\> Remove-NetboxDCIMInterface -Id $value1 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($InterfaceId in $Id) { + $CurrentInterface = Get-NetboxDCIMInterface -Id $InterfaceId -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Name: $($CurrentInterface.Name) | ID: $($CurrentInterface.Id)", "Remove")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interfaces', $CurrentInterface.Id)) + + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Remove-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:12 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Remove-NetboxDCIMInterfaceConnection { + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + [OutputType([void])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($ConnectionID in $Id) { + $CurrentConnection = Get-NetboxDCIMInterfaceConnection -Id $ConnectionID -ErrorAction Stop + + if ($Force -or $pscmdlet.ShouldProcess("Connection ID $($ConnectionID.Id)", "REMOVE")) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'interface-connections', $CurrentConnection.Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Get-NetboxDCIMPlatform_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMPlatform.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMPlatform { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [string]$Name, + + [string]$Slug, + + [uint16]$Manufacturer_Id, + + [string]$Manufacturer, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($PlatformID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms', $PlatformID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + } +#endregion + +#region Invoke-Get-NetboxDCIMChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxDCIMChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('dcim', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxCircuitsChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitsChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxCircuitsChoices { + <# + .SYNOPSIS + Gets the choices associated with circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuitsChoices function. + + .EXAMPLE + PS C:\> Get-NetboxCircuitsChoices + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices')) + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri + } + +#endregion + +#region Invoke-Get-NetboxCircuit_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuit.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxCircuit { + <# + .SYNOPSIS + Gets one or more circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuit function. + + .PARAMETER CID + Circuit ID + + .PARAMETER InstallDate + Date of installation + + .PARAMETER CommitRate + Committed rate in Kbps + + .PARAMETER Query + A raw search query... As if you were searching the web site + + .PARAMETER Provider + The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs + + .PARAMETER Type + Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs + + .PARAMETER Site + Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs + + .PARAMETER Tenant + Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs + + .PARAMETER Id + Database ID of circuit. This will query for exactly the IDs provided + + .PARAMETER ID__IN + Multiple unique DB IDs to retrieve + + .EXAMPLE + PS C:\> Get-NetboxCircuit + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [string]$CID, + + [datetime]$InstallDate, + + [uint32]$CommitRate, + + [string]$Query, + + [object]$Provider, + + [object]$Type, + + [string]$Site, + + [string]$Tenant, + + [uint16[]]$Id + ) + + #TODO: Place script here + } +#endregion + + # Build a list of common paramters so we can omit them to build URI parameters + $script:CommonParameterNames = New-Object System.Collections.ArrayList + [void]$script:CommonParameterNames.AddRange(@([System.Management.Automation.PSCmdlet]::CommonParameters)) + [void]$script:CommonParameterNames.AddRange(@([System.Management.Automation.PSCmdlet]::OptionalCommonParameters)) + [void]$script:CommonParameterNames.Add('Raw') + + SetupNetboxConfigVariable + + Export-ModuleMember -Function * + #Export-ModuleMember -Function *-* \ No newline at end of file diff --git a/NetboxPS.psproj b/NetboxPS.psproj index e938937..accffff 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -11,6 +11,16 @@ Functions\Virtualization Functions\IPAM Functions\Tenancy + Functions\IPAM\VLAN + Functions\IPAM\Role + Functions\IPAM\Aggregate + Functions\IPAM\Address + Functions\IPAM\Prefix + Functions\Virtualization\VirtualMachine + Functions\Virtualization\VirtualMachineInterface + Functions\Virtualization\VirtualizationCluster + Functions\DCIM\Devices + Functions\DCIM\Interfaces NetboxPS.psd1 @@ -20,26 +30,61 @@ Functions\Helpers.ps1 Functions\Setup.ps1 Functions\Extras\Extras.ps1 - Functions\Circuits\Circuits.ps1 Tests\Setup.Tests.ps1 Tests\Helpers.Tests.ps1 - Functions\Virtualization\Virtualization.ps1 Tests\Virtualization.Tests.ps1 Tests\IPAM.Tests.ps1 - Functions\IPAM\IPAM.ps1 Tests\IPAMChoices.json Tests\VirtualizationChoices.json - Functions\DCIM\DCIM.ps1 Tests\DCIM.Devices.Tests.ps1 Tests\DCIM.Interfaces.Tests.ps1 Tests\DCIM.Platforms.Tests.ps1 - Functions\DCIM\DCIM.Devices.ps1 - Functions\DCIM\DCIM.Interfaces.ps1 - Functions\Tenancy\Tenancy.ps1 - Functions\DCIM\DCIM.Support.ps1 - Functions\IPAM\IPAM.Support.ps1 - Functions\Virtualization\Virtualization.Support.ps1 + Functions\DCIM\ValidateDCIMChoice.ps1 Functions\Setup.Support.ps1 + Functions\IPAM\VLAN\Get-NetboxIPAMVLAN.ps1 + Functions\IPAM\VLAN\New-NetboxIPAMVLAN.ps1 + Functions\IPAM\Role\Get-NetboxIPAMRole.ps1 + Functions\IPAM\Aggregate\Get-NetboxIPAMAggregate.ps1 + Functions\IPAM\Address\Get-NetboxIPAMAddress.ps1 + Functions\IPAM\Address\Get-NetboxIPAMAvailableIP.ps1 + Functions\IPAM\Prefix\Get-NetboxIPAMPrefix.ps1 + Functions\IPAM\Address\New-NetboxIPAMAddress.ps1 + Functions\IPAM\Prefix\New-NetboxIPAMPrefix.ps1 + Functions\IPAM\Address\Remove-NetboxIPAMAddress.ps1 + Functions\IPAM\Address\Set-NetboxIPAMAddress.ps1 + Functions\IPAM\ValidateIPAMChoice.ps1 + Functions\IPAM\Get-NetboxIPAMChoices.ps1 + Functions\Tenancy\Get-NetboxTenant.ps1 + Functions\Tenancy\Get-NetboxTenancyChoices.ps1 + Functions\Virtualization\VirtualMachine\Get-NetboxVirtualMachine.ps1 + Functions\Virtualization\VirtualMachine\New-NetboxVirtualMachine.ps1 + Functions\Virtualization\VirtualMachine\Set-NetboxVirtualMachine.ps1 + Functions\Virtualization\VirtualMachine\Remove-NetboxVirtualMachine.ps1 + Functions\Virtualization\VirtualMachineInterface\Add-NetboxVirtualMachineInterface.ps1 + Functions\Virtualization\VirtualMachineInterface\Get-NetboxVirtualMachineInterface.ps1 + Functions\Virtualization\VirtualMachineInterface\Set-NetboxVirtualMachineInterface.ps1 + Functions\Virtualization\Get-NetboxVirtualizationChoices.ps1 + Functions\Virtualization\VirtualizationCluster\Get-NetboxVirtualizationCluster.ps1 + Functions\Virtualization\VirtualizationCluster\Get-NetboxVirtualizationClusterGroup.ps1 + Functions\Virtualization\ValidateVirtualizationChoice.ps1 + Functions\DCIM\Devices\Get-NetboxDCIMDevice.ps1 + Functions\DCIM\Devices\Get-NetboxDCIMDeviceType.ps1 + Functions\DCIM\Devices\Get-NetboxDCIMDeviceRole.ps1 + Functions\DCIM\Devices\New-NetboxDCIMDevice.ps1 + Functions\DCIM\Devices\Set-NetboxDCIMDevice.ps1 + Functions\DCIM\Devices\Remove-NetboxDCIMDevice.ps1 + Functions\DCIM\Interfaces\Get-NetboxDCIMInterface.ps1 + Functions\DCIM\Interfaces\Get-NetboxDCIMInterfaceConnection.ps1 + Functions\DCIM\Interfaces\Add-NetboxDCIMInterface.ps1 + Functions\DCIM\Interfaces\Add-NetboxDCIMInterfaceConnection.ps1 + Functions\DCIM\Interfaces\Set-NetboxDCIMInterface.ps1 + Functions\DCIM\Interfaces\Set-NetboxDCIMInterfaceConnection.ps1 + Functions\DCIM\Interfaces\Remove-NetboxDCIMInterface.ps1 + Functions\DCIM\Interfaces\Remove-NetboxDCIMInterfaceConnection.ps1 + Functions\DCIM\Get-NetboxDCIMPlatform.ps1 + Functions\DCIM\Get-NetboxDCIMChoices.ps1 + Functions\Circuits\Get-NetboxCircuitsChoices.ps1 + Functions\Circuits\Get-NetboxCircuit.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file diff --git a/dist/NetboxPS.psd1 b/dist/NetboxPS.psd1 index 0ed2e76..868ae3b 100644 --- a/dist/NetboxPS.psd1 +++ b/dist/NetboxPS.psd1 @@ -19,7 +19,7 @@ ModuleToProcess = 'NetboxPS.psm1' # Version number of this module. - ModuleVersion = '1.0.2' + ModuleVersion = '1.0.3' # ID used to uniquely identify this module GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' diff --git a/dist/NetboxPS.psm1 b/dist/NetboxPS.psm1 index ba25586..822afb0 100644 --- a/dist/NetboxPS.psm1 +++ b/dist/NetboxPS.psm1 @@ -1,13 +1,13 @@ <# .NOTES -------------------------------------------------------------------------------- - Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.154 - Generated on: 10/18/2018 3:45 PM - Generated by: Ben Claussen + Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Generated on: 3/23/2020 12:17 + Generated by: Claussen Organization: NEOnet -------------------------------------------------------------------------------- .DESCRIPTION - Script generated by PowerShell Studio 2018 + Script generated by PowerShell Studio 2020 #> @@ -247,7 +247,7 @@ function ValidateChoice { [CmdletBinding()] - [OutputType([uint16],[string], [bool])] + [OutputType([uint16], [string], [bool])] param ( [Parameter(Mandatory = $true)] @@ -457,7 +457,8 @@ public enum $EnumName - #endregion + +#endregion #region Invoke-Setup_ps1 <# @@ -629,7 +630,8 @@ public enum $EnumName - #endregion + +#endregion #region Invoke-Extras_ps1 <# @@ -656,145 +658,932 @@ public enum $EnumName InvokeNetboxRequest -URI $uri } - #endregion - -#region Invoke-Circuits_ps1 - <# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 - Created on: 2/28/2018 4:06 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: Circuits.ps1 - =========================================================================== - .DESCRIPTION - Circuit object functions - #> - function Get-NetboxCircuitsChoices { +#endregion + +#region Invoke-ValidateDCIMChoice_ps1 + function ValidateDCIMChoice { <# - .SYNOPSIS - Gets the choices associated with circuits - - .DESCRIPTION - A detailed description of the Get-NetboxCircuitsChoices function. - - .EXAMPLE - PS C:\> Get-NetboxCircuitsChoices - - .NOTES - Additional information about the function. + .SYNOPSIS + Internal function to validate provided values for static choices + + .DESCRIPTION + When users connect to the API, choices for each major object are cached to the config variable. + These values are then utilized to validate if the provided value from a user is valid. + + .PARAMETER ProvidedValue + The value to validate against static choices + + .PARAMETER PowerConnectionStatus + Validate against power connection status values + + .PARAMETER InterfaceTemplateFormFactor + Validate against interface template form factor values + + .PARAMETER InterfaceConnectionStatus + Validate against interface connection status values + + .PARAMETER InterfaceFormFactor + Validate against interface form factor values + + .PARAMETER ConsolePortConnectionStatus + Validate against console port connection status values + + .PARAMETER DeviceStatus + Validate against device status values + + .PARAMETER DeviceFace + Validate against device face values + + .PARAMETER RackType + Validate against rack type values + + .PARAMETER RackWidth + Validate against rack width values. + + .EXAMPLE + PS C:\> ValidateDCIMChoice -ProvidedValue 'rear' -DeviceFace + + .EXAMPLE + PS C:\> ValidateDCIMChoice -ProvidedValue 'middle' -DeviceFace + >> Invalid value middle for device:face. Must be one of: 0, 1, Front, Rear + + .OUTPUTS + This function returns the integer value if valid. Otherwise, it will throw an error. + + .NOTES + Additional information about the function. + + .FUNCTIONALITY + This cmdlet is intended to be used internally and not exposed to the user #> [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices')) - $uri = BuildNewURI -Segments $uriSegments - - InvokeNetboxRequest -URI $uri + [OutputType([uint16])] + param + ( + [Parameter(Mandatory = $true)] + [object]$ProvidedValue, + + [Parameter(ParameterSetName = 'power-port:connection_status', + Mandatory = $true)] + [switch]$PowerConnectionStatus, + + [Parameter(ParameterSetName = 'interface-template:form_factor', + Mandatory = $true)] + [switch]$InterfaceTemplateFormFactor, + + [Parameter(ParameterSetName = 'interface-connection:connection_status', + Mandatory = $true)] + [switch]$InterfaceConnectionStatus, + + [Parameter(ParameterSetName = 'interface:form_factor', + Mandatory = $true)] + [switch]$InterfaceFormFactor, + + [Parameter(ParameterSetName = 'console-port:connection_status', + Mandatory = $true)] + [switch]$ConsolePortConnectionStatus, + + [Parameter(ParameterSetName = 'device:status', + Mandatory = $true)] + [switch]$DeviceStatus, + + [Parameter(ParameterSetName = 'device:face', + Mandatory = $true)] + [switch]$DeviceFace, + + [Parameter(ParameterSetName = 'rack:type', + Mandatory = $true)] + [switch]$RackType, + + [Parameter(ParameterSetName = 'rack:width', + Mandatory = $true)] + [switch]$RackWidth + ) + + ValidateChoice -MajorObject 'DCIM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue + } +#endregion + +#region Invoke-Setup_Support_ps1 + function VerifyAPIConnectivity { + [CmdletBinding()] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck + + InvokeNetboxRequest -URI $uri } - function Get-NetboxCircuit { - <# - .SYNOPSIS - Gets one or more circuits - - .DESCRIPTION - A detailed description of the Get-NetboxCircuit function. - - .PARAMETER CID - Circuit ID - - .PARAMETER InstallDate - Date of installation - - .PARAMETER CommitRate - Committed rate in Kbps - - .PARAMETER Query - A raw search query... As if you were searching the web site - - .PARAMETER Provider - The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs - - .PARAMETER Type - Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs - - .PARAMETER Site - Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs - - .PARAMETER Tenant - Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs - - .PARAMETER Id - Database ID of circuit. This will query for exactly the IDs provided - - .PARAMETER ID__IN - Multiple unique DB IDs to retrieve - - .EXAMPLE - PS C:\> Get-NetboxCircuit - - .NOTES - Additional information about the function. - #> - - [CmdletBinding()] - param - ( - [string]$CID, - - [datetime]$InstallDate, - - [uint32]$CommitRate, - - [string]$Query, - - [object]$Provider, - - [object]$Type, - - [string]$Site, - - [string]$Tenant, - - [uint16[]]$Id - ) - - #TODO: Place script here + function SetupNetboxConfigVariable { + [CmdletBinding()] + param + ( + [switch]$Overwrite + ) + + Write-Verbose "Checking for NetboxConfig hashtable" + if ((-not ($script:NetboxConfig)) -or $Overwrite) { + Write-Verbose "Creating NetboxConfig hashtable" + $script:NetboxConfig = @{ + 'Connected' = $false + 'Choices' = @{ + } + } + } + + Write-Verbose "NetboxConfig hashtable already exists" } - #endregion + + function GetNetboxConfigVariable { + return $script:NetboxConfig + } +#endregion -#region Invoke-Virtualization_ps1 +#region Invoke-Get-NetboxIPAMVLAN_ps1 <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/8/2018 3:59 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/16/2020 16:34 + Created by: Claussen Organization: NEOnet - Filename: Virtualization.ps1 + Filename: Get-NetboxIPAMVLAN.ps1 =========================================================================== .DESCRIPTION - Virtualization object functions + A description of the file. #> - #region GET commands - function Get-NetboxVirtualizationChoices { + function Get-NetboxIPAMVLAN { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [uint16]$VID, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$TenantGroup, + + [uint16]$TenantGroup_Id, + + [object]$Status, + + [string]$Region, + + [string]$Site, + + [uint16]$Site_Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Role, + + [uint16]$Role_Id, + + [switch]$Raw + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + + + + +#endregion + +#region Invoke-New-NetboxIPAMVLAN_ps1 + function New-NetboxIPAMAddress { + <# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$VID, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMRole_ps1 + + function Get-NetboxIPAMRole { + <# + .SYNOPSIS + Get IPAM Prefix/VLAN roles + + .DESCRIPTION + A role indicates the function of a prefix or VLAN. For example, you might define Data, Voice, and Security roles. Generally, a prefix will be assigned the same functional role as the VLAN to which it is assigned (if any). + + .PARAMETER Id + Unique ID + + .PARAMETER Query + Search query + + .PARAMETER Name + Role name + + .PARAMETER Slug + Role URL slug + + .PARAMETER Brief + Brief format + + .PARAMETER Limit + Result limit + + .PARAMETER Offset + Result offset + + .PARAMETER Raw + A description of the Raw parameter. + + .EXAMPLE + PS C:\> Get-NetboxIPAMRole + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + param + ( + [uint16[]]$Id, + + [string]$Query, + + [string]$Name, + + [string]$Slug, + + [switch]$Brief, + + [uint16]$Limit, + + [uint16]$Offset, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMAggregate_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:49 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMAggregate.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxIPAMAggregate { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [datetime]$Date_Added, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$RIR_Id, + + [string]$RIR, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxIPAMAddress_ps1 + function Get-NetboxIPAMAddress { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [object]$Family, + + [uint16[]]$Id, + + [string]$Query, + + [uint16]$Parent, + + [byte]$Mask_Length, + + [string]$VRF, + + [uint16]$VRF_Id, + + [string]$Tenant, + + [uint16]$Tenant_Id, + + [string]$Device, + + [uint16]$Device_ID, + + [string]$Virtual_Machine, + + [uint16]$Virtual_Machine_Id, + + [uint16]$Interface_Id, + + [object]$Status, + + [object]$Role, + + [switch]$Raw + ) + + if ($null -ne $Family) { + $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily + } + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-New-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:51 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxIPAMAddress { + <# + .SYNOPSIS + Create a new IP address to Netbox + + .DESCRIPTION + Create a new IP address to Netbox with a status of Active by default. + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .PARAMETER Status + Status of the IP. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER VRF + VRF ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER NAT_Inside + ID of IP for NAT + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Interface + ID of interface to apply IP + + .PARAMETER Description + Description of IP address + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Address, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-New-NetboxIPAMPrefix_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxIPAMPrefix { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Prefix, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [object]$Role, + + [bool]$IsPool, + + [string]$Description, + + [uint16]$Site, + + [uint16]$VRF, + + [uint16]$VLAN, + + [hashtable]$Custom_Fields, + + [switch]$Raw + ) + + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + + <# + # As of 2018/10/18, this does not appear to be a validated IPAM choice + if ($null -ne $Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole + } + #> + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw + } +#endregion + +#region Invoke-Remove-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:52 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + function Remove-NetboxIPAMAddress { + <# + .SYNOPSIS + Remove an IP address from Netbox + + .DESCRIPTION + Removes/deletes an IP address from Netbox by ID and optional other filters + + .PARAMETER Id + Database ID of the IP address object. + + .PARAMETER Force + Do not confirm. + + .EXAMPLE + PS C:\> Remove-NetboxIPAMAddress -Id $value1 + + .NOTES + Additional information about the function. + #> + + [CmdletBinding(ConfirmImpact = 'High', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [switch]$Force + ) + + begin { + } + + process { + foreach ($IPId in $Id) { + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) { + $URI = BuildNewURI -Segments $Segments + + InvokeNetboxRequest -URI $URI -Method DELETE + } + } + } + + end { + } + } +#endregion + +#region Invoke-Set-NetboxIPAMAddress_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:53 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxIPAMAddress.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxIPAMAddress { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Address, + + [object]$Status, + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Force + ) + + begin { + if ($Status) { + $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + } + + if ($Role) { + $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole + } + } + + process { + foreach ($IPId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + Write-Verbose "Obtaining IPs from ID $IPId" + $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop + + if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + } + } +#endregion + +#region Invoke-Get-NetboxIPAMChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:54 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxIPAMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxIPAMChoices { [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] param () - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', '_choices')) + $uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxTenant_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenant.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxTenant { + [CmdletBinding()] + param + ( + [uint16]$Limit, + + [uint16]$Offset, + + [string]$Name, + + [uint16[]]$Id, + + [string]$Query, + + [string]$Group, + + [uint16]$GroupID, + + [hashtable]$CustomFields, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } +#endregion + +#region Invoke-Get-NetboxTenancyChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 11:56 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxTenancyChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxTenancyChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('tenancy', '_choices')) $uri = BuildNewURI -Segments $uriSegments InvokeNetboxRequest -URI $uri } +#endregion + +#region Invoke-Get-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxVirtualMachine { <# @@ -937,6 +1726,206 @@ public enum $EnumName InvokeNetboxRequest -URI $uri -Raw:$Raw } +#endregion + +#region Invoke-New-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:44 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function New-NetboxVirtualMachine { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Cluster, + + [uint16]$Tenant, + + [object]$Status = 'Active', + + [uint16]$Role, + + [uint16]$Platform, + + [uint16]$vCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [hashtable]$Custom_Fields, + + [string]$Comments + ) + + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters + } +#endregion + +#region Invoke-Set-NetboxVirtualMachine_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:45 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachine.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxVirtualMachine { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16]$Id, + + [string]$Name, + + [uint16]$Role, + + [uint16]$Cluster, + + [object]$Status, + + [uint16]$Platform, + + [uint16]$Primary_IP4, + + [uint16]$Primary_IP6, + + [byte]$VCPUs, + + [uint16]$Memory, + + [uint16]$Disk, + + [uint16]$Tenant, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force + ) + + if ($null -ne $Status) { + $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus + } + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $Id)) + + Write-Verbose "Obtaining VM from ID $Id" + + $CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop + + Write-Verbose "Finished obtaining VM" + + if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } +#endregion + +#region Invoke-Add-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:46 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Add-NetboxVirtualMachineInterface { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string]$Name, + + [Parameter(Mandatory = $true)] + [uint16]$Virtual_Machine, + + [boolean]$Enabled = $true, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) + + $PSBoundParameters.Enabled = $Enabled + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $uri -Method POST -Body $URIComponents.Parameters + } +#endregion + +#region Invoke-Get-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxVirtualMachineInterface { <# @@ -1016,6 +2005,118 @@ public enum $EnumName InvokeNetboxRequest -URI $uri -Raw:$Raw } +#endregion + +#region Invoke-Set-NetboxVirtualMachineInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 12:47 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxVirtualMachineInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Set-NetboxVirtualMachineInterface { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Name, + + [string]$MAC_Address, + + [uint16]$MTU, + + [string]$Description, + + [boolean]$Enabled, + + [uint16]$Virtual_Machine, + + [switch]$Force + ) + + begin { + + } + + process { + foreach ($VMI_ID in $Id) { + Write-Verbose "Obtaining VM Interface..." + $CurrentVMI = Get-NetboxVirtualMachineInterface -Id $VMI_ID -ErrorAction Stop + Write-Verbose "Finished obtaining VM Interface" + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces', $CurrentVMI.Id)) + + if ($Force -or $pscmdlet.ShouldProcess("Interface $($CurrentVMI.Id) on VM $($CurrentVMI.Virtual_Machine.Name)", "Set")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } + } + } + + end { + + } + } +#endregion + +#region Invoke-Get-NetboxVirtualizationChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxVirtualizationChoices { + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', '_choices')) + + $uri = BuildNewURI -Segments $uriSegments + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxVirtualizationCluster_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxVirtualizationCluster.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxVirtualizationCluster { <# @@ -1128,1050 +2229,101 @@ public enum $EnumName InvokeNetboxRequest -URI $uri -Raw:$Raw } - - function Get-NetboxVirtualizationClusterGroup { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [string]$Name, - - [string]$Slug, - - [switch]$Raw - ) - - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) - - $URIParameters = @{} - - foreach ($CmdletParameterName in $PSBoundParameters.Keys) { - if ($CmdletParameterName -in $CommonParameterNames) { - # These are common parameters and should not be appended to the URI - Write-Debug "Skipping parameter $CmdletParameterName" - continue - } - - $URIParameters[$CmdletParameterName.ToLower()] = $PSBoundParameters[$CmdletParameterName] - } - - $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw - } - - #endregion GET commands - - - #region ADD/NEW commands - - function New-NetboxVirtualMachine { - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [string]$Name, - - [Parameter(Mandatory = $true)] - [uint16]$Cluster, - - [uint16]$Tenant, - - [object]$Status = 'Active', - - [uint16]$Role, - - [uint16]$Platform, - - [uint16]$vCPUs, - - [uint16]$Memory, - - [uint16]$Disk, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [hashtable]$Custom_Fields, - - [string]$Comments - ) - - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters - } - - function Add-NetboxVirtualMachineInterface { - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [string]$Name, - - [Parameter(Mandatory = $true)] - [uint16]$Virtual_Machine, - - [boolean]$Enabled = $true, - - [string]$MAC_Address, - - [uint16]$MTU, - - [string]$Description, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces')) - - $PSBoundParameters.Enabled = $Enabled - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $uri -Method POST -Body $URIComponents.Parameters - } - - #endregion ADD commands - - - #region SET commands - - function Set-NetboxVirtualMachine { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16]$Id, - - [string]$Name, - - [uint16]$Role, - - [uint16]$Cluster, - - [object]$Status, - - [uint16]$Platform, - - [uint16]$Primary_IP4, - - [uint16]$Primary_IP6, - - [byte]$VCPUs, - - [uint16]$Memory, - - [uint16]$Disk, - - [uint16]$Tenant, - - [string]$Comments, - - [hashtable]$Custom_Fields, - - [switch]$Force - ) - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $Id)) - - Write-Verbose "Obtaining VM from ID $Id" - - $CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop - - Write-Verbose "Finished obtaining VM" - - if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - - function Set-NetboxVirtualMachineInterface { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Name, - - [string]$MAC_Address, - - [uint16]$MTU, - - [string]$Description, - - [boolean]$Enabled, - - [uint16]$Virtual_Machine, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($VMI_ID in $Id) { - Write-Verbose "Obtaining VM Interface..." - $CurrentVMI = Get-NetboxVirtualMachineInterface -Id $VMI_ID -ErrorAction Stop - Write-Verbose "Finished obtaining VM Interface" - - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'interfaces', $CurrentVMI.Id)) - - if ($Force -or $pscmdlet.ShouldProcess("Interface $($CurrentVMI.Id) on VM $($CurrentVMI.Virtual_Machine.Name)", "Set")) { - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end { - - } - } - - - - #endregion SET commands - - - #region REMOVE commands - - function Remove-NetboxVirtualMachine { - <# - .SYNOPSIS - Delete a virtual machine - - .DESCRIPTION - Deletes a virtual machine from Netbox by ID - - .PARAMETER Id - Database ID of the virtual machine - - .PARAMETER Force - Force deletion without any prompts - - .EXAMPLE - PS C:\> Remove-NetboxVirtualMachine -Id $value1 - - .NOTES - Additional information about the function. - #> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - - } - - process { - foreach ($VMId in $Id) { - $CurrentVM = Get-NetboxVirtualMachine -Id $VMId -ErrorAction Stop - - if ($Force -or $pscmdlet.ShouldProcess("$($CurrentVM.Name)/$($CurrentVM.Id)", "Remove")) { - $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines', $CurrentVM.Id)) - - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - - } - } - - - #endregion REMOVE commands - - - - - - - - - - - - - - - - - - - - - - #endregion +#endregion -#region Invoke-IPAM_ps1 +#region Invoke-ValidateVirtualizationChoice_ps1 <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/10/2018 3:41 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/19/2020 14:12 + Created by: Claussen Organization: NEOnet - Filename: IPAM.ps1 - =========================================================================== - .DESCRIPTION - IPAM Object functions - #> - - function Get-NetboxIPAMChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('ipam', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters - - InvokeNetboxRequest -URI $uri - } - - #region GET commands - - function Get-NetboxIPAMAggregate { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [datetime]$Date_Added, - - [uint16[]]$Id, - - [string]$Query, - - [uint16]$RIR_Id, - - [string]$RIR, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) - - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw - } - - function Get-NetboxIPAMAddress { - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [uint16[]]$Id, - - [string]$Query, - - [uint16]$Parent, - - [byte]$Mask_Length, - - [string]$VRF, - - [uint16]$VRF_Id, - - [string]$Tenant, - - [uint16]$Tenant_Id, - - [string]$Device, - - [uint16]$Device_ID, - - [string]$Virtual_Machine, - - [uint16]$Virtual_Machine_Id, - - [uint16]$Interface_Id, - - [object]$Status, - - [object]$Role, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily - } - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - } - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw - } - - function Get-NetboxIPAMAvailableIP { - <# - .SYNOPSIS - A convenience method for returning available IP addresses within a prefix - - .DESCRIPTION - By default, the number of IPs returned will be equivalent to PAGINATE_COUNT. An arbitrary limit - (up to MAX_PAGE_SIZE, if set) may be passed, however results will not be paginated - - .PARAMETER Prefix_ID - A description of the Prefix_ID parameter. - - .PARAMETER Limit - A description of the Limit parameter. - - .PARAMETER Raw - A description of the Raw parameter. - - .PARAMETER NumberOfIPs - A description of the NumberOfIPs parameter. - - .EXAMPLE - PS C:\> Get-NetboxIPAMAvaiableIP -Prefix_ID $value1 - - .NOTES - Additional information about the function. - #> - - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [Alias('Id')] - [uint16]$Prefix_ID, - - [Alias('NumberOfIPs')] - [uint16]$Limit, - - [switch]$Raw - ) - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID, 'available-ips')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'prefix_id' - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw - } - - function Get-NetboxIPAMPrefix { - <# - .SYNOPSIS - A brief description of the Get-NetboxIPAMPrefix function. - - .DESCRIPTION - A detailed description of the Get-NetboxIPAMPrefix function. - - .PARAMETER Limit - A description of the Limit parameter. - - .PARAMETER Offset - A description of the Offset parameter. - - .PARAMETER Family - A description of the Family parameter. - - .PARAMETER Is_Pool - A description of the Is_Pool parameter. - - .PARAMETER Id - A description of the Id parameter. - - .PARAMETER Query - A description of the Query parameter. - - .PARAMETER Within - Should be a CIDR notation prefix such as '10.0.0.0/16' - - .PARAMETER Within_Include - Should be a CIDR notation prefix such as '10.0.0.0/16' - - .PARAMETER Contains - A description of the Contains parameter. - - .PARAMETER Mask_Length - CIDR mask length value - - .PARAMETER VRF - A description of the VRF parameter. - - .PARAMETER VRF_Id - A description of the VRF_Id parameter. - - .PARAMETER Tenant - A description of the Tenant parameter. - - .PARAMETER Tenant_Id - A description of the Tenant_Id parameter. - - .PARAMETER Site - A description of the Site parameter. - - .PARAMETER Site_Id - A description of the Site_Id parameter. - - .PARAMETER Vlan_VId - A description of the Vlan_VId parameter. - - .PARAMETER Vlan_Id - A description of the Vlan_Id parameter. - - .PARAMETER Status - A description of the Status parameter. - - .PARAMETER Role - A description of the Role parameter. - - .PARAMETER Role_Id - A description of the Role_Id parameter. - - .PARAMETER Raw - A description of the Raw parameter. - - .EXAMPLE - PS C:\> Get-NetboxIPAMPrefix - - .NOTES - Additional information about the function. - #> - - [CmdletBinding()] - param - ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [boolean]$Is_Pool, - - [uint16[]]$Id, - - [string]$Query, - - [string]$Within, - - [string]$Within_Include, - - [string]$Contains, - - [ValidateRange(0, 127)] - [byte]$Mask_Length, - - [string]$VRF, - - [uint16]$VRF_Id, - - [string]$Tenant, - - [uint16]$Tenant_Id, - - [string]$Site, - - [uint16]$Site_Id, - - [string]$Vlan_VId, - - [uint16]$Vlan_Id, - - [object]$Status, - - [string]$Role, - - [uint16]$Role_Id, - - [switch]$Raw - ) - - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily - } - - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus - } - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw - } - - #endregion GET commands - - - #region NEW commands - - function New-NetboxIPAMAddress { - <# - .SYNOPSIS - Create a new IP address to Netbox - - .DESCRIPTION - Create a new IP address to Netbox with a status of Active by default. - - .PARAMETER Address - IP address in CIDR notation: 192.168.1.1/24 - - .PARAMETER Status - Status of the IP. Defaults to Active - - .PARAMETER Tenant - Tenant ID - - .PARAMETER VRF - VRF ID - - .PARAMETER Role - Role such as anycast, loopback, etc... Defaults to nothing - - .PARAMETER NAT_Inside - ID of IP for NAT - - .PARAMETER Custom_Fields - Custom field hash table. Will be validated by the API service - - .PARAMETER Interface - ID of interface to apply IP - - .PARAMETER Description - Description of IP address - - .PARAMETER Raw - Return raw results from API service - - .EXAMPLE - PS C:\> Create-NetboxIPAMAddress - - .NOTES - Additional information about the function. - #> - - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [string]$Address, - - [object]$Status = 'Active', - - [uint16]$Tenant, - - [uint16]$VRF, - - [object]$Role, - - [uint16]$NAT_Inside, - - [hashtable]$Custom_Fields, - - [uint16]$Interface, - - [string]$Description, - - [switch]$Raw - ) - - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw - } - - function New-NetboxIPAMPrefix { - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [string]$Prefix, - - [object]$Status = 'Active', - - [uint16]$Tenant, - - [object]$Role, - - [bool]$IsPool, - - [string]$Description, - - [uint16]$Site, - - [uint16]$VRF, - - [uint16]$VLAN, - - [hashtable]$Custom_Fields, - - [switch]$Raw - ) - - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus - - <# - # As of 2018/10/18, this does not appear to be a validated IPAM choice - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -PrefixRole - } - #> - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw - } - - - #endregion ADD commands - - - #region REMOVE commands - - function Remove-NetboxIPAMAddress { - <# - .SYNOPSIS - Remove an IP address from Netbox - - .DESCRIPTION - Removes/deletes an IP address from Netbox by ID and optional other filters - - .PARAMETER Id - Database ID of the IP address object. - - .PARAMETER Force - Do not confirm. - - .EXAMPLE - PS C:\> Remove-NetboxIPAMAddress -Id $value1 - - .NOTES - Additional information about the function. - #> - - [CmdletBinding(ConfirmImpact = 'High', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [switch]$Force - ) - - begin { - } - - process { - foreach ($IPId in $Id) { - $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - - if ($Force -or $pscmdlet.ShouldProcess($CurrentIP.Address, "Delete")) { - $URI = BuildNewURI -Segments $Segments - - InvokeNetboxRequest -URI $URI -Method DELETE - } - } - } - - end { - } - } - - #endregion REMOVE commands - - - #region SET commands - - function Set-NetboxIPAMAddress { - [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] - param - ( - [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - - [string]$Address, - - [object]$Status, - - [uint16]$Tenant, - - [uint16]$VRF, - - [object]$Role, - - [uint16]$NAT_Inside, - - [hashtable]$Custom_Fields, - - [uint16]$Interface, - - [string]$Description, - - [switch]$Force - ) - - begin { - if ($Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - } - - if ($Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - } - - process{ - foreach ($IPId in $Id) { - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - - Write-Verbose "Obtaining IPs from ID $IPId" - $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop - - if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { - $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH - } - } - } - - end{ - } - } - - #endregion SET commands - - - - - - - - - - #endregion - -#region Invoke-DCIM_ps1 - <# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/22/2018 4:47 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.ps1 + Filename: ValidateVirtualizationChoice.ps1 =========================================================================== .DESCRIPTION A description of the file. #> - function Get-NetboxDCIMChoices { + function ValidateVirtualizationChoice { + <# + .SYNOPSIS + Internal function to verify provided values for static choices + + .DESCRIPTION + When users connect to the API, choices for each major object are cached to the config variable. + These values are then utilized to verify if the provided value from a user is valid. + + .PARAMETER ProvidedValue + The value to validate against static choices + + .PARAMETER AggregateFamily + Verify against aggregate family values + + .PARAMETER PrefixFamily + Verify against prefix family values + + .PARAMETER PrefixStatus + Verify against prefix status values + + .PARAMETER IPAddressFamily + Verify against ip-address family values + + .PARAMETER IPAddressStatus + Verify against ip-address status values + + .PARAMETER IPAddressRole + Verify against ip-address role values + + .PARAMETER VLANStatus + Verify against VLAN status values + + .PARAMETER ServiceProtocol + Verify against service protocol values + + .EXAMPLE + PS C:\> VerifyIPAMChoices -ProvidedValue 'loopback' -IPAddressRole + + .EXAMPLE + PS C:\> VerifyIPAMChoices -ProvidedValue 'Loopback' -IPAddressFamily + >> Invalid value Loopback for ip-address:family. Must be one of: 4, 6, IPv4, IPv6 + + .FUNCTIONALITY + This cmdlet is intended to be used internally and not exposed to the user + + .OUTPUT + This function returns nothing if the value is valid. Otherwise, it will throw an error. + #> + [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('dcim', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters - - InvokeNetboxRequest -URI $uri - } - - - #region GET commands - - function Get-NetboxDCIMPlatform { - [CmdletBinding()] - [OutputType([pscustomobject])] param ( - [uint16]$Limit, + [Parameter(Mandatory = $true)] + [object]$ProvidedValue, - [uint16]$Offset, - - [Parameter(ParameterSetName = 'ById')] - [uint16[]]$Id, - - [string]$Name, - - [string]$Slug, - - [uint16]$Manufacturer_Id, - - [string]$Manufacturer, - - [switch]$Raw + [Parameter(ParameterSetName = 'virtual-machine:status', + Mandatory = $true)] + [switch]$VirtualMachineStatus ) - switch ($PSCmdlet.ParameterSetName) { - 'ById' { - foreach ($PlatformID in $Id) { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms', $PlatformID)) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw - } - - break - } - - default { - $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' - - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $URI -Raw:$Raw - } - } + ValidateChoice -MajorObject 'Virtualization' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue } - - #endregion GET commands - - - - #region NEW/ADD commands - - #endregion NEW/ADD commands - - - - #region SET commands - - #endregion SET commands - - - - #region REMOVE commands - - #endregion REMOVE commands - - - - - - - - - - #endregion +#endregion -#region Invoke-DCIM_Devices_ps1 +#region Invoke-Get-NetboxDCIMDevice_ps1 <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/25/2018 2:52 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:06 + Created by: Claussen Organization: NEOnet - Filename: DCIM.Devices.ps1 + Filename: Get-NetboxDCIMDevice.ps1 =========================================================================== .DESCRIPTION A description of the file. #> - #region GET commands function Get-NetboxDCIMDevice { [CmdletBinding()] @@ -2258,6 +2410,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Raw:$Raw } +#endregion + +#region Invoke-Get-NetboxDCIMDeviceType_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceType.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxDCIMDeviceType { [CmdletBinding()] @@ -2306,6 +2474,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Raw:$Raw } +#endregion + +#region Invoke-Get-NetboxDCIMDeviceRole_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:07 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMDeviceRole.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxDCIMDeviceRole { [CmdletBinding()] @@ -2355,11 +2539,22 @@ public enum $EnumName } } } +#endregion + +#region Invoke-New-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #endregion GET commands - - - #region NEW commands function New-NetboxDCIMDevice { [CmdletBinding()] @@ -2437,11 +2632,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST } +#endregion + +#region Invoke-Set-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #endregion NEW commands - - - #region SET commands function Set-NetboxDCIMDevice { [CmdletBinding(SupportsShouldProcess = $true)] @@ -2525,11 +2731,23 @@ public enum $EnumName } } - #endregion SET commands +#endregion + +#region Invoke-Remove-NetboxDCIMDevice_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:08 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMDevice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #region REMOVE commands - function Remove-NetboxDCIMDevice { <# .SYNOPSIS @@ -2584,24 +2802,22 @@ public enum $EnumName } } - - #endregion REMOVE commands#endregion +#endregion -#region Invoke-DCIM_Interfaces_ps1 +#region Invoke-Get-NetboxDCIMInterface_ps1 <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/25/2018 2:57 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:09 + Created by: Claussen Organization: NEOnet - Filename: DCIM.Interfaces.ps1 + Filename: Get-NetboxDCIMInterface.ps1 =========================================================================== .DESCRIPTION A description of the file. #> - #region GET Commands function Get-NetboxDCIMInterface { [CmdletBinding()] @@ -2650,6 +2866,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Raw:$Raw } +#endregion + +#region Invoke-Get-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Get-NetboxDCIMInterfaceConnection { [CmdletBinding()] @@ -2683,11 +2915,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Raw:$Raw } +#endregion + +#region Invoke-Add-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #endregion GET Commands - - - #region ADD/NEW commands function Add-NetboxDCIMInterface { [CmdletBinding()] @@ -2759,6 +3002,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST } +#endregion + +#region Invoke-Add-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:10 + Created by: Claussen + Organization: NEOnet + Filename: Add-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Add-NetboxDCIMInterfaceConnection { <# @@ -2813,11 +3072,22 @@ public enum $EnumName InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method POST } +#endregion + +#region Invoke-Set-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #endregion ADD/NEW commands - - - #region SET Commands function Set-NetboxDCIMInterface { [CmdletBinding()] @@ -2903,6 +3173,22 @@ public enum $EnumName } } +#endregion + +#region Invoke-Set-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Set-NetboxDCIMInterfaceConnection { <# @@ -2982,11 +3268,22 @@ public enum $EnumName } } +#endregion + +#region Invoke-Remove-NetboxDCIMInterface_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:11 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterface.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> - #endregion SET Commands - - - #region REMOVE commands function Remove-NetboxDCIMInterface { <# @@ -3042,6 +3339,22 @@ public enum $EnumName } } +#endregion + +#region Invoke-Remove-NetboxDCIMInterfaceConnection_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:12 + Created by: Claussen + Organization: NEOnet + Filename: Remove-NetboxDCIMInterfaceConnection.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + function Remove-NetboxDCIMInterfaceConnection { [CmdletBinding(ConfirmImpact = 'High', @@ -3080,391 +3393,229 @@ public enum $EnumName } } - - #endregion REMOVE commands - - #endregion +#endregion -#region Invoke-Tenancy_ps1 +#region Invoke-Get-NetboxDCIMPlatform_ps1 <# .NOTES =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/29/2018 1:45 PM - Created by: Ben Claussen + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen Organization: NEOnet - Filename: Tenancy.ps1 + Filename: Get-NetboxDCIMPlatform.ps1 =========================================================================== .DESCRIPTION A description of the file. #> - function Get-NetboxTenancyChoices { - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('tenancy', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments - - InvokeNetboxRequest -URI $uri - } - - - #region GET commands - - function Get-NetboxTenant { + + function Get-NetboxDCIMPlatform { [CmdletBinding()] + [OutputType([pscustomobject])] param ( [uint16]$Limit, [uint16]$Offset, - [string]$Name, - + [Parameter(ParameterSetName = 'ById')] [uint16[]]$Id, - [string]$Query, + [string]$Name, - [string]$Group, + [string]$Slug, - [uint16]$GroupID, + [uint16]$Manufacturer_Id, - [hashtable]$CustomFields, + [string]$Manufacturer, [switch]$Raw ) - $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants')) - - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - - InvokeNetboxRequest -URI $uri -Raw:$Raw + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($PlatformID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms', $PlatformID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'platforms')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Raw' + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } } - - #endregion GET commands - - - #region SET commands - - #endregion SET commands - - - #region ADD/NEW commands - - #endregion ADD/NEW commands - - - #region REMOVE commands - - #endregion REMOVE commands#endregion +#endregion -#region Invoke-DCIM_Support_ps1 - function ValidateDCIMChoice { - <# - .SYNOPSIS - Internal function to validate provided values for static choices - - .DESCRIPTION - When users connect to the API, choices for each major object are cached to the config variable. - These values are then utilized to validate if the provided value from a user is valid. - - .PARAMETER ProvidedValue - The value to validate against static choices - - .PARAMETER PowerConnectionStatus - Validate against power connection status values - - .PARAMETER InterfaceTemplateFormFactor - Validate against interface template form factor values - - .PARAMETER InterfaceConnectionStatus - Validate against interface connection status values - - .PARAMETER InterfaceFormFactor - Validate against interface form factor values - - .PARAMETER ConsolePortConnectionStatus - Validate against console port connection status values - - .PARAMETER DeviceStatus - Validate against device status values - - .PARAMETER DeviceFace - Validate against device face values - - .PARAMETER RackType - Validate against rack type values - - .PARAMETER RackWidth - Validate against rack width values. - - .EXAMPLE - PS C:\> ValidateDCIMChoice -ProvidedValue 'rear' -DeviceFace - - .EXAMPLE - PS C:\> ValidateDCIMChoice -ProvidedValue 'middle' -DeviceFace - >> Invalid value middle for device:face. Must be one of: 0, 1, Front, Rear - - .OUTPUTS - This function returns the integer value if valid. Otherwise, it will throw an error. - - .NOTES - Additional information about the function. - - .FUNCTIONALITY - This cmdlet is intended to be used internally and not exposed to the user +#region Invoke-Get-NetboxDCIMChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:13 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. #> - - [CmdletBinding()] - [OutputType([uint16])] - param - ( - [Parameter(Mandatory = $true)] - [object]$ProvidedValue, - - [Parameter(ParameterSetName = 'power-port:connection_status', - Mandatory = $true)] - [switch]$PowerConnectionStatus, - - [Parameter(ParameterSetName = 'interface-template:form_factor', - Mandatory = $true)] - [switch]$InterfaceTemplateFormFactor, - - [Parameter(ParameterSetName = 'interface-connection:connection_status', - Mandatory = $true)] - [switch]$InterfaceConnectionStatus, - - [Parameter(ParameterSetName = 'interface:form_factor', - Mandatory = $true)] - [switch]$InterfaceFormFactor, - - [Parameter(ParameterSetName = 'console-port:connection_status', - Mandatory = $true)] - [switch]$ConsolePortConnectionStatus, - - [Parameter(ParameterSetName = 'device:status', - Mandatory = $true)] - [switch]$DeviceStatus, - - [Parameter(ParameterSetName = 'device:face', - Mandatory = $true)] - [switch]$DeviceFace, - - [Parameter(ParameterSetName = 'rack:type', - Mandatory = $true)] - [switch]$RackType, - - [Parameter(ParameterSetName = 'rack:width', - Mandatory = $true)] - [switch]$RackWidth - ) - - ValidateChoice -MajorObject 'DCIM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue - }#endregion - -#region Invoke-IPAM_Support_ps1 - function ValidateIPAMChoice { - <# - .SYNOPSIS - Internal function to verify provided values for static choices - - .DESCRIPTION - When users connect to the API, choices for each major object are cached to the config variable. - These values are then utilized to verify if the provided value from a user is valid. - - .PARAMETER ProvidedValue - The value to validate against static choices - - .PARAMETER AggregateFamily - Verify against aggregate family values - - .PARAMETER PrefixFamily - Verify against prefix family values - - .PARAMETER PrefixStatus - Verify against prefix status values - - .PARAMETER IPAddressFamily - Verify against ip-address family values - - .PARAMETER IPAddressStatus - Verify against ip-address status values - - .PARAMETER IPAddressRole - Verify against ip-address role values - - .PARAMETER VLANStatus - Verify against VLAN status values - - .PARAMETER ServiceProtocol - Verify against service protocol values - - .EXAMPLE - PS C:\> ValidateIPAMChoice -ProvidedValue 'loopback' -IPAddressRole - - .EXAMPLE - PS C:\> ValidateIPAMChoice -ProvidedValue 'Loopback' -IPAddressFamily - >> Invalid value Loopback for ip-address:family. Must be one of: 4, 6, IPv4, IPv6 - - .OUTPUTS - This function returns the integer value if valid. Otherwise, it will throw an error. - - .NOTES - Additional information about the function. - - .FUNCTIONALITY - This cmdlet is intended to be used internally and not exposed to the user - #> - - [CmdletBinding(DefaultParameterSetName = 'service:protocol')] - [OutputType([uint16])] - param - ( - [Parameter(Mandatory = $true)] - [object]$ProvidedValue, - - [Parameter(ParameterSetName = 'aggregate:family', - Mandatory = $true)] - [switch]$AggregateFamily, - - [Parameter(ParameterSetName = 'prefix:family', - Mandatory = $true)] - [switch]$PrefixFamily, - - [Parameter(ParameterSetName = 'prefix:status', - Mandatory = $true)] - [switch]$PrefixStatus, - - [Parameter(ParameterSetName = 'ip-address:family', - Mandatory = $true)] - [switch]$IPAddressFamily, - - [Parameter(ParameterSetName = 'ip-address:status', - Mandatory = $true)] - [switch]$IPAddressStatus, - - [Parameter(ParameterSetName = 'ip-address:role', - Mandatory = $true)] - [switch]$IPAddressRole, - - [Parameter(ParameterSetName = 'vlan:status', - Mandatory = $true)] - [switch]$VLANStatus, - - [Parameter(ParameterSetName = 'service:protocol', - Mandatory = $true)] - [switch]$ServiceProtocol - ) - - ValidateChoice -MajorObject 'IPAM' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue - } - #endregion - -#region Invoke-Virtualization_Support_ps1 - function ValidateVirtualizationChoice { - <# - .SYNOPSIS - Internal function to verify provided values for static choices - - .DESCRIPTION - When users connect to the API, choices for each major object are cached to the config variable. - These values are then utilized to verify if the provided value from a user is valid. - - .PARAMETER ProvidedValue - The value to validate against static choices - - .PARAMETER AggregateFamily - Verify against aggregate family values - - .PARAMETER PrefixFamily - Verify against prefix family values - - .PARAMETER PrefixStatus - Verify against prefix status values - - .PARAMETER IPAddressFamily - Verify against ip-address family values - - .PARAMETER IPAddressStatus - Verify against ip-address status values - - .PARAMETER IPAddressRole - Verify against ip-address role values - - .PARAMETER VLANStatus - Verify against VLAN status values - - .PARAMETER ServiceProtocol - Verify against service protocol values - - .EXAMPLE - PS C:\> VerifyIPAMChoices -ProvidedValue 'loopback' -IPAddressRole - - .EXAMPLE - PS C:\> VerifyIPAMChoices -ProvidedValue 'Loopback' -IPAddressFamily - >> Invalid value Loopback for ip-address:family. Must be one of: 4, 6, IPv4, IPv6 - - .FUNCTIONALITY - This cmdlet is intended to be used internally and not exposed to the user - - .OUTPUT - This function returns nothing if the value is valid. Otherwise, it will throw an error. - #> - - [CmdletBinding()] - param - ( - [Parameter(Mandatory = $true)] - [object]$ProvidedValue, - - [Parameter(ParameterSetName = 'virtual-machine:status', - Mandatory = $true)] - [switch]$VirtualMachineStatus - ) - - ValidateChoice -MajorObject 'Virtualization' -ChoiceName $PSCmdlet.ParameterSetName -ProvidedValue $ProvidedValue - }#endregion - -#region Invoke-Setup_Support_ps1 - function VerifyAPIConnectivity { + + + function Get-NetboxDCIMChoices { [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] param () - $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) + $uriSegments = [System.Collections.ArrayList]::new(@('dcim', '_choices')) - $uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck + $uri = BuildNewURI -Segments $uriSegments -Parameters $Parameters + + InvokeNetboxRequest -URI $uri + } +#endregion + +#region Invoke-Get-NetboxCircuitsChoices_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitsChoices.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxCircuitsChoices { + <# + .SYNOPSIS + Gets the choices associated with circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuitsChoices function. + + .EXAMPLE + PS C:\> Get-NetboxCircuitsChoices + + .NOTES + Additional information about the function. + #> + + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "These are literally 'choices' in Netbox")] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('circuits', '_choices')) + $uri = BuildNewURI -Segments $uriSegments InvokeNetboxRequest -URI $uri } - function SetupNetboxConfigVariable { +#endregion + +#region Invoke-Get-NetboxCircuit_ps1 + <# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/23/2020 12:15 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuit.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. + #> + + + function Get-NetboxCircuit { + <# + .SYNOPSIS + Gets one or more circuits + + .DESCRIPTION + A detailed description of the Get-NetboxCircuit function. + + .PARAMETER CID + Circuit ID + + .PARAMETER InstallDate + Date of installation + + .PARAMETER CommitRate + Committed rate in Kbps + + .PARAMETER Query + A raw search query... As if you were searching the web site + + .PARAMETER Provider + The name or ID of the provider. Provide either [string] or [int]. String will search provider names, integer will search database IDs + + .PARAMETER Type + Type of circuit. Provide either [string] or [int]. String will search provider type names, integer will search database IDs + + .PARAMETER Site + Location/site of circuit. Provide either [string] or [int]. String will search site names, integer will search database IDs + + .PARAMETER Tenant + Tenant assigned to circuit. Provide either [string] or [int]. String will search tenant names, integer will search database IDs + + .PARAMETER Id + Database ID of circuit. This will query for exactly the IDs provided + + .PARAMETER ID__IN + Multiple unique DB IDs to retrieve + + .EXAMPLE + PS C:\> Get-NetboxCircuit + + .NOTES + Additional information about the function. + #> + [CmdletBinding()] param ( - [switch]$Overwrite + [string]$CID, + + [datetime]$InstallDate, + + [uint32]$CommitRate, + + [string]$Query, + + [object]$Provider, + + [object]$Type, + + [string]$Site, + + [string]$Tenant, + + [uint16[]]$Id ) - Write-Verbose "Checking for NetboxConfig hashtable" - if ((-not ($script:NetboxConfig)) -or $Overwrite) { - Write-Verbose "Creating NetboxConfig hashtable" - $script:NetboxConfig = @{ - 'Connected' = $false - 'Choices' = @{ - } - } - } - - Write-Verbose "NetboxConfig hashtable already exists" + #TODO: Place script here } - - function GetNetboxConfigVariable { - return $script:NetboxConfig - }#endregion +#endregion # Build a list of common paramters so we can omit them to build URI parameters $script:CommonParameterNames = New-Object System.Collections.ArrayList diff --git a/dist/Tests/DCIM.Devices.Tests.ps1 b/dist/Tests/DCIM.Devices.Tests.ps1 deleted file mode 100644 index 8a9e22f..0000000 --- a/dist/Tests/DCIM.Devices.Tests.ps1 +++ /dev/null @@ -1,512 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/22/2018 4:48 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Tests.ps1 - =========================================================================== - .DESCRIPTION - DCIM tests. -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe -Name "DCIM Devices Tests" -Tag 'DCIM', 'Devices' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - $script:NetboxConfig.Choices.DCIM = (Get-Content "$PSScriptRoot\DCIMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "Get-NetboxDCIMDevice" -Fixture { - It "Should request the default number of devices" { - $Result = Get-NetboxDCIMDevice - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDevice -Limit 10 -Offset 100 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxDCIMDevice -Query 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?q=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxDCIMDevice -Query 'test device' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?q=test+device' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxDCIMDevice -Name 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?name=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxDCIMDevice -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a device by ID from the pipeline" { - $Result = [pscustomobject]@{ - 'id' = 10 - } | Get-NetboxDCIMDevice - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxDCIMDevice -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a status" { - $Result = Get-NetboxDCIMDevice -Status 'Active' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?status=1' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should throw for an invalid status" { - { - Get-NetboxDCIMDevice -Status 'Fake' - } | Should -Throw - } - - It "Should request devices that are a PDU" { - $Result = Get-NetboxDCIMDevice -Is_PDU $True - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/devices/?is_pdu=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxDCIMDeviceType" -Fixture { - It "Should request the default number of devices types" { - $Result = Get-NetboxDCIMDeviceType - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDeviceType -Limit 10 -Offset 100 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxDCIMDeviceType -Query 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?q=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxDCIMDeviceType -Query 'test device' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?q=test+device' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a slug" { - $Result = Get-NetboxDCIMDeviceType -Slug 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?slug=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxDCIMDeviceType -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxDCIMDeviceType -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a device type that is PDU" { - $Result = Get-NetboxDCIMDeviceType -Is_PDU $true - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?is_pdu=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxDCIMDeviceRole" -Fixture { - It "Should request the default number of devices types" { - $Result = Get-NetboxDCIMDeviceRole - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a device role by Id" { - $Result = Get-NetboxDCIMDeviceRole -Id 10 - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request multiple roles by Id" { - $Result = Get-NetboxDCIMDeviceRole -Id 10, 12 - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET', 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/10/', 'https://netbox.domain.com/api/dcim/device-roles/12/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should request single role by Id and color" { - $Result = Get-NetboxDCIMDeviceRole -Id 10 -Color '0fab12' - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/10/?color=0fab12' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request multiple roles by Id and color" { - $Result = Get-NetboxDCIMDeviceRole -Id 10, 12 -Color '0fab12' - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET', 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/10/?color=0fab12', 'https://netbox.domain.com/api/dcim/device-roles/12/?color=0fab12' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDeviceRole -Limit 10 -Offset 100 - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a slug" { - $Result = Get-NetboxDCIMDeviceRole -Slug 'testdevice' - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?slug=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxDCIMDeviceRole -Name 'TestRole' - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?name=TestRole' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request those that are VM role" { - $Result = Get-NetboxDCIMDeviceRole -VM_Role $true - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?vm_role=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "New-NetboxDCIMDevice" -Fixture { - It "Should create a new device" { - $Result = New-NetboxDCIMDevice -Name "newdevice" -Device_Role 4 -Device_Type 10 -Site 1 -Face 0 - - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"site":1,"face":0,"name":"newdevice","status":1,"device_type":10,"device_role":4}' - } - - It "Should throw because of an invalid status" { - { - New-NetboxDCIMDevice -Name "newdevice" -Device_Role 4 -Device_Type 10 -Site 1 -Status 5555 - } | Should -Throw - } - } - - - Mock -CommandName "Get-NetboxDCIMDevice" -ModuleName NetboxPS -MockWith { - return [pscustomobject]@{ - 'Id' = $Id - 'Name' = $Name - } - } - - Context -Name "Set-NetboxDCIMDevice" -Fixture { - It "Should set a device to a new name" { - $Result = Set-NetboxDCIMDevice -Id 1234 -Name 'newtestname' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"name":"newtestname"}' - } - - It "Should set a device with new properties" { - $Result = Set-NetboxDCIMDevice -Id 1234 -Name 'newtestname' -Cluster 10 -Platform 20 -Site 15 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"cluster":10,"platform":20,"name":"newtestname","site":15}' - } - - It "Should set multiple devices with new properties" { - $Result = Set-NetboxDCIMDevice -Id 1234, 3214 -Cluster 10 -Platform 20 -Site 15 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/1234/', 'https://netbox.domain.com/api/dcim/devices/3214/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"cluster":10,"platform":20,"site":15}', '{"cluster":10,"platform":20,"site":15}' - } - - It "Should set multiple devices with new properties from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'id' = 4432 - }, - [pscustomobject]@{ - 'id' = 3241 - } - ) | Set-NetboxDCIMDevice -Cluster 10 -Platform 20 -Site 15 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/4432/', 'https://netbox.domain.com/api/dcim/devices/3241/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"cluster":10,"platform":20,"site":15}', '{"cluster":10,"platform":20,"site":15}' - } - } - - Context -Name "Remove-NetboxDCIMDevice" -Fixture { - It "Should remove a device" { - $Result = Remove-NetboxDCIMDevice -Id 10 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove multiple devices" { - $Result = Remove-NetboxDCIMDevice -Id 10, 12 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/', 'https://netbox.domain.com/api/dcim/devices/12/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should remove a device from the pipeline" { - $Result = Get-NetboxDCIMDevice -Id 20 | Remove-NetboxDCIMDevice -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/20/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove mulitple devices from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 30 - }, - [pscustomobject]@{ - 'Id' = 40 - } - ) | Remove-NetboxDCIMDevice -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMDevice' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/devices/30/', 'https://netbox.domain.com/api/dcim/devices/40/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/Tests/DCIM.Interfaces.Tests.ps1 b/dist/Tests/DCIM.Interfaces.Tests.ps1 deleted file mode 100644 index b903e08..0000000 --- a/dist/Tests/DCIM.Interfaces.Tests.ps1 +++ /dev/null @@ -1,505 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/24/2018 10:50 AM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Interfaces.Tests.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe -Name "DCIM Interfaces Tests" -Tag 'DCIM', 'Interfaces' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - $script:NetboxConfig.Choices.DCIM = (Get-Content "$PSScriptRoot\DCIMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "Get-NetboxDCIMInterface" -Fixture { - It "Should request the default number of interfaces" { - $Result = Get-NetboxDCIMInterface - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMInterface -Limit 10 -Offset 100 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with enabled" { - $Result = Get-NetboxDCIMInterface -Enabled $true - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/?enabled=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a form factor name" { - $Result = Get-NetboxDCIMInterface -Form_Factor '10GBASE-T (10GE)' - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/?form_factor=1150' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should throw for an invalid form factor" { - { - Get-NetboxDCIMInterface -Form_Factor 'Fake' - } | Should -Throw - } - - It "Should request devices that are mgmt only" { - $Result = Get-NetboxDCIMInterface -MGMT_Only $True - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/?mgmt_only=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request an interface from the pipeline" { - $Result = [pscustomobject]@{ - 'Id' = 1234 - } | Get-NetboxDCIMInterface - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Add-NetboxDCIMInterface" -Fixture { - It "Should add a basic interface to a device" { - $Result = Add-NetboxDCIMInterface -Device 111 -Name "TestInterface" - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"name":"TestInterface","device":111}' - } - - It "Should add an interface to a device with lots of properties" { - $paramAddNetboxDCIMInterface = @{ - Device = 123 - Name = "TestInterface" - Form_Factor = '10GBASE-T (10GE)' - MTU = 9000 - MGMT_Only = $true - Description = 'Test Description' - Mode = 'Access' - } - - $Result = Add-NetboxDCIMInterface @paramAddNetboxDCIMInterface - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"mtu":9000,"mgmt_only":true,"description":"Test Description","mode":100,"name":"TestInterface","device":123,"form_factor":1150}' - } - - It "Should add an interface with multiple tagged VLANs" { - $Result = Add-NetboxDCIMInterface -Device 444 -Name "TestInterface" -Mode 'Tagged' -Tagged_VLANs 1, 2, 3, 4 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"mode":200,"name":"TestInterface","device":444,"tagged_vlans":[1,2,3,4]}' - } - - It "Should throw for invalid mode" { - { - Add-NetboxDCIMInterface -Device 321 -Name "Test123" -Mode 'Fake' - } | Should -Throw - } - - It "Should throw for out of range VLAN" { - { - Add-NetboxDCIMInterface -Device 321 -Name "Test123" -Untagged_VLAN 4100 - } | Should -Throw - } - } - - - Mock -CommandName "Get-NetboxDCIMInterface" -ModuleName "NetboxPS" -MockWith { - return [pscustomobject]@{ - 'Id' = $Id - } - } - - Context -Name "Set-NetboxDCIMInterface" -Fixture { - It "Should set an interface to a new name" { - $Result = Set-NetboxDCIMInterface -Id 123 -Name "TestInterface" - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 1 -Exactly -Scope 'It' - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/123/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"name":"TestInterface"}' - } - - It "Should set multiple interfaces to a new name" { - $Result = Set-NetboxDCIMInterface -Id 456, 789 -Name "TestInterface" - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/456/', 'https://netbox.domain.com/api/dcim/interfaces/789/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"name":"TestInterface"}', '{"name":"TestInterface"}' - } - - It "Should set multiple interfaces to a new name from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 1234 - }, - [pscustomobject]@{ - 'Id' = 4231 - } - ) | Set-NetboxDCIMInterface -Name "TestInterface" - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interfaces/1234/', 'https://netbox.domain.com/api/dcim/interfaces/4231/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"name":"TestInterface"}', '{"name":"TestInterface"}' - } - - It "Should throw for invalid form factor" { - { - Set-NetboxDCIMInterface -Id 1234 -Form_Factor 'fake' - } | Should -Throw - } - } - - Context -Name "Remove-NetboxDCIMInterface" -Fixture { - It "Should remove an interface" { - $Result = Remove-NetboxDCIMInterface -Id 10 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove multiple interfaces" { - $Result = Remove-NetboxDCIMInterface -Id 10, 12 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/10/', 'https://netbox.domain.com/api/dcim/interfaces/12/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should remove an interface from the pipeline" { - $Result = Get-NetboxDCIMInterface -Id 20 | Remove-NetboxDCIMInterface -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/20/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove mulitple interfaces from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 30 - }, - [pscustomobject]@{ - 'Id' = 40 - } - ) | Remove-NetboxDCIMInterface -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterface' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interfaces/30/', 'https://netbox.domain.com/api/dcim/interfaces/40/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - - - Context -Name "Get-NetboxDCIMInterfaceConnection" -Fixture { - It "Should request the default number of interface connections" { - $Result = Get-NetboxDCIMInterfaceConnection - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMInterfaceConnection -Limit 10 -Offset 100 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request connected interfaces" { - $Result = Get-NetboxDCIMInterfaceConnection -Connection_Status 'Connected' - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/?connection_status=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should throw for an invalid connection status" { - { - Get-NetboxDCIMInterfaceConnection -Connection_Status 'Fake' - } | Should -Throw - } - } - - Context -Name "Add-NetboxDCIMInterfaceConnection" -Fixture { - It "Should add a new interface connection" { - $Result = Add-NetboxDCIMInterfaceConnection -Interface_A 21 -Interface_B 22 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"interface_b":22,"interface_a":21}' - } - - It "Should throw because of an invalid connection status" { - { - Add-NetboxDCIMInterfaceConnection -Interface_A 21 -Interface_B 22 -Connection_Status 'fake' - } | Should -Throw - } - } - - - Mock -CommandName "Get-NetboxDCIMInterfaceConnection" -ModuleName 'NetboxPS' -MockWith { - [pscustomobject]@{ - 'Id' = $Id - } - } - - Context -Name "Set-NetboxDCIMInterfaceConnection" -Fixture { - It "Should set an interface connection" { - $Result = Set-NetboxDCIMInterfaceConnection -Id 123 -Interface_B 2 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/123/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"interface_b":2}' - } - - It "Should set multiple interface connections to a new status" { - $Result = Set-NetboxDCIMInterfaceConnection -Id 456, 789 -Connection_Status 'Planned' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/456/', 'https://netbox.domain.com/api/dcim/interface-connections/789/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"connection_status":false}', '{"connection_status":false}' - } - - It "Should set an interface connection from the pipeline" { - $Result = [pscustomobject]@{ - 'id' = 3 - } | Set-NetboxDCIMInterfaceConnection -Connection_Status 'Planned' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/3/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"connection_status":false}' - } - - It "Should set multiple interface connections from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'id' = 456 - }, - [pscustomobject]@{ - 'id' = 789 - } - ) | Set-NetboxDCIMInterfaceConnection -Connection_Status 'Planned' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/interface-connections/456/', 'https://netbox.domain.com/api/dcim/interface-connections/789/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"connection_status":false}', '{"connection_status":false}' - } - - It "Should throw trying to set multiple connections to the same interface" { - { - Set-NetboxDCIMInterfaceConnection -Id 456, 789 -Interface_B 22 -Force - } | Should -Throw -ExpectedMessage "Cannot set multiple connections to the same interface" - } - } - - Context -Name "Remove-NetboxDCIMInterfaceConnection" -Fixture { - It "Should remove an interface connection" { - $Result = Remove-NetboxDCIMInterfaceConnection -Id 10 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterfaceConnection' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove multiple interface connections" { - $Result = Remove-NetboxDCIMInterfaceConnection -Id 10, 12 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterfaceConnection' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/10/', 'https://netbox.domain.com/api/dcim/interface-connections/12/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should remove an interface connection from the pipeline" { - $Result = Get-NetboxDCIMInterfaceConnection -Id 20 | Remove-NetboxDCIMInterfaceConnection -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterfaceConnection' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/20/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove mulitple interface connections from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 30 - }, - [pscustomobject]@{ - 'Id' = 40 - } - ) | Remove-NetboxDCIMInterfaceConnection -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxDCIMInterfaceConnection' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/dcim/interface-connections/30/', 'https://netbox.domain.com/api/dcim/interface-connections/40/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - } -} - - - - - - - - - - - - - - - - - diff --git a/dist/Tests/DCIM.Platforms.Tests.ps1 b/dist/Tests/DCIM.Platforms.Tests.ps1 deleted file mode 100644 index a909bc6..0000000 --- a/dist/Tests/DCIM.Platforms.Tests.ps1 +++ /dev/null @@ -1,121 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/25/2018 1:03 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Platforms.Tests.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe -Name "DCIM Platforms Tests" -Tag 'DCIM', 'platforms' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - Context -Name "Get-NetboxDCIMPlatform" -Fixture { - It "Should request the default number of platforms" { - $Result = Get-NetboxDCIMPlatform - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/platforms/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMPlatform -Limit 10 -Offset 100 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/platforms/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a platform name" { - $Result = Get-NetboxDCIMPlatform -Name "Windows Server 2016" - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/platforms/?name=Windows+Server+2016' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a platform by manufacturer" { - $Result = Get-NetboxDCIMPlatform -Manufacturer 'Cisco' - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/platforms/?manufacturer=Cisco' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a platform by ID" { - $Result = Get-NetboxDCIMPlatform -Id 10 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/platforms/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request multiple platforms by ID" { - $Result = Get-NetboxDCIMPlatform -Id 10, 20 - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Invoke-RestMethod' -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET', 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/platforms/10/', 'https://netbox.domain.com/api/dcim/platforms/20/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - } -} - - - - diff --git a/dist/Tests/DCIM.Tests.ps1 b/dist/Tests/DCIM.Tests.ps1 deleted file mode 100644 index a5eb14a..0000000 --- a/dist/Tests/DCIM.Tests.ps1 +++ /dev/null @@ -1,315 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.152 - Created on: 5/22/2018 4:48 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: DCIM.Tests.ps1 - =========================================================================== - .DESCRIPTION - DCIM tests. -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe -Name "DCIM Tests" -Tag 'DCIM' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - $script:NetboxConfig.Choices.DCIM = (Get-Content "$PSScriptRoot\DCIMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "Get-NetboxDCIMDevice" -Fixture { - It "Should request the default number of devices" { - $Result = Get-NetboxDCIMDevice - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDevice -Limit 10 -Offset 100 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxDCIMDevice -Query 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?q=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxDCIMDevice -Query 'test device' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?q=test+device' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxDCIMDevice -Name 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?name=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxDCIMDevice -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxDCIMDevice -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a status" { - $Result = Get-NetboxDCIMDevice -Status 'Active' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/devices/?status=1' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should throw for an invalid status" { - { - Get-NetboxDCIMDevice -Status 'Fake' - } | Should -Throw - } - - It "Should request devices that are a PDU" { - $Result = Get-NetboxDCIMDevice -Is_PDU $True - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -BeExactly 'https://netbox.domain.com/api/dcim/devices/?is_pdu=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxDCIMDeviceType" -Fixture { - It "Should request the default number of devices types" { - $Result = Get-NetboxDCIMDeviceType - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDeviceType -Limit 10 -Offset 100 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxDCIMDeviceType -Query 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?q=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxDCIMDeviceType -Query 'test device' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?q=test+device' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a slug" { - $Result = Get-NetboxDCIMDeviceType -Slug 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?slug=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxDCIMDeviceType -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxDCIMDeviceType -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a device type that is PDU" { - $Result = Get-NetboxDCIMDeviceType -Is_PDU $true - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-types/?is_pdu=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxDCIMDeviceRole" -Fixture { - It "Should request the default number of devices types" { - $Result = Get-NetboxDCIMDeviceRole - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Invoke-RestMethod" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxDCIMDeviceRole -Limit 10 -Offset 100 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?offset=100&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a slug" { - $Result = Get-NetboxDCIMDeviceRole -Slug 'testdevice' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?slug=testdevice' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxDCIMDeviceRole -Name 'TestRole' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?name=TestRole' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request those that are VM role" { - $Result = Get-NetboxDCIMDeviceRole -VM_Role $true - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/dcim/device-roles/?vm_role=True' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/Tests/Helpers.Tests.ps1 b/dist/Tests/Helpers.Tests.ps1 deleted file mode 100644 index 26ea592..0000000 --- a/dist/Tests/Helpers.Tests.ps1 +++ /dev/null @@ -1,744 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/8/2018 11:36 AM - Created by: Ben Claussen - Organization: NEOnet - Filename: Helpers.Tests.ps1 - =========================================================================== - .DESCRIPTION - Helper functions Pester tests -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe "Helpers tests" -Tag 'Core', 'Helpers' -Fixture { - It "Should throw because we are not connected" { - { - Check-NetboxIsConnected - } | Should -Throw - } - - Mock -CommandName 'CheckNetboxIsConnected' -MockWith { - return $true - } -ModuleName 'NetboxPS' - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - Context -Name "Building URIBuilder" -Fixture { - It "Should give a basic URI object" { - BuildNewURI -HostName 'netbox.domain.com' | Should -BeOfType [System.UriBuilder] - } - - It "Should generate a URI using only a supplied hostname" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" - $URIBuilder.Host | Should -BeExactly 'netbox.domain.com' - $URIBuilder.Path | Should -BeExactly 'api//' - $URIBuilder.Scheme | Should -Be 'https' - $URIBuilder.Port | Should -Be 443 - $URIBuilder.URI.AbsoluteUri | Should -Be 'https://netbox.domain.com/api//' - } - - It "Should generate a URI using a hostname and segments" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - $URIBuilder.Host | Should -BeExactly 'netbox.domain.com' - $URIBuilder.Path | Should -BeExactly 'api/seg1/seg2/' - $URIBuilder.URI.AbsoluteUri | Should -BeExactly 'https://netbox.domain.com/api/seg1/seg2/' - } - - It "Should generate a URI using insecure HTTP and default to port 80" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' -HTTPS $false -WarningAction 'SilentlyContinue' - $URIBuilder.Scheme | Should -Be 'http' - $URIBuilder.Port | Should -Be 80 - $URIBuilder.URI.AbsoluteURI | Should -Be 'http://netbox.domain.com/api/seg1/seg2/' - } - - It "Should generate a URI using HTTPS on port 1234" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' -Port 1234 - $URIBuilder.Scheme | Should -Be 'https' - $URIBuilder.Port | Should -Be 1234 - $URIBuilder.URI.AbsoluteURI | Should -BeExactly 'https://netbox.domain.com:1234/api/seg1/seg2/' - } - - It "Should generate a URI using HTTP on port 4321" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' -HTTPS $false -Port 4321 -WarningAction 'SilentlyContinue' - $URIBuilder.Scheme | Should -Be 'http' - $URIBuilder.Port | Should -Be 4321 - $URIBuilder.URI.AbsoluteURI | Should -BeExactly 'http://netbox.domain.com:4321/api/seg1/seg2/' - } - - It "Should generate a URI with parameters" { - $URIParameters = @{ - 'param1' = 'paramval1' - 'param2' = 'paramval2' - } - - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' -Parameters $URIParameters - $URIBuilder.Query | Should -BeExactly '?param1=paramval1¶m2=paramval2' - $URIBuilder.URI.AbsoluteURI | Should -BeExactly 'https://netbox.domain.com/api/seg1/seg2/?param1=paramval1¶m2=paramval2' - } - } - - Context -Name "Building URI components" -Fixture { - It "Should give a basic hashtable" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{'param1' = 1} - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2") - $URIComponents.Parameters.Count | Should -BeExactly 1 - $URIComponents.Parameters | Should -BeOfType [hashtable] - $URIComponents.Parameters['param1'] | Should -Be 1 - } - - It "Should add a single ID parameter to the segments" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{'id' = 123} - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2", '123') - $URIComponents.Parameters.Count | Should -BeExactly 0 - $URIComponents.Parameters | Should -BeOfType [hashtable] - } - - It "Should add multiple IDs to the parameters id__in" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{'id' = "123", "456"} - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2") - $URIComponents.Parameters.Count | Should -BeExactly 1 - $URIComponents.Parameters | Should -BeOfType [hashtable] - $URIComponents.Parameters['id__in'] | Should -Be '123,456' - } - - It "Should skip a particular parameter name" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{'param1' = 1; 'param2' = 2} -SkipParameterByName 'param2' - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2") - $URIComponents.Parameters.Count | Should -BeExactly 1 - $URIComponents.Parameters | Should -BeOfType [hashtable] - $URIComponents.Parameters['param1'] | Should -Be 1 - $URIComponents.Parameters['param2'] | Should -BeNullOrEmpty - } - - It "Should add a query (q) parameter" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{'query' = 'mytestquery'} - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2") - $URIComponents.Parameters.Count | Should -BeExactly 1 - $URIComponents.Parameters | Should -BeOfType [hashtable] - $URIComponents.Parameters['q'] | Should -Be 'mytestquery' - } - - It "Should generate custom field parameters" { - $URIComponents = BuildURIComponents -URISegments @('segment1', 'segment2') -ParametersDictionary @{ - 'CustomFields' = @{ - 'PRTG_Id' = 1234 - 'Customer_Id' = 'abc' - } - } - - $URIComponents | Should -BeOfType [hashtable] - $URIComponents.Keys.Count | Should -BeExactly 2 - $URIComponents.Keys | Should -Be @("Segments", "Parameters") - $URIComponents.Segments | Should -Be @("segment1", "segment2") - $URIComponents.Parameters.Count | Should -BeExactly 2 - $URIComponents.Parameters | Should -BeOfType [hashtable] - $URIComponents.Parameters['cf_prtg_id'] | Should -Be '1234' - $URIComponents.Parameters['cf_customer_id'] | Should -Be 'abc' - } - } - - Context -Name "Invoking request tests" -Fixture { - Mock -CommandName 'Invoke-RestMethod' -Verifiable -MockWith { - # Return an object of the items we would normally pass to Invoke-RestMethod - return [pscustomobject]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - 'results' = 'Only results' - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - It "Should return direct results instead of the raw request" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - - $Result = InvokeNetboxRequest -URI $URIBuilder - - Assert-VerifiableMock - - $Result | Should -BeOfType [string] - $Result | Should -BeExactly "Only results" - } - - It "Should generate a basic request" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - - $Result = InvokeNetboxRequest -URI $URIBuilder -Raw - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be $URIBuilder.Uri.AbsoluteUri - $Result.Headers | Should -BeOfType [System.Collections.HashTable] - $Result.Headers.Authorization | Should -Be "Token faketoken" - $Result.Timeout | Should -Be 5 - $Result.ContentType | Should -Be 'application/json' - $Result.Body | Should -Be $null # We did not supply a body - } - - It "Should generate a POST request with body" { - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - - $Result = InvokeNetboxRequest -URI $URIBuilder -Method POST -Body @{ - 'bodyparam1' = 'val1' - } -Raw - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Body | Should -Be '{"bodyparam1":"val1"}' - } - - It "Should generate a POST request with an extra header" { - $Headers = @{ - 'Connection' = 'keep-alive' - } - - $Body = @{ - 'bodyparam1' = 'val1' - } - - $URIBuilder = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - - $Result = InvokeNetboxRequest -URI $URIBuilder -Method POST -Body $Body -Headers $Headers -Raw - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Body | Should -Be '{"bodyparam1":"val1"}' - $Result.Headers.Count | Should -BeExactly 2 - $Result.Headers.Authorization | Should -Be "Token faketoken" - $Result.Headers.Connection | Should -Be "keep-alive" - } - - It "Should throw because of an invalid method" { - { - $URI = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - InvokeNetboxRequest -URI $URI -Method 'Fake' - } | Should -Throw - } - - It "Should throw because of an out-of-range timeout" { - { - $URI = BuildNewURI -Hostname "netbox.domain.com" -Segments 'seg1', 'seg2' - InvokeNetboxRequest -URI $URI -Timeout 61 - } | Should -Throw - } - } - - Context -Name "Validating choices" -Fixture { - Context -Name "Virtualization choices" -Fixture { - $MajorObject = 'Virtualization' - $script:NetboxConfig.Choices.Virtualization = (Get-Content "$PSScriptRoot\VirtualizationChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - It "Should return a valid integer for status when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName 'virtual-machine:status' -ProvidedValue 'Active' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should return a valid integer for status when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName 'virtual-machine:status' -ProvidedValue 0 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 0 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName 'virtual-machine:status' -ProvidedValue 'Fake' - } | Should -Throw - } - } - - Context -Name "IPAM choices" -Fixture { - $MajorObject = 'IPAM' - $script:NetboxConfig.Choices.IPAM = (Get-Content "$PSScriptRoot\IPAMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "aggregate:family" -Fixture { - $ChoiceName = 'aggregate:family' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'IPv4' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 4 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 0 - } | Should -Throw - } - } - - Context -Name "prefix:family" { - $ChoiceName = 'prefix:family' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'IPv4' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 4 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 0 - } | Should -Throw - } - } - - Context -Name "prefix:status" { - $ChoiceName = 'prefix:status' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Active' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 10 - } | Should -Throw - } - } - - Context -Name "ip-address:family" { - $ChoiceName = 'ip-address:family' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'IPv4' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 4 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 4 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 10 - } | Should -Throw - } - } - - Context -Name "ip-address:status" { - $ChoiceName = 'ip-address:status' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Active' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 10 - } | Should -Throw - } - } - - Context -Name "ip-address:role" { - $ChoiceName = 'ip-address:role' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Anycast' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 30 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 30 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 30 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1 - } | Should -Throw - } - } - - Context -Name "vlan:status" { - $ChoiceName = 'vlan:status' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Active' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 0 - } | Should -Throw - } - } - - Context -Name "service:protocol" { - $ChoiceName = 'service:protocol' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'TCP' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 6 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 6 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 6 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 0 - } | Should -Throw - } - } - } - - Context -Name "DCIM choices" -Fixture { - $MajorObject = 'DCIM' - $script:NetboxConfig.Choices.DCIM = (Get-Content "$PSScriptRoot\DCIMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "device:face" -Fixture { - $ChoiceName = 'device:face' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Front' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 0 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "device:status" -Fixture { - $ChoiceName = 'device:status' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Active' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 0 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 0 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "console-port:connection_status" -Fixture { - $ChoiceName = 'console-port:connection_status' - - It "Should return a valid string when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Planned' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a string" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'false' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a boolean" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue $true - - $Result | Should -BeOfType [bool] - $Result | Should -Be $true - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "interface:form_factor" -Fixture { - $ChoiceName = 'interface:form_factor' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue '10GBASE-CX4 (10GE)' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1170 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1500 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1500 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "interface-connection:connection_status" -Fixture { - $ChoiceName = 'interface-connection:connection_status' - - It "Should return a valid string when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Planned' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a string" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'false' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a boolean" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue $true - - $Result | Should -BeOfType [bool] - $Result | Should -Be $true - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "interface-template:form_factor" -Fixture { - $ChoiceName = 'interface-template:form_factor' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue '10GBASE-CX4 (10GE)' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1170 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 1500 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 1500 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "power-port:connection_status" -Fixture { - $ChoiceName = 'power-port:connection_status' - - It "Should return a valid string when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'Planned' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a string" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'false' - - $Result | Should -BeOfType [bool] - $Result | Should -Be $false - } - - It "Should return a valid string when provided a boolean" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue $true - - $Result | Should -BeOfType [bool] - $Result | Should -Be $true - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "rack:type" -Fixture { - $ChoiceName = 'rack:type' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue '2-post frame' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 100 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 300 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 300 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - - Context -Name "rack:width" -Fixture { - $ChoiceName = 'rack:width' - - It "Should return a valid integer when provided a name" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue '19 inches' - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 19 - } - - It "Should return a valid integer when provided an integer" { - $Result = ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 23 - - $Result | Should -BeOfType [uint16] - $Result | Should -BeExactly 23 - } - - It "Should throw because of an invalid choice" { - { - ValidateChoice -MajorObject $MajorObject -ChoiceName $ChoiceName -ProvidedValue 'fake' - } | Should -Throw - } - } - } - } - } -} - - - - - - - - - - - - - - diff --git a/dist/Tests/IPAM.Tests.ps1 b/dist/Tests/IPAM.Tests.ps1 deleted file mode 100644 index 73fa4f4..0000000 --- a/dist/Tests/IPAM.Tests.ps1 +++ /dev/null @@ -1,573 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/10/2018 3:41 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: IPAM.Tests.ps1 - =========================================================================== - .DESCRIPTION - IPAM Pester tests -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - - -Describe -Name "IPAM tests" -Tag 'Ipam' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - $script:NetboxConfig.Choices.IPAM = (Get-Content "$PSScriptRoot\IPAMChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "Get-NetboxIPAMAggregate" -Fixture { - It "Should request the default number of aggregates" { - $Result = Get-NetboxIPAMAggregate - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with limit and offset" { - $Result = Get-NetboxIPAMAggregate -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a query" { - $Result = Get-NetboxIPAMAggregate -Query '10.10.0.0' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/?q=10.10.0.0' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with an escaped query" { - $Result = Get-NetboxIPAMAggregate -Query 'my aggregate' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/?q=my+aggregate' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a single ID" { - $Result = Get-NetboxIPAMAggregate -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxIPAMAggregate -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/aggregates/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - } - - Context -Name "Get-NetboxIPAMAddress" -Fixture { - It "Should request the default number of addresses" { - $Result = Get-NetboxIPAMAddress - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with limit and offset" { - $Result = Get-NetboxIPAMAddress -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a query" { - $Result = Get-NetboxIPAMAddress -Query '10.10.10.10' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?q=10.10.10.10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with an escaped query" { - $Result = Get-NetboxIPAMAddress -Query 'my ip address' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?q=my+ip+address' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a single ID" { - $Result = Get-NetboxIPAMAddress -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxIPAMAddress -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a family number" { - $Result = Get-NetboxIPAMAddress -Family 4 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?family=4' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a family name" { - $Result = Get-NetboxIPAMAddress -Family 'IPv4' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/?family=4' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxIPAMAvailableIP" -Fixture { - It "Should request the default number of available IPs" { - $Result = Get-NetboxIPAMAvailableIP -Prefix_Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/10/available-ips/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request 10 available IPs" { - $Result = Get-NetboxIPAMAvailableIP -Prefix_Id 1504 -NumberOfIPs 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/1504/available-ips/?limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - } - - Context -Name "Get-NetboxIPAMPrefix" -Fixture { - It "Should request the default number of prefixes" { - $Result = Get-NetboxIPAMPrefix - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with limit and offset" { - $Result = Get-NetboxIPAMPrefix -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a query" { - $Result = Get-NetboxIPAMPrefix -Query '10.10.10.10' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?q=10.10.10.10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with an escaped query" { - $Result = Get-NetboxIPAMPrefix -Query 'my ip address' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?q=my+ip+address' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with a single ID" { - $Result = Get-NetboxIPAMPrefix -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxIPAMPrefix -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with VLAN vID" { - $Result = Get-NetboxIPAMPrefix -VLAN_VID 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?vlan_vid=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should request with family of 4" { - $Result = Get-NetboxIPAMPrefix -Family 4 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?family=4' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - - It "Should throw because the mask length is too large" { - { - Get-NetboxIPAMPrefix -Mask_length 128 - } | Should -Throw - } - - It "Should throw because the mask length is too small" { - { - Get-NetboxIPAMPrefix -Mask_length -1 - } | Should -Throw - } - - It "Should not throw because the mask length is just right" { - { - Get-NetboxIPAMPrefix -Mask_length 24 - } | Should -Not -Throw - } - - It "Should request with mask length 24" { - $Result = Get-NetboxIPAMPrefix -Mask_length 24 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/?mask_length=24' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Headers.Authorization | Should -Be "Token faketoken" - } - } - - Context -Name "New-NetboxIPAMPrefix" -Fixture { - It "Should create a basic prefix" { - $Result = New-NetboxIPAMPrefix -Prefix "10.0.0.0/24" - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.URI | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"prefix":"10.0.0.0/24","status":1}' - } - - It "Should create a prefix with a status and role names" { - $Result = New-NetboxIPAMPrefix -Prefix "10.0.0.0/24" -Status 'Active' -Role 'Active' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.URI | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"prefix":"10.0.0.0/24","status":1,"role":"Active"}' - } - - It "Should create a prefix with a status, role name, and tenant ID" { - $Result = New-NetboxIPAMPrefix -Prefix "10.0.0.0/24" -Status 'Active' -Role 'Active' -Tenant 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.URI | Should -Be 'https://netbox.domain.com/api/ipam/prefixes/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"prefix":"10.0.0.0/24","status":1,"tenant":15,"role":"Active"}' - } - } - - Context -Name "New-NetboxIPAMAddress" -Fixture { - It "Should create a basic IP address" { - $Result = New-NetboxIPAMAddress -Address '10.0.0.1/24' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"status":1,"address":"10.0.0.1/24"}' - } - - It "Should create an IP with a status and role names" { - $Result = New-NetboxIPAMAddress -Address '10.0.0.1/24' -Status 'Reserved' -Role 'Anycast' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"status":2,"address":"10.0.0.1/24","role":30}' - } - - It "Should create an IP with a status and role values" { - $Result = New-NetboxIPAMAddress -Address '10.0.1.1/24' -Status '1' -Role '10' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"status":1,"address":"10.0.1.1/24","role":10}' - } - } - - Context -Name "Remove-NetboxIPAMAddress" -Fixture { - Mock -CommandName "Get-NetboxIPAMAddress" -ModuleName NetboxPS -MockWith { - return @{ - 'address' = "10.1.1.1/$Id" - 'id' = $id - } - } - - It "Should remove a single IP" { - $Result = Remove-NetboxIPAMAddress -Id 4109 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'DELETE' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4109/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be $null - } - - It "Should remove a single IP from the pipeline" { - $Result = [pscustomobject]@{ - 'id' = 4110 - } | Remove-NetboxIPAMAddress -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'DELETE' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4110/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be $null - } - - It "Should remove multiple IPs" { - $Result = Remove-NetboxIPAMAddress -Id 4109, 4110 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4109/', 'https://netbox.domain.com/api/ipam/ip-addresses/4110/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should remove multiple IPs from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'id' = 4109 - }, - [pscustomobject]@{ - 'id' = 4110 - } - ) | Remove-NetboxIPAMAddress -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4109/', 'https://netbox.domain.com/api/ipam/ip-addresses/4110/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - - Context -Name "Set-NetboxIPAMAddress" -Fixture { - Mock -CommandName "Get-NetboxIPAMAddress" -ModuleName NetboxPS -MockWith { - return @{ - 'address' = '10.1.1.1/24' - 'id' = $id - } - } - - It "Should set an IP with a new status" { - $Result = Set-NetboxIPAMAddress -Id 4109 -Status 2 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 1 -Scope "It" -Exactly - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4109/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"status":2}' - } - - It "Should set an IP from the pipeline" { - $Result = [pscustomobject]@{ - 'Id' = 4501 - } | Set-NetboxIPAMAddress -VRF 10 -Tenant 14 -Description 'Test description' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 1 -Scope "It" -Exactly - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4501/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"vrf":10,"description":"Test description","tenant":14}' - } - - It "Should set mulitple IPs to a new status" { - $Result = Set-NetboxIPAMAddress -Id 4109, 4555 -Status 2 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 2 -Scope "It" -Exactly - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4109/', 'https://netbox.domain.com/api/ipam/ip-addresses/4555/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"status":2}', '{"status":2}' - } - - It "Should set an IP with VRF, Tenant, and Description" { - $Result = Set-NetboxIPAMAddress -Id 4110 -VRF 10 -Tenant 14 -Description 'Test description' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 1 -Scope "It" -Exactly - - $Result.Method | Should -Be 'PATCH' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4110/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"vrf":10,"description":"Test description","tenant":14}' - } - - It "Should set multiple IPs from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 4501 - }, - [pscustomobject]@{ - 'Id' = 4611 - } - ) | Set-NetboxIPAMAddress -Status 2 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName "Get-NetboxIPAMAddress" -Times 2 -Scope "It" -Exactly - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/ipam/ip-addresses/4501/', 'https://netbox.domain.com/api/ipam/ip-addresses/4611/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"status":2}', '{"status":2}' - } - } - } -} - - - - - - - - - - diff --git a/dist/Tests/IPAMChoices.json b/dist/Tests/IPAMChoices.json deleted file mode 100644 index 3e05e53..0000000 --- a/dist/Tests/IPAMChoices.json +++ /dev/null @@ -1 +0,0 @@ -{"aggregate:family":[{"label":"IPv4","value":4},{"label":"IPv6","value":6}],"prefix:family":[{"label":"IPv4","value":4},{"label":"IPv6","value":6}],"prefix:status":[{"label":"Container","value":0},{"label":"Active","value":1},{"label":"Reserved","value":2},{"label":"Deprecated","value":3}],"ip-address:family":[{"label":"IPv4","value":4},{"label":"IPv6","value":6}],"ip-address:status":[{"label":"Active","value":1},{"label":"Reserved","value":2},{"label":"Deprecated","value":3},{"label":"DHCP","value":5}],"ip-address:role":[{"label":"Loopback","value":10},{"label":"Secondary","value":20},{"label":"Anycast","value":30},{"label":"VIP","value":40},{"label":"VRRP","value":41},{"label":"HSRP","value":42},{"label":"GLBP","value":43},{"label":"CARP","value":44}],"vlan:status":[{"label":"Active","value":1},{"label":"Reserved","value":2},{"label":"Deprecated","value":3}],"service:protocol":[{"label":"TCP","value":6},{"label":"UDP","value":17}]} \ No newline at end of file diff --git a/dist/Tests/Virtualization.Tests.ps1 b/dist/Tests/Virtualization.Tests.ps1 deleted file mode 100644 index 327060a..0000000 --- a/dist/Tests/Virtualization.Tests.ps1 +++ /dev/null @@ -1,543 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.150 - Created on: 5/8/2018 4:01 PM - Created by: Ben Claussen - Organization: NEOnet - Filename: Virtualization.Tests.ps1 - =========================================================================== - .DESCRIPTION - Virtualization Pester tests -#> - -Import-Module Pester -Remove-Module NetboxPS -Force -ErrorAction SilentlyContinue - -$ModulePath = "$PSScriptRoot\..\dist\NetboxPS.psd1" - -if (Test-Path $ModulePath) { - Import-Module $ModulePath -ErrorAction Stop -} - -Describe -Name "Virtualization tests" -Tag 'Virtualization' -Fixture { - Mock -CommandName 'CheckNetboxIsConnected' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return $true - } - - Mock -CommandName 'Invoke-RestMethod' -Verifiable -ModuleName 'NetboxPS' -MockWith { - # Return a hashtable of the items we would normally pass to Invoke-RestMethod - return [ordered]@{ - 'Method' = $Method - 'Uri' = $Uri - 'Headers' = $Headers - 'Timeout' = $Timeout - 'ContentType' = $ContentType - 'Body' = $Body - } - } - - Mock -CommandName 'Get-NetboxCredential' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return [PSCredential]::new('notapplicable', (ConvertTo-SecureString -String "faketoken" -AsPlainText -Force)) - } - - Mock -CommandName 'Get-NetboxHostname' -Verifiable -ModuleName 'NetboxPS' -MockWith { - return 'netbox.domain.com' - } - - InModuleScope -ModuleName 'NetboxPS' -ScriptBlock { - $script:NetboxConfig.Choices.Virtualization = (Get-Content "$PSScriptRoot\VirtualizationChoices.json" -ErrorAction Stop | ConvertFrom-Json) - - Context -Name "Get-NetboxVirtualMachine" -Fixture { - It "Should request the default number of VMs" { - $Result = Get-NetboxVirtualMachine - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with limit and offset" { - $Result = Get-NetboxVirtualMachine -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxVirtualMachine -Query 'testvm' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?q=testvm' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxVirtualMachine -Query 'test vm' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?q=test+vm' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxVirtualMachine -Name 'testvm' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?name=testvm' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxVirtualMachine -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxVirtualMachine -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a status" { - $Result = Get-NetboxVirtualMachine -Status 'Active' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/?status=1' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should throw for an invalid status" { - { Get-NetboxVirtualMachine -Status 'Fake' } | Should -Throw - } - } - - Context -Name "Get-NetboxVirtualMachineInterface" -Fixture { - It "Should request the default number of interfaces" { - $Result = Get-NetboxVirtualMachineInterface - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a limit and offset" { - $Result = Get-NetboxVirtualMachineInterface -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a interface with a specific ID" { - $Result = Get-NetboxVirtualMachineInterface -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request a name" { - $Result = Get-NetboxVirtualMachineInterface -Name 'Ethernet0' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/?name=Ethernet0' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a VM ID" { - $Result = Get-NetboxVirtualMachineInterface -Virtual_Machine_Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/?virtual_machine_id=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with Enabled" { - $Result = Get-NetboxVirtualMachineInterface -Enabled $true - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/?enabled=true' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxVirtualMachineCluster" -Fixture { - It "Should request the default number of clusters" { - $Result = Get-NetboxVirtualizationCluster - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with limit and offset" { - $Result = Get-NetboxVirtualizationCluster -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a query" { - $Result = Get-NetboxVirtualizationCluster -Query 'testcluster' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/?q=testcluster' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with an escaped query" { - $Result = Get-NetboxVirtualizationCluster -Query 'test cluster' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/?q=test+cluster' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxVirtualizationCluster -Name 'testcluster' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/?name=testcluster' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a single ID" { - $Result = Get-NetboxVirtualizationCluster -Id 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/10/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with multiple IDs" { - $Result = Get-NetboxVirtualizationCluster -Id 10, 12, 15 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/clusters/?id__in=10,12,15' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "Get-NetboxVirtualMachineClusterGroup" -Fixture { - It "Should request the default number of cluster groups" { - $Result = Get-NetboxVirtualizationClusterGroup - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/cluster-groups/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with limit and offset" { - $Result = Get-NetboxVirtualizationClusterGroup -Limit 10 -Offset 12 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/cluster-groups/?offset=12&limit=10' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a name" { - $Result = Get-NetboxVirtualizationClusterGroup -Name 'testclustergroup' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/cluster-groups/?name=testclustergroup' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should request with a slug" { - $Result = Get-NetboxVirtualizationClusterGroup -Slug 'test-cluster-group' - - Assert-VerifiableMock - - $Result.Method | Should -Be 'GET' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/cluster-groups/?slug=test-cluster-group' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - } - - Context -Name "New-NetboxVirtualMachine" -Fixture { - It "Should create a basic VM" { - $Result = New-NetboxVirtualMachine -Name 'testvm' -Cluster 1 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"cluster":1,"name":"testvm","status":1}' - } - - It "Should create a VM with CPUs, Memory, Disk, tenancy, and comments" { - $Result = New-NetboxVirtualMachine -Name 'testvm' -Cluster 1 -Status Active -vCPUs 4 -Memory 4096 -Tenant 11 -Disk 50 -Comments "these are comments" - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"tenant":11,"comments":"these are comments","disk":50,"memory":4096,"name":"testvm","cluster":1,"status":1,"vcpus":4}' - } - - It "Should throw because of an invalid status" { - { New-NetboxVirtualMachine -Name 'testvm' -Status 1123 -Cluster 1 } | Should -Throw - } - } - - Context -Name "Add-NetboxVirtualMachineInterface" -Fixture { - It "Should add a basic interface" { - $Result = Add-NetboxVirtualMachineInterface -Name 'Ethernet0' -Virtual_Machine 10 - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"virtual_machine":10,"name":"Ethernet0","enabled":true}' - } - - It "Should add an interface with a MAC, MTU, and Description" { - $Result = Add-NetboxVirtualMachineInterface -Name 'Ethernet0' -Virtual_Machine 10 -Mac_Address '11:22:33:44:55:66' -MTU 1500 -Description "Test description" - - Assert-VerifiableMock - - $Result.Method | Should -Be 'POST' - $Result.Uri | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"mtu":1500,"description":"Test description","enabled":true,"virtual_machine":10,"name":"Ethernet0","mac_address":"11:22:33:44:55:66"}' - } - } - - - Mock -CommandName "Get-NetboxVirtualMachine" -ModuleName NetboxPS -MockWith { - return [pscustomobject]@{ - 'Id' = $Id - 'Name' = $Name - } - } - - Context -Name "Set-NetboxVirtualMachine" -Fixture { - It "Should set a VM to a new name" { - $Result = Set-NetboxVirtualMachine -Id 1234 -Name 'newtestname' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"name":"newtestname"}' - } - - It "Should set a VM with a new name, cluster, platform, and status" { - $Result = Set-NetboxVirtualMachine -Id 1234 -Name 'newtestname' -Cluster 10 -Platform 15 -Status 'Offline' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"cluster":10,"platform":15,"name":"newtestname","status":0}' - } - - It "Should throw because of an invalid status" { - { Set-NetboxVirtualMachine -Id 1234 -Status 'Fake' -Force } | Should -Throw - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 0 -Exactly -Scope 'It' - } - } - - - Mock -CommandName "Get-NetboxVirtualMachineInterface" -ModuleName NetboxPS -MockWith { - return [pscustomobject]@{ - 'Id' = $Id - 'Name' = $Name - } - } - - Context -Name "Set-NetboxVirtualMachineInterface" -Fixture { - It "Should set an interface to a new name" { - $Result = Set-NetboxVirtualMachineInterface -Id 1234 -Name 'newtestname' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName Get-NetboxVirtualMachineInterface -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"name":"newtestname"}' - } - - It "Should set an interface to a new name, MTU, MAC address and description" { - $paramSetNetboxVirtualMachineInterface = @{ - Id = 1234 - Name = 'newtestname' - MAC_Address = '11:22:33:44:55:66' - MTU = 9000 - Description = "Test description" - Force = $true - } - - $Result = Set-NetboxVirtualMachineInterface @paramSetNetboxVirtualMachineInterface - - Assert-VerifiableMock - Assert-MockCalled -CommandName Get-NetboxVirtualMachineInterface -Times 1 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/1234/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - $Result.Body | Should -Be '{"mac_address":"11:22:33:44:55:66","mtu":9000,"description":"Test description","name":"newtestname"}' - } - - It "Should set multiple interfaces to a new name" { - $Result = Set-NetboxVirtualMachineInterface -Id 1234, 4321 -Name 'newtestname' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName Get-NetboxVirtualMachineInterface -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/1234/', 'https://netbox.domain.com/api/virtualization/interfaces/4321/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"name":"newtestname"}', '{"name":"newtestname"}' - } - - It "Should set multiple interfaces to a new name from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 4123 - }, - [pscustomobject]@{ - 'Id' = 4321 - } - ) | Set-NetboxVirtualMachineInterface -Name 'newtestname' -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName Get-NetboxVirtualMachineInterface -Times 2 -Scope 'It' -Exactly - - $Result.Method | Should -Be 'PATCH', 'PATCH' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/interfaces/4123/', 'https://netbox.domain.com/api/virtualization/interfaces/4321/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - $Result.Body | Should -Be '{"name":"newtestname"}', '{"name":"newtestname"}' - } - } - - Context -Name "Remove-NetboxVirtualMachine" -Fixture { - It "Should remove a single VM" { - $Result = Remove-NetboxVirtualMachine -Id 4125 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 1 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/4125/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove mulitple VMs" { - $Result = Remove-NetboxVirtualMachine -Id 4125, 4132 -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/4125/', 'https://netbox.domain.com/api/virtualization/virtual-machines/4132/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - - It "Should remove a VM from the pipeline" { - $Result = Get-NetboxVirtualMachine -Id 4125 | Remove-NetboxVirtualMachine -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/4125/' - $Result.Headers.Keys.Count | Should -BeExactly 1 - } - - It "Should remove multiple VMs from the pipeline" { - $Result = @( - [pscustomobject]@{ - 'Id' = 4125 - }, - [pscustomobject]@{ - 'Id' = 4132 - } - ) | Remove-NetboxVirtualMachine -Force - - Assert-VerifiableMock - Assert-MockCalled -CommandName 'Get-NetboxVirtualMachine' -Times 2 -Exactly -Scope 'It' - - $Result.Method | Should -Be 'DELETE', 'DELETE' - $Result.URI | Should -Be 'https://netbox.domain.com/api/virtualization/virtual-machines/4125/', 'https://netbox.domain.com/api/virtualization/virtual-machines/4132/' - $Result.Headers.Keys.Count | Should -BeExactly 2 - } - } - } -} - - - - - - - - - - diff --git a/dist/Tests/VirtualizationChoices.json b/dist/Tests/VirtualizationChoices.json deleted file mode 100644 index 235ed6c..0000000 --- a/dist/Tests/VirtualizationChoices.json +++ /dev/null @@ -1 +0,0 @@ -{"virtual-machine:status":[{"label":"Active","value":1},{"label":"Offline","value":0},{"label":"Staged","value":3}]} \ No newline at end of file