From c9077abd515af167f38398f9391e7381b59ebb6f Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 1 May 2020 09:49:51 -0400 Subject: [PATCH 01/27] Add `OPTIONS` method validation --- Functions/Helpers/InvokeNetboxRequest.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Functions/Helpers/InvokeNetboxRequest.ps1 b/Functions/Helpers/InvokeNetboxRequest.ps1 index 0f2d7fb..ef5d31e 100644 --- a/Functions/Helpers/InvokeNetboxRequest.ps1 +++ b/Functions/Helpers/InvokeNetboxRequest.ps1 @@ -27,7 +27,7 @@ function InvokeNetboxRequest { [ValidateRange(0, 60)] [uint16]$Timeout = 5, - [ValidateSet('GET', 'PATCH', 'PUT', 'POST', 'DELETE', IgnoreCase = $true)] + [ValidateSet('GET', 'PATCH', 'PUT', 'POST', 'DELETE', 'OPTIONS', IgnoreCase = $true)] [string]$Method = 'GET', [switch]$Raw From 657a8405bc3f827e3156bc23293516b01dd6166c Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 4 May 2020 12:36:46 -0400 Subject: [PATCH 02/27] Remove parameter validation as workaround for CHOICES API endpoint until further testing --- .../DCIM/Devices/New-NetboxDCIMDevice.ps1 | 30 ++++---- .../DCIM/Devices/Set-NetboxDCIMDevice.ps1 | 14 ++-- .../Interfaces/Add-NetboxDCIMInterface.ps1 | 6 +- .../Interfaces/Set-NetboxDCIMInterface.ps1 | 6 +- .../Set-NetboxDCIMInterfaceConnection.ps1 | 6 +- .../IPAM/Address/Get-NetboxIPAMAddress.ps1 | 65 ++++++++++++----- .../IPAM/Address/New-NetboxIPAMAddress.ps1 | 41 ++++++++--- .../IPAM/Address/Remove-NetboxIPAMAddress.ps1 | 6 -- .../IPAM/Address/Set-NetboxIPAMAddress.ps1 | 32 +++++---- .../Aggregate/Get-NetboxIPAMAggregate.ps1 | 72 +++++++++++++------ .../IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 | 2 +- .../IPAM/Prefix/New-NetboxIPAMPrefix.ps1 | 2 +- Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 | 4 +- Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 | 8 +-- Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 | 10 +-- Functions/Setup/Connect-NetboxAPI.ps1 | 29 +++++--- .../Setup/Support/Get-NetboxAPIDefinition.ps1 | 29 ++++++++ .../Support/SetupNetboxConfigVariable.ps1 | 1 + .../Setup/Support/VerifyAPIConnectivity.ps1 | 4 +- Functions/Tenancy/Get-NetboxTenant.ps1 | 10 +-- .../New-NetboxVirtualMachine.ps1 | 15 +++- .../Set-NetboxVirtualMachine.ps1 | 12 ++-- .../Get-NetboxVirtualMachineInterface.ps1 | 10 +-- .../Get-NetboxVirtualizationCluster.ps1 | 39 +++------- .../Get-NetboxVirtualizationClusterGroup.ps1 | 31 ++++---- 25 files changed, 294 insertions(+), 190 deletions(-) create mode 100644 Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 diff --git a/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 index f209a93..3a6751d 100644 --- a/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 +++ b/Functions/DCIM/Devices/New-NetboxDCIMDevice.ps1 @@ -64,21 +64,21 @@ function New-NetboxDCIMDevice { ) #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 - } +# 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')) diff --git a/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 b/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 index e15ce9f..00b50fc 100644 --- a/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 +++ b/Functions/DCIM/Devices/Set-NetboxDCIMDevice.ps1 @@ -64,13 +64,13 @@ function Set-NetboxDCIMDevice { ) begin { - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus - } - - if ($null -ne $Face) { - $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace - } +# if ($null -ne $Status) { +# $PSBoundParameters.Status = ValidateDCIMChoice -ProvidedValue $Status -DeviceStatus +# } +# +# if ($null -ne $Face) { +# $PSBoundParameters.Face = ValidateDCIMChoice -ProvidedValue $Face -DeviceFace +# } } process { diff --git a/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 index a19da07..c792d35 100644 --- a/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 +++ b/Functions/DCIM/Interfaces/Add-NetboxDCIMInterface.ps1 @@ -47,9 +47,9 @@ function Add-NetboxDCIMInterface { [uint16[]]$Tagged_VLANs ) - if ($null -ne $Form_Factor) { - $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor - } +# if ($null -ne $Form_Factor) { +# $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor +# } if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { $PSBoundParameters.Mode = switch ($Mode) { diff --git a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 index fbfb552..431065a 100644 --- a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 +++ b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterface.ps1 @@ -50,9 +50,9 @@ function Set-NetboxDCIMInterface { ) begin { - if ($null -ne $Form_Factor) { - $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor - } +# if ($null -ne $Form_Factor) { +# $PSBoundParameters.Form_Factor = ValidateDCIMChoice -ProvidedValue $Form_Factor -InterfaceFormFactor +# } if (-not [System.String]::IsNullOrWhiteSpace($Mode)) { $PSBoundParameters.Mode = switch ($Mode) { diff --git a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 index 2e2496f..0836bfc 100644 --- a/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 +++ b/Functions/DCIM/Interfaces/Set-NetboxDCIMInterfaceConnection.ps1 @@ -60,9 +60,9 @@ function Set-NetboxDCIMInterfaceConnection { ) begin { - if ($null -ne $Connection_Status) { - $PSBoundParameters.Connection_Status = ValidateDCIMChoice -ProvidedValue $Connection_Status -InterfaceConnectionStatus - } +# 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" diff --git a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 index 5a57726..b98d00a 100644 --- a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 @@ -1,65 +1,92 @@ function Get-NetboxIPAMAddress { - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'Query')] param ( + [Parameter(ParameterSetName = 'Query')] [string]$Address, + [Parameter(ParameterSetName = 'ByID')] [uint16[]]$Id, + [Parameter(ParameterSetName = 'Query')] [string]$Query, + [Parameter(ParameterSetName = 'Query')] [object]$Family, + [Parameter(ParameterSetName = 'Query')] [uint16]$Parent, + [Parameter(ParameterSetName = 'Query')] [byte]$Mask_Length, + [Parameter(ParameterSetName = 'Query')] [string]$VRF, + [Parameter(ParameterSetName = 'Query')] [uint16]$VRF_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Tenant, + [Parameter(ParameterSetName = 'Query')] [uint16]$Tenant_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Device, + [Parameter(ParameterSetName = 'Query')] [uint16]$Device_ID, + [Parameter(ParameterSetName = 'Query')] [string]$Virtual_Machine, + [Parameter(ParameterSetName = 'Query')] [uint16]$Virtual_Machine_Id, + [Parameter(ParameterSetName = 'Query')] [uint16]$Interface_Id, + [Parameter(ParameterSetName = 'Query')] [object]$Status, + [Parameter(ParameterSetName = 'Query')] [object]$Role, + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, + [Parameter(ParameterSetName = 'Query')] [uint16]$Offset, [switch]$Raw ) - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -IPAddressFamily + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($IP_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IP_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } } - - 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/New-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 index 0ee365a..ce45fec 100644 --- a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 @@ -47,6 +47,9 @@ function New-NetboxIPAMAddress { .PARAMETER Description Description of IP address + .PARAMETER Force + A description of the Force parameter. + .PARAMETER Raw Return raw results from API service @@ -57,7 +60,8 @@ function New-NetboxIPAMAddress { Additional information about the function. #> - [CmdletBinding()] + [CmdletBinding(ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] [OutputType([pscustomobject])] param ( @@ -80,20 +84,35 @@ function New-NetboxIPAMAddress { [string]$Description, + [switch]$Force, + [switch]$Raw ) - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + $Method = 'POST' - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters +# # Value validation +# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method +# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition +# +# foreach ($Property in $EnumProperties.Keys) { +# if ($PSBoundParameters.ContainsKey($Property)) { +# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" +# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property +# } +# } +# + $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 + if ($Force -or $PSCmdlet.ShouldProcess($Address, 'Create new IP address')) { + InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + } +} + + + + + diff --git a/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 index da80014..48871db 100644 --- a/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Remove-NetboxIPAMAddress.ps1 @@ -43,9 +43,6 @@ function Remove-NetboxIPAMAddress { [switch]$Force ) - begin { - } - process { foreach ($IPId in $Id) { $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop @@ -59,7 +56,4 @@ function Remove-NetboxIPAMAddress { } } } - - end { - } } \ No newline at end of file diff --git a/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 index de2d07e..5b8614e 100644 --- a/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 @@ -43,20 +43,31 @@ function Set-NetboxIPAMAddress { ) begin { - if ($Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -IPAddressStatus - } - - if ($Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } +# Write-Verbose "Validating enum properties" +# $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) + $Method = 'PATCH' +# +# # Value validation +# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method +# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition +# +# foreach ($Property in $EnumProperties.Keys) { +# if ($PSBoundParameters.ContainsKey($Property)) { +# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" +# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property +# } else { +# Write-Verbose "User did not provide a value for [$Property]" +# } +# } +# +# Write-Verbose "Finished enum validation" } process { foreach ($IPId in $Id) { $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - Write-Verbose "Obtaining IPs from ID $IPId" + Write-Verbose "Obtaining IP from ID $IPId" $CurrentIP = Get-NetboxIPAMAddress -Id $IPId -ErrorAction Stop if ($Force -or $PSCmdlet.ShouldProcess($CurrentIP.Address, 'Set')) { @@ -64,11 +75,8 @@ function Set-NetboxIPAMAddress { $URI = BuildNewURI -Segments $URIComponents.Segments - InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method } } } - - end { - } } \ No newline at end of file diff --git a/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 b/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 index 03e5255..a696bc6 100644 --- a/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 +++ b/Functions/IPAM/Aggregate/Get-NetboxIPAMAggregate.ps1 @@ -13,37 +13,67 @@ function Get-NetboxIPAMAggregate { - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'Query')] param ( - [uint16]$Limit, - - [uint16]$Offset, - - [object]$Family, - - [datetime]$Date_Added, - - [uint16[]]$Id, - + [Parameter(ParameterSetName = 'Query')] [string]$Query, + [Parameter(ParameterSetName = 'ByID')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Prefix, + + [Parameter(ParameterSetName = 'Query')] + [object]$Family, + + [Parameter(ParameterSetName = 'Query')] [uint16]$RIR_Id, + [Parameter(ParameterSetName = 'Query')] [string]$RIR, + [Parameter(ParameterSetName = 'Query')] + [datetime]$Date_Added, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + [switch]$Raw ) - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily +# if ($null -ne $Family) { +# $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($IP_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates', $IP_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + + break + } } - - $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/Prefix/Get-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 index 1236046..c6668d7 100644 --- a/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 +++ b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 @@ -93,7 +93,7 @@ function Get-NetboxIPAMPrefix { Additional information about the function. #> - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'Query')] param ( [string]$Prefix, diff --git a/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 index a085eab..c9c7577 100644 --- a/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 +++ b/Functions/IPAM/Prefix/New-NetboxIPAMPrefix.ps1 @@ -40,7 +40,7 @@ function New-NetboxIPAMPrefix { [switch]$Raw ) - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus +# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus <# # As of 2018/10/18, this does not appear to be a validated IPAM choice diff --git a/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 index 03cbb64..1d4cc03 100644 --- a/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 +++ b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 @@ -41,11 +41,11 @@ function Get-NetboxIPAMRole { [CmdletBinding()] param ( - [uint16[]]$Id, + [string]$Name, [string]$Query, - [string]$Name, + [uint16[]]$Id, [string]$Slug, diff --git a/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 index 025c028..b85f545 100644 --- a/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 +++ b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 @@ -16,10 +16,6 @@ function Get-NetboxIPAMVLAN { [CmdletBinding()] param ( - [uint16]$Limit, - - [uint16]$Offset, - [uint16]$VID, [uint16[]]$Id, @@ -52,6 +48,10 @@ function Get-NetboxIPAMVLAN { [uint16]$Role_Id, + [uint16]$Limit, + + [uint16]$Offset, + [switch]$Raw ) diff --git a/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 b/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 index bc55aed..c846296 100644 --- a/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 +++ b/Functions/IPAM/VLAN/New-NetboxIPAMVLAN.ps1 @@ -63,11 +63,11 @@ [switch]$Raw ) - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } +# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus +# +# if ($null -ne $Role) { +# $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole +# } $segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) diff --git a/Functions/Setup/Connect-NetboxAPI.ps1 b/Functions/Setup/Connect-NetboxAPI.ps1 index c4e9809..9c372b2 100644 --- a/Functions/Setup/Connect-NetboxAPI.ps1 +++ b/Functions/Setup/Connect-NetboxAPI.ps1 @@ -48,8 +48,6 @@ 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 @@ -60,14 +58,25 @@ } } - 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 "Caching API definition" + $script:NetboxConfig.APIDefinition = Get-NetboxAPIDefinition + + if ([version]$script:NetboxConfig.APIDefinition.info.version -lt 2.8) { + $Script:NetboxConfig.Connected = $false + throw "Netbox version is incompatible with this PS module. Requires >=2.8.*, found version $($script:NetboxConfig.APIDefinition.info.version)" + } + + $script:NetboxConfig.Connected = $true + Write-Verbose "Successfully connected!" + + #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" } \ No newline at end of file diff --git a/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 b/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 new file mode 100644 index 0000000..b525a2e --- /dev/null +++ b/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 @@ -0,0 +1,29 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.174 + Created on: 4/28/2020 11:57 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxAPIDefinition.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxAPIDefinition { + [CmdletBinding()] + param () + + #$URI = "https://netbox.neonet.org/api/docs/?format=openapi" + + $Segments = [System.Collections.ArrayList]::new(@('docs')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary @{'format' = 'openapi'} + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Timeout 10 +} diff --git a/Functions/Setup/Support/SetupNetboxConfigVariable.ps1 b/Functions/Setup/Support/SetupNetboxConfigVariable.ps1 index 8c28e27..20d84a8 100644 --- a/Functions/Setup/Support/SetupNetboxConfigVariable.ps1 +++ b/Functions/Setup/Support/SetupNetboxConfigVariable.ps1 @@ -12,6 +12,7 @@ 'Connected' = $false 'Choices' = @{ } + 'APIDefinition' = $null } } diff --git a/Functions/Setup/Support/VerifyAPIConnectivity.ps1 b/Functions/Setup/Support/VerifyAPIConnectivity.ps1 index dc461d0..b53760e 100644 --- a/Functions/Setup/Support/VerifyAPIConnectivity.ps1 +++ b/Functions/Setup/Support/VerifyAPIConnectivity.ps1 @@ -2,9 +2,9 @@ [CmdletBinding()] param () - $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) + $uriSegments = [System.Collections.ArrayList]::new(@('extras')) - $uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck + $uri = BuildNewURI -Segments $uriSegments -Parameters @{'format' = 'json'} -SkipConnectedCheck InvokeNetboxRequest -URI $uri } \ No newline at end of file diff --git a/Functions/Tenancy/Get-NetboxTenant.ps1 b/Functions/Tenancy/Get-NetboxTenant.ps1 index 4686223..32ca539 100644 --- a/Functions/Tenancy/Get-NetboxTenant.ps1 +++ b/Functions/Tenancy/Get-NetboxTenant.ps1 @@ -16,12 +16,10 @@ function Get-NetboxTenant { [CmdletBinding()] param ( - [uint16]$Limit, - - [uint16]$Offset, - [string]$Name, + [string]$Slug, + [uint16[]]$Id, [string]$Query, @@ -32,6 +30,10 @@ function Get-NetboxTenant { [hashtable]$CustomFields, + [uint16]$Limit, + + [uint16]$Offset, + [switch]$Raw ) diff --git a/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 index 31bc926..6798c36 100644 --- a/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 +++ b/Functions/Virtualization/VirtualMachine/New-NetboxVirtualMachine.ps1 @@ -46,7 +46,14 @@ function New-NetboxVirtualMachine { [string]$Comments ) - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus +# $ModelDefinition = $script:NetboxConfig.APIDefinition.definitions.WritableVirtualMachineWithConfigContext +# +# # Validate the status against the APIDefinition +# if ($ModelDefinition.properties.status.enum -inotcontains $Status) { +# throw ("Invalid value [] for Status. Must be one of []" -f $Status, ($ModelDefinition.properties.status.enum -join ', ')) +# } +# + #$PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'virtual-machines')) @@ -55,4 +62,8 @@ function New-NetboxVirtualMachine { $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/Set-NetboxVirtualMachine.ps1 b/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 index 3cb7aff..abfaac5 100644 --- a/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 +++ b/Functions/Virtualization/VirtualMachine/Set-NetboxVirtualMachine.ps1 @@ -50,19 +50,19 @@ function Set-NetboxVirtualMachine { [switch]$Force ) - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateVirtualizationChoice -ProvidedValue $Status -VirtualMachineStatus - } - +# 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 + #$CurrentVM = Get-NetboxVirtualMachine -Id $Id -ErrorAction Stop Write-Verbose "Finished obtaining VM" - if ($Force -or $pscmdlet.ShouldProcess($CurrentVM.Name, "Set")) { + if ($Force -or $pscmdlet.ShouldProcess($ID, "Set properties on VM ID")) { $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' $URI = BuildNewURI -Segments $URIComponents.Segments diff --git a/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 b/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 index e1438e4..0b0c3c4 100644 --- a/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 +++ b/Functions/Virtualization/VirtualMachineInterface/Get-NetboxVirtualMachineInterface.ps1 @@ -60,15 +60,13 @@ function Get-NetboxVirtualMachineInterface { [CmdletBinding()] param ( - [uint16]$Limit, - - [uint16]$Offset, - [Parameter(ValueFromPipeline = $true)] [uint16]$Id, [string]$Name, + [string]$Query, + [boolean]$Enabled, [uint16]$MTU, @@ -79,6 +77,10 @@ function Get-NetboxVirtualMachineInterface { [string]$MAC_Address, + [uint16]$Limit, + + [uint16]$Offset, + [switch]$Raw ) diff --git a/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 index 327d948..bb373a6 100644 --- a/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 +++ b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationCluster.ps1 @@ -66,16 +66,11 @@ function Get-NetboxVirtualizationCluster { [CmdletBinding()] param ( - [uint16]$Limit, - - [uint16]$Offset, + [string]$Name, [Alias('q')] [string]$Query, - [string]$Name, - - [Alias('id__in')] [uint16[]]$Id, [string]$Group, @@ -90,36 +85,18 @@ function Get-NetboxVirtualizationCluster { [uint16]$Site_Id, + [uint16]$Limit, + + [uint16]$Offset, + [switch]$Raw ) - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) - $URIParameters = @{ - } + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - 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 + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters 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 index f558bd8..467e716 100644 --- a/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 +++ b/Functions/Virtualization/VirtualizationCluster/Get-NetboxVirtualizationClusterGroup.ps1 @@ -16,33 +16,28 @@ function Get-NetboxVirtualizationClusterGroup { [CmdletBinding()] param ( - [uint16]$Limit, - - [uint16]$Offset, - [string]$Name, [string]$Slug, + [string]$Description, + + [string]$Query, + + [uint32[]]$Id, + + [uint16]$Limit, + + [uint16]$Offset, + [switch]$Raw ) - $uriSegments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) - $URIParameters = @{ - } + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - 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 + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters InvokeNetboxRequest -URI $uri -Raw:$Raw } \ No newline at end of file From a98495e5f433b0d770c1f0af16107a0a75dd4db2 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 2 Oct 2020 10:37:27 -0400 Subject: [PATCH 03/27] Add help block for Get-NetboxTenant --- Functions/Tenancy/Get-NetboxTenant.ps1 | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Functions/Tenancy/Get-NetboxTenant.ps1 b/Functions/Tenancy/Get-NetboxTenant.ps1 index 32ca539..60d0373 100644 --- a/Functions/Tenancy/Get-NetboxTenant.ps1 +++ b/Functions/Tenancy/Get-NetboxTenant.ps1 @@ -13,6 +13,50 @@ function Get-NetboxTenant { +<# + .SYNOPSIS + Get a tenent from Netbox + + .DESCRIPTION + A detailed description of the Get-NetboxTenant function. + + .PARAMETER Name + The specific name of the tenant. Must match exactly as is defined in Netbox + + .PARAMETER Slug + The specific slug of the tenant. Must match exactly as is defined in Netbox + + .PARAMETER Id + The database ID of the tenant + + .PARAMETER Query + A standard search query that will match one or more tenants. + + .PARAMETER Group + The specific group as defined in Netbox. + + .PARAMETER GroupID + The database ID of the group in Netbox + + .PARAMETER CustomFields + Hashtable in the format @{"field_name" = "value"} to search + + .PARAMETER Limit + Limit the number of results to this number + + .PARAMETER Offset + Start the search at this index in results + + .PARAMETER Raw + Return the unparsed data from the HTTP request + + .EXAMPLE + PS C:\> Get-NetboxTenant + + .NOTES + Additional information about the function. +#> + [CmdletBinding()] param ( From b36632cb9a35a551fc55b96b3a88a8af63b54edb Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 2 Oct 2020 10:37:52 -0400 Subject: [PATCH 04/27] SkipConnectedCheck for Get-NetboxAPIDefinition --- Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 b/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 index b525a2e..3fb0215 100644 --- a/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 +++ b/Functions/Setup/Support/Get-NetboxAPIDefinition.ps1 @@ -23,7 +23,7 @@ function Get-NetboxAPIDefinition { $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary @{'format' = 'openapi'} - $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters -SkipConnectedCheck InvokeNetboxRequest -URI $URI -Timeout 10 } From ee7ba72450b3d64d3788fcc193971001a8d38c81 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 2 Oct 2020 10:38:22 -0400 Subject: [PATCH 05/27] Correct help block for New-NetboxIPAMAddress --- Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 index ce45fec..1f95759 100644 --- a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 @@ -48,7 +48,7 @@ function New-NetboxIPAMAddress { Description of IP address .PARAMETER Force - A description of the Force parameter. + Do not prompt for confirmation to create IP. .PARAMETER Raw Return raw results from API service From a905a8d59808acf60448dd9d7d318e138bb9c25a Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 2 Oct 2020 10:38:49 -0400 Subject: [PATCH 06/27] Add parameter position 0 for 'Address' in Get-NetboxIPAMAddress --- Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 index b98d00a..17432da 100644 --- a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 @@ -2,7 +2,8 @@ [CmdletBinding(DefaultParameterSetName = 'Query')] param ( - [Parameter(ParameterSetName = 'Query')] + [Parameter(ParameterSetName = 'Query', + Position = 0)] [string]$Address, [Parameter(ParameterSetName = 'ByID')] From 9649237394c27fa00fdac6ddf83a0f54580015da Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 2 Oct 2020 15:49:46 -0400 Subject: [PATCH 07/27] Allow pipeline input for Address parameter in New-NetboxIPAMAddress --- .../IPAM/Address/New-NetboxIPAMAddress.ps1 | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 index 1f95759..c5d191b 100644 --- a/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/New-NetboxIPAMAddress.ps1 @@ -65,7 +65,8 @@ function New-NetboxIPAMAddress { [OutputType([pscustomobject])] param ( - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] [string]$Address, [object]$Status = 'Active', @@ -92,17 +93,17 @@ function New-NetboxIPAMAddress { $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) $Method = 'POST' -# # Value validation -# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method -# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition -# -# foreach ($Property in $EnumProperties.Keys) { -# if ($PSBoundParameters.ContainsKey($Property)) { -# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" -# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property -# } -# } -# + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } + # } + # $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters $URI = BuildNewURI -Segments $URIComponents.Segments From b72684709ae6efa7cf127d2e3ea3ba4853bcee86 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 5 Oct 2020 10:42:29 -0400 Subject: [PATCH 08/27] Update parameter types --- Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 index 17432da..d1a433c 100644 --- a/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Get-NetboxIPAMAddress.ps1 @@ -7,7 +7,7 @@ [string]$Address, [Parameter(ParameterSetName = 'ByID')] - [uint16[]]$Id, + [uint32[]]$Id, [Parameter(ParameterSetName = 'Query')] [string]$Query, @@ -16,7 +16,7 @@ [object]$Family, [Parameter(ParameterSetName = 'Query')] - [uint16]$Parent, + [uint32]$Parent, [Parameter(ParameterSetName = 'Query')] [byte]$Mask_Length, @@ -25,28 +25,28 @@ [string]$VRF, [Parameter(ParameterSetName = 'Query')] - [uint16]$VRF_Id, + [uint32]$VRF_Id, [Parameter(ParameterSetName = 'Query')] [string]$Tenant, [Parameter(ParameterSetName = 'Query')] - [uint16]$Tenant_Id, + [uint32]$Tenant_Id, [Parameter(ParameterSetName = 'Query')] [string]$Device, [Parameter(ParameterSetName = 'Query')] - [uint16]$Device_ID, + [uint32]$Device_ID, [Parameter(ParameterSetName = 'Query')] [string]$Virtual_Machine, [Parameter(ParameterSetName = 'Query')] - [uint16]$Virtual_Machine_Id, + [uint32]$Virtual_Machine_Id, [Parameter(ParameterSetName = 'Query')] - [uint16]$Interface_Id, + [uint32]$Interface_Id, [Parameter(ParameterSetName = 'Query')] [object]$Status, From 18852aa9905c21e37af0565600ce3a24c821737c Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 5 Oct 2020 10:43:22 -0400 Subject: [PATCH 09/27] Add parameter sets and logic for ID/Query searches --- .../IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 | 83 ++++++++++++++----- Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 | 44 ++++++++-- Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 | 72 ++++++++++++---- Functions/Tenancy/Get-NetboxTenant.ps1 | 62 ++++++++++---- 4 files changed, 201 insertions(+), 60 deletions(-) diff --git a/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 index c6668d7..a554fb6 100644 --- a/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 +++ b/Functions/IPAM/Prefix/Get-NetboxIPAMPrefix.ps1 @@ -96,67 +96,110 @@ function Get-NetboxIPAMPrefix { [CmdletBinding(DefaultParameterSetName = 'Query')] param ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] [string]$Prefix, + [Parameter(ParameterSetName = 'Query')] [string]$Query, - [uint16[]]$Id, + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + [Parameter(ParameterSetName = 'Query')] [object]$Family, + [Parameter(ParameterSetName = 'Query')] [boolean]$Is_Pool, + [Parameter(ParameterSetName = 'Query')] [string]$Within, + [Parameter(ParameterSetName = 'Query')] [string]$Within_Include, + [Parameter(ParameterSetName = 'Query')] [string]$Contains, + [Parameter(ParameterSetName = 'Query')] [ValidateRange(0, 127)] [byte]$Mask_Length, + [Parameter(ParameterSetName = 'Query')] [string]$VRF, - [uint16]$VRF_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$VRF_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Tenant, - [uint16]$Tenant_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Site, - [uint16]$Site_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Site_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Vlan_VId, - [uint16]$Vlan_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Vlan_Id, + [Parameter(ParameterSetName = 'Query')] [object]$Status, + [Parameter(ParameterSetName = 'Query')] [string]$Role, - [uint16]$Role_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Role_Id, + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, + [Parameter(ParameterSetName = 'Query')] [uint16]$Offset, [switch]$Raw ) - if ($null -ne $Family) { - $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily + # if ($null -ne $Family) { + # $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily + # } + # + # if ($null -ne $Status) { + # $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Prefix_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } } - - 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/Role/Get-NetboxIPAMRole.ps1 b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 index 1d4cc03..e7066c0 100644 --- a/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 +++ b/Functions/IPAM/Role/Get-NetboxIPAMRole.ps1 @@ -41,28 +41,56 @@ function Get-NetboxIPAMRole { [CmdletBinding()] param ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] [string]$Name, + [Parameter(ParameterSetName = 'Query')] [string]$Query, - [uint16[]]$Id, + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + [Parameter(ParameterSetName = 'Query')] [string]$Slug, + [Parameter(ParameterSetName = 'Query')] [switch]$Brief, + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, + [Parameter(ParameterSetName = 'Query')] [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 + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Role_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles', $Role_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } } \ No newline at end of file diff --git a/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 index b85f545..050d5bc 100644 --- a/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 +++ b/Functions/IPAM/VLAN/Get-NetboxIPAMVLAN.ps1 @@ -16,56 +16,96 @@ function Get-NetboxIPAMVLAN { [CmdletBinding()] param ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [ValidateRange(1, 4096)] [uint16]$VID, - [uint16[]]$Id, + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + [Parameter(ParameterSetName = 'Query')] [string]$Query, + [Parameter(ParameterSetName = 'Query')] [string]$Name, + [Parameter(ParameterSetName = 'Query')] [string]$Tenant, - [uint16]$Tenant_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Id, + [Parameter(ParameterSetName = 'Query')] [string]$TenantGroup, - [uint16]$TenantGroup_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$TenantGroup_Id, + [Parameter(ParameterSetName = 'Query')] [object]$Status, + [Parameter(ParameterSetName = 'Query')] [string]$Region, + [Parameter(ParameterSetName = 'Query')] [string]$Site, - [uint16]$Site_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Site_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Group, - [uint16]$Group_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Group_Id, + [Parameter(ParameterSetName = 'Query')] [string]$Role, - [uint16]$Role_Id, + [Parameter(ParameterSetName = 'Query')] + [uint32]$Role_Id, + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, + [Parameter(ParameterSetName = 'Query')] [uint16]$Offset, [switch]$Raw ) - if ($null -ne $Status) { - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + # if ($null -ne $Status) { + # $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($VLAN_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans', $VLAN_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } } - - $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/Tenancy/Get-NetboxTenant.ps1 b/Functions/Tenancy/Get-NetboxTenant.ps1 index 60d0373..85d110c 100644 --- a/Functions/Tenancy/Get-NetboxTenant.ps1 +++ b/Functions/Tenancy/Get-NetboxTenant.ps1 @@ -23,17 +23,17 @@ function Get-NetboxTenant { .PARAMETER Name The specific name of the tenant. Must match exactly as is defined in Netbox - .PARAMETER Slug - The specific slug of the tenant. Must match exactly as is defined in Netbox - .PARAMETER Id The database ID of the tenant .PARAMETER Query A standard search query that will match one or more tenants. + .PARAMETER Slug + The specific slug of the tenant. Must match exactly as is defined in Netbox + .PARAMETER Group - The specific group as defined in Netbox. + The specific group as defined in Netbox. .PARAMETER GroupID The database ID of the group in Netbox @@ -51,41 +51,71 @@ function Get-NetboxTenant { Return the unparsed data from the HTTP request .EXAMPLE - PS C:\> Get-NetboxTenant + PS C:\> Get-NetboxTenant .NOTES Additional information about the function. #> - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'Query')] param ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] [string]$Name, - [string]$Slug, - - [uint16[]]$Id, + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + [Parameter(ParameterSetName = 'Query')] [string]$Query, + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] [string]$Group, + [Parameter(ParameterSetName = 'Query')] [uint16]$GroupID, + [Parameter(ParameterSetName = 'Query')] [hashtable]$CustomFields, + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, + [Parameter(ParameterSetName = 'Query')] [uint16]$Offset, [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 ($Tenant_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants', $Tenant_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } } \ No newline at end of file From a6b3d31d44bc66248cb09cf3cab805d5d621311e Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 5 Oct 2020 10:43:35 -0400 Subject: [PATCH 10/27] Add Get-NetboxDCIMSite --- Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1 | 108 ++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1 diff --git a/Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1 b/Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1 new file mode 100644 index 0000000..b7e13a4 --- /dev/null +++ b/Functions/DCIM/Sites/Get-NetboxDCIMSite.ps1 @@ -0,0 +1,108 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-10-02 15:52 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMSite.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxDCIMSite { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(ParameterSetName = 'ByID', ValueFromPipelineByPropertyName = $true)] + [uint32]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$Facility, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$ASN, + + [Parameter(ParameterSetName = 'Query')] + [decimal]$Latitude, + + [Parameter(ParameterSetName = 'Query')] + [decimal]$Longitude, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Phone, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Email, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Group_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant_Group, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [string]$Status, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Region_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Region, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Site_ID in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites', $Site_Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} + From 43b628a7368876de685a4c6c2e746cad616875b6 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 5 Oct 2020 10:44:23 -0400 Subject: [PATCH 11/27] Update psproj --- NetboxPS.psd1 | 251 ++++++++++++++++++++++++------------------------ NetboxPS.psm1 | 4 +- NetboxPS.psproj | 3 + 3 files changed, 133 insertions(+), 125 deletions(-) diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index d927485..179e675 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -1,127 +1,132 @@ -<# - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 - Created on: 2/28/2018 11:04 AM - Created by: Ben Claussen - Organization: NEOnet - Filename: NetboxPS.psd1 - ------------------------------------------------------------------------- - Module Manifest - ------------------------------------------------------------------------- - Module Name: NetboxPS - =========================================================================== -#> - +# +# Module manifest for module 'NetboxPS' +# +# Generated by: Ben Claussen +# +# Generated on: 2020-10-05 +# @{ - - # Script module or binary module file associated with this manifest - RootModule = 'NetboxPS.psm1' - - # Version number of this module. - ModuleVersion = '1.0.4' - - # ID used to uniquely identify this module - GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' - - # Author of this module - Author = 'Ben Claussen' - - # Company or vendor of this module - CompanyName = 'NEOnet' - - # Copyright statement for this module - Copyright = '(c) 2018. All rights reserved.' - - # Description of the functionality provided by this module - Description = 'A Powershell wrapper for Netbox API' - - # Minimum version of the Windows PowerShell engine required by this module - PowerShellVersion = '5.0' - - # Name of the Windows PowerShell host required by this module - PowerShellHostName = '' - - # Minimum version of the Windows PowerShell host required by this module - PowerShellHostVersion = '' - - # Minimum version of the .NET Framework required by this module - DotNetFrameworkVersion = '2.0' - - # Minimum version of the common language runtime (CLR) required by this module - CLRVersion = '2.0.50727' - - # Processor architecture (None, X86, Amd64, IA64) required by this module - ProcessorArchitecture = 'None' - - # Modules that must be imported into the global environment prior to importing - # this module - RequiredModules = @() - - # Assemblies that must be loaded prior to importing this module - RequiredAssemblies = @('System.Web') - - # Script files (.ps1) that are run in the caller's environment prior to - # importing this module - ScriptsToProcess = @() - - # Type files (.ps1xml) to be loaded when importing this module - TypesToProcess = @() - - # Format files (.ps1xml) to be loaded when importing this module - FormatsToProcess = @() - - # Modules to import as nested modules of the module specified in - # ModuleToProcess - NestedModules = @() - - # Functions to export from this module - FunctionsToExport = @('*') #For performanace, list functions explicity - - # Cmdlets to export from this module - CmdletsToExport = '*' - - # Variables to export from this module - VariablesToExport = '*' - - # Aliases to export from this module - AliasesToExport = '*' #For performanace, list alias explicity - - # List of all modules packaged with this module - ModuleList = @() - - # List of all files packaged with this module - FileList = @() - - # Private data to pass to the module specified in ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. - PrivateData = @{ - - #Support for PowerShellGet galleries. - PSData = @{ - - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('Netbox', 'API', 'DCIM', 'IPAM') - - # A URL to the license for this module. - # LicenseUri = '' - - # A URL to the main website for this project. - ProjectUri = 'https://github.com/benclaussen/NetboxPS' - - # A URL to an icon representing this module. - # IconUri = '' - - # ReleaseNotes of this module - # ReleaseNotes = '' - - } # End of PSData hashtable - - } # End of PrivateData hashtable + +# Script module or binary module file associated with this manifest. +RootModule = 'NetboxPS.psm1' + +# Version number of this module. +ModuleVersion = '1.2.0' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' + +# Author of this module +Author = 'Ben Claussen' + +# Company or vendor of this module +CompanyName = 'NEOnet' + +# Copyright statement for this module +Copyright = '(c) 2018. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'A Powershell wrapper for Netbox API' + +# Minimum version of the Windows PowerShell engine required by this module +PowerShellVersion = '5.0' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +DotNetFrameworkVersion = '2.0' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +CLRVersion = '2.0.50727' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +RequiredAssemblies = 'System.Web' + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +NestedModules = @() + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = '*' + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = 'Netbox','API','DCIM','IPAM' + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/benclaussen/NetboxPS' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + # Prerelease = '' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + + } # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + } - - - - - - diff --git a/NetboxPS.psm1 b/NetboxPS.psm1 index f2a3679..cc051fc 100644 --- a/NetboxPS.psm1 +++ b/NetboxPS.psm1 @@ -18,5 +18,5 @@ $script:CommonParameterNames = New-Object System.Collections.ArrayList SetupNetboxConfigVariable -#Export-ModuleMember -Function * -Export-ModuleMember -Function *-* \ No newline at end of file +Export-ModuleMember -Function * +#Export-ModuleMember -Function *-* \ No newline at end of file diff --git a/NetboxPS.psproj b/NetboxPS.psproj index a9c7f7a..1ebbd3b 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -24,6 +24,7 @@ Functions\Setup Functions\Setup\Support Tests + Functions\DCIM\Sites NetboxPS.psd1 @@ -103,6 +104,8 @@ Functions\Circuits\Get-NetboxCircuitsChoices.ps1 Functions\Circuits\Get-NetboxCircuit.ps1 deploy.ps1 + Functions\Setup\Support\Get-NetboxAPIDefinition.ps1 + Functions\DCIM\Sites\Get-NetboxDCIMSite.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file From de9b61609314dab6d325583a2316231d530773ce Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Mon, 5 Oct 2020 10:44:33 -0400 Subject: [PATCH 12/27] Update deploy.ps1 --- deploy.ps1 | 121 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 24 deletions(-) diff --git a/deploy.ps1 b/deploy.ps1 index 8316249..3d79e2e 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -1,45 +1,118 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.174 - Created on: 4/9/2020 09:43 - Created by: Claussen - Organization: NEOnet - Filename: deploy.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. +<# + .SYNOPSIS + A brief description of the Invoke-deploy_ps1 file. + + .DESCRIPTION + A description of the file. + + .PARAMETER SkipVersion + A description of the SkipVersion parameter. + + .PARAMETER VersionIncrease + A description of the VersionIncrease parameter. + + .PARAMETER NewVersion + A description of the NewVersion parameter. + + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.174 + Created on: 4/9/2020 09:43 + Created by: Claussen + Organization: NEOnet + Filename: deploy.ps1 + =========================================================================== #> - - +[CmdletBinding(DefaultParameterSetName = 'IncreaseVersion')] +param +( + [Parameter(ParameterSetName = 'SkipVersion')] + [switch]$SkipVersion, + + [Parameter(ParameterSetName = 'IncreaseVersion')] + [version]$VersionIncrease = "0.0.1", + + [Parameter(ParameterSetName = 'SetVersion')] + [version]$NewVersion +) Write-Host "Beginning deployment" -ForegroundColor Green +$ModuleName = 'NetboxPS' +$ConcatenatedFilePath = "$PSScriptRoot\concatenated.ps1" +$PSD1OutputPath = "$PSScriptRoot\dist\$ModuleName.psd1" +$PSM1OutputPath = "$PSScriptRoot\dist\$ModuleName.psm1" + $PS1Files = Get-ChildItem "$PSScriptRoot\Functions" -Filter "*.ps1" -Recurse | Sort-Object Name -"" | Out-File -FilePath .\concatenated.ps1 -Encoding utf8 +"" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 $Counter = 0 +Write-Host "Concatenating [$($PS1Files.Count)] PS1 files from $PSScriptRoot\Functions" foreach ($File in $PS1Files) { $Counter++ - Write-Host (" Adding file {0:D2}/{1:D2}: $($File.Name)" -f $Counter, $PS1Files.Count) - "`r`n#region File $($File.Name)`r`n" | Out-File -FilePath .\concatenated.ps1 -Encoding utf8 -Append - - Get-Content $File.FullName -Encoding UTF8 | Out-File -FilePath .\concatenated.ps1 -Encoding utf8 -Append - - "`r`n#endregion" | Out-File -FilePath .\concatenated.ps1 -Encoding utf8 -Append + try { + Write-Host (" Adding file {0:D2}/{1:D2}: $($File.Name)" -f $Counter, $PS1Files.Count) + + "`r`n#region File $($File.Name)`r`n" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + + Get-Content $File.FullName -Encoding UTF8 | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + + "`r`n#endregion" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + } catch { + Write-Host "FAILED TO WRITE CONCATENATED FILE: $($_.Exception.Message): $($_.TargetObject)" -ForegroundColor Red + return + } } -"" | Out-File -FilePath .\concatenated.ps1 -Encoding utf8 -Append +"" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append Write-Host " Adding psm1" -Get-Content .\NetboxPS.psm1 | Out-File -FilePath .\concatenated.ps1 -Encoding UTF8 -Append +Get-Content "$PSScriptRoot\$ModuleName.psm1" | Out-File -FilePath $ConcatenatedFilePath -Encoding UTF8 -Append + +$PSDManifest = Import-PowerShellDataFile -Path "$PSScriptRoot\$ModuleName.psd1" +# Get the version from the PSD1 +#[version]$CurrentVersion = [regex]::matches($PSDContent, "\s*ModuleVersion\s=\s'(\d*.\d*.\d*)'\s*").groups[1].value +[version]$CurrentVersion = $PSDManifest.ModuleVersion + + +switch ($PSCmdlet.ParameterSetName) { + "SkipVersion" { + # Dont do anything with the PSD + Write-Host " Skipping version update, maintaining version [$CurrentVersion]" + + break + } + + "IncreaseVersion" { + # Calculate the new version + [version]$NewVersion = "{0}.{1}.{2}" -f ($CurrentVersion.Major + $VersionIncrease.Major), ($CurrentVersion.Minor + $VersionIncrease.Minor), ($CurrentVersion.Build + $VersionIncrease.Build) + + Write-Host " Updating version in PSD1 from [$CurrentVersion] to [$NewVersion]" + + # Replace the version number in the content + #$PSDContent -replace $CurrentVersion, $NewVersion | Out-File $PSScriptRoot\$ModuleName.psd1 -Encoding UTF8 + Update-ModuleManifest -Path "$PSScriptRoot\$ModuleName.psd1" -ModuleVersion $NewVersion + + break + } + + "SetVersion" { + Write-Host " Updating version in PSD1 from [$CurrentVersion] to [$NewVersion]" + + # Replace the version number in the content + #$PSDContent -replace $CurrentVersion, $NewVersion | Out-File $PSScriptRoot\$ModuleName.psd1 -Encoding UTF8 + Update-ModuleManifest -Path "$PSScriptRoot\$ModuleName.psd1" -ModuleVersion $NewVersion + + break + } +} Write-Host " Copying psd1" -Copy-Item -Path .\NetboxPS.psd1 -Destination .\dist\NetboxPS.psd1 -Force +Copy-Item -Path "$PSScriptRoot\$ModuleName.psd1" -Destination $PSD1OutputPath -Force Write-Host " Copying psm1" -Copy-Item -Path .\concatenated.ps1 -Destination .\dist\NetboxPS.psm1 -Force +Copy-Item -Path $ConcatenatedFilePath -Destination $PSM1OutputPath -Force Write-Host "Deployment complete" -ForegroundColor Green \ No newline at end of file From 6636fe74d88442d494fad5df4dddd57f0c57c78a Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:16:56 -0500 Subject: [PATCH 13/27] Move Get-NetboxCircuit --- .../Circuits/Circuits/Get-NetboxCircuit.ps1 | 131 ++++++++++++++++++ Functions/Circuits/Get-NetboxCircuit.ps1 | 83 ----------- 2 files changed, 131 insertions(+), 83 deletions(-) create mode 100644 Functions/Circuits/Circuits/Get-NetboxCircuit.ps1 delete mode 100644 Functions/Circuits/Get-NetboxCircuit.ps1 diff --git a/Functions/Circuits/Circuits/Get-NetboxCircuit.ps1 b/Functions/Circuits/Circuits/Get-NetboxCircuit.ps1 new file mode 100644 index 0000000..319ee48 --- /dev/null +++ b/Functions/Circuits/Circuits/Get-NetboxCircuit.ps1 @@ -0,0 +1,131 @@ +<# + .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 Id + Database ID of circuit. This will query for exactly the IDs provided + + .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 Limit + A description of the Limit parameter. + + .PARAMETER Offset + A description of the Offset parameter. + + .PARAMETER Raw + A description of the Raw parameter. + + .PARAMETER ID__IN + Multiple unique DB IDs to retrieve + + .EXAMPLE + PS C:\> Get-NetboxCircuit + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$CID, + + [Parameter(ParameterSetName = 'Query')] + [datetime]$InstallDate, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$CommitRate, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [object]$Provider, + + [Parameter(ParameterSetName = 'Query')] + [object]$Type, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits')) + + $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/Circuits/Get-NetboxCircuit.ps1 b/Functions/Circuits/Get-NetboxCircuit.ps1 deleted file mode 100644 index 54c6b21..0000000 --- a/Functions/Circuits/Get-NetboxCircuit.ps1 +++ /dev/null @@ -1,83 +0,0 @@ -<# - .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 From c844322e48edd3daf9e53ed640be678fa6347240 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:17:49 -0500 Subject: [PATCH 14/27] Add Circuit cmdlets - New-NetboxCircuit - Get-NetboxCircuitProvider - Get-NetboxCircuitTermination - Get-NetboxCircuitType --- .../Circuits/Circuits/New-NetboxCircuit.ps1 | 67 ++++++++++++++++ .../Providers/Get-NetboxCircuitProvider.ps1 | 72 +++++++++++++++++ .../Get-NetboxCircuitTermination.ps1 | 79 +++++++++++++++++++ .../Circuits/Types/Get-NetboxCircuitType.ps1 | 64 +++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 Functions/Circuits/Circuits/New-NetboxCircuit.ps1 create mode 100644 Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1 create mode 100644 Functions/Circuits/Terminations/Get-NetboxCircuitTermination.ps1 create mode 100644 Functions/Circuits/Types/Get-NetboxCircuitType.ps1 diff --git a/Functions/Circuits/Circuits/New-NetboxCircuit.ps1 b/Functions/Circuits/Circuits/New-NetboxCircuit.ps1 new file mode 100644 index 0000000..aac3447 --- /dev/null +++ b/Functions/Circuits/Circuits/New-NetboxCircuit.ps1 @@ -0,0 +1,67 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 11:48 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxCircuit.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function New-NetboxCircuit { + [CmdletBinding(ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [string]$CID, + + [Parameter(Mandatory = $true)] + [uint32]$Provider, + + [Parameter(Mandatory = $true)] + [uint32]$Type, + + #[ValidateSet('Active', 'Planned', 'Provisioning', 'Offline', 'Deprovisioning', 'Decommissioned ')] + [uint16]$Status = 'Active', + + [string]$Description, + + [uint32]$Tenant, + + [string]$Termination_A, + + [datetime]$Install_Date, + + [string]$Termination_Z, + + [ValidateRange(0, 2147483647)] + [uint32]$Commit_Rate, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits')) + $Method = 'POST' + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + if ($Force -or $PSCmdlet.ShouldProcess($CID, 'Create new circuit')) { + InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + } +} \ No newline at end of file diff --git a/Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1 b/Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1 new file mode 100644 index 0000000..07ad3ca --- /dev/null +++ b/Functions/Circuits/Providers/Get-NetboxCircuitProvider.ps1 @@ -0,0 +1,72 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 12:06 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitProvider.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitProvider { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById', + Mandatory = $true)] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query', + Mandatory = $false)] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$ASN, + + [Parameter(ParameterSetName = 'Query')] + [string]$Account, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers')) + + $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/Circuits/Terminations/Get-NetboxCircuitTermination.ps1 b/Functions/Circuits/Terminations/Get-NetboxCircuitTermination.ps1 new file mode 100644 index 0000000..6e055fd --- /dev/null +++ b/Functions/Circuits/Terminations/Get-NetboxCircuitTermination.ps1 @@ -0,0 +1,79 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 10:22 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitTermination.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitTermination { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById', + ValueFromPipelineByPropertyName = $true)] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Circuit_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Term_Side, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Port_Speed, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [string]$XConnect_ID, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + process { + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations')) + + $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/Circuits/Types/Get-NetboxCircuitType.ps1 b/Functions/Circuits/Types/Get-NetboxCircuitType.ps1 new file mode 100644 index 0000000..bce6ad5 --- /dev/null +++ b/Functions/Circuits/Types/Get-NetboxCircuitType.ps1 @@ -0,0 +1,64 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 12:34 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitType.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitType { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit_types', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-types')) + + $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 From b4803a56970286a54ee9789c3bec8a061f89a934 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:18:23 -0500 Subject: [PATCH 15/27] Update deploy script output path --- deploy.ps1 | 4 +- dist/NetboxPS.psd1 | 127 -- dist/NetboxPS.psm1 | 4376 -------------------------------------------- 3 files changed, 2 insertions(+), 4505 deletions(-) delete mode 100644 dist/NetboxPS.psd1 delete mode 100644 dist/NetboxPS.psm1 diff --git a/deploy.ps1 b/deploy.ps1 index 3d79e2e..5644884 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -40,8 +40,8 @@ Write-Host "Beginning deployment" -ForegroundColor Green $ModuleName = 'NetboxPS' $ConcatenatedFilePath = "$PSScriptRoot\concatenated.ps1" -$PSD1OutputPath = "$PSScriptRoot\dist\$ModuleName.psd1" -$PSM1OutputPath = "$PSScriptRoot\dist\$ModuleName.psm1" +$PSD1OutputPath = "$PSScriptRoot\$ModuleName\$ModuleName.psd1" +$PSM1OutputPath = "$PSScriptRoot\$ModuleName\$ModuleName.psm1" $PS1Files = Get-ChildItem "$PSScriptRoot\Functions" -Filter "*.ps1" -Recurse | Sort-Object Name diff --git a/dist/NetboxPS.psd1 b/dist/NetboxPS.psd1 deleted file mode 100644 index d927485..0000000 --- a/dist/NetboxPS.psd1 +++ /dev/null @@ -1,127 +0,0 @@ -<# - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.148 - Created on: 2/28/2018 11:04 AM - Created by: Ben Claussen - Organization: NEOnet - Filename: NetboxPS.psd1 - ------------------------------------------------------------------------- - Module Manifest - ------------------------------------------------------------------------- - Module Name: NetboxPS - =========================================================================== -#> - - -@{ - - # Script module or binary module file associated with this manifest - RootModule = 'NetboxPS.psm1' - - # Version number of this module. - ModuleVersion = '1.0.4' - - # ID used to uniquely identify this module - GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' - - # Author of this module - Author = 'Ben Claussen' - - # Company or vendor of this module - CompanyName = 'NEOnet' - - # Copyright statement for this module - Copyright = '(c) 2018. All rights reserved.' - - # Description of the functionality provided by this module - Description = 'A Powershell wrapper for Netbox API' - - # Minimum version of the Windows PowerShell engine required by this module - PowerShellVersion = '5.0' - - # Name of the Windows PowerShell host required by this module - PowerShellHostName = '' - - # Minimum version of the Windows PowerShell host required by this module - PowerShellHostVersion = '' - - # Minimum version of the .NET Framework required by this module - DotNetFrameworkVersion = '2.0' - - # Minimum version of the common language runtime (CLR) required by this module - CLRVersion = '2.0.50727' - - # Processor architecture (None, X86, Amd64, IA64) required by this module - ProcessorArchitecture = 'None' - - # Modules that must be imported into the global environment prior to importing - # this module - RequiredModules = @() - - # Assemblies that must be loaded prior to importing this module - RequiredAssemblies = @('System.Web') - - # Script files (.ps1) that are run in the caller's environment prior to - # importing this module - ScriptsToProcess = @() - - # Type files (.ps1xml) to be loaded when importing this module - TypesToProcess = @() - - # Format files (.ps1xml) to be loaded when importing this module - FormatsToProcess = @() - - # Modules to import as nested modules of the module specified in - # ModuleToProcess - NestedModules = @() - - # Functions to export from this module - FunctionsToExport = @('*') #For performanace, list functions explicity - - # Cmdlets to export from this module - CmdletsToExport = '*' - - # Variables to export from this module - VariablesToExport = '*' - - # Aliases to export from this module - AliasesToExport = '*' #For performanace, list alias explicity - - # List of all modules packaged with this module - ModuleList = @() - - # List of all files packaged with this module - FileList = @() - - # Private data to pass to the module specified in ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. - PrivateData = @{ - - #Support for PowerShellGet galleries. - PSData = @{ - - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('Netbox', 'API', 'DCIM', 'IPAM') - - # A URL to the license for this module. - # LicenseUri = '' - - # A URL to the main website for this project. - ProjectUri = 'https://github.com/benclaussen/NetboxPS' - - # A URL to an icon representing this module. - # IconUri = '' - - # ReleaseNotes of this module - # ReleaseNotes = '' - - } # End of PSData hashtable - - } # End of PrivateData hashtable -} - - - - - - - diff --git a/dist/NetboxPS.psm1 b/dist/NetboxPS.psm1 deleted file mode 100644 index de2e468..0000000 --- a/dist/NetboxPS.psm1 +++ /dev/null @@ -1,4376 +0,0 @@ - - -#region File 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 File 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 File 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 File BuildNewURI.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:22 - Created by: Claussen - Organization: NEOnet - Filename: BuildNewURI.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 -} - -#endregion - -#region File BuildURIComponents.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: BuildURIComponents.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - } -} - -#endregion - -#region File CheckNetboxIsConnected.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:22 - Created by: Claussen - Organization: NEOnet - Filename: CheckNetboxIsConnected.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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'" - } -} - -#endregion - -#region File 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 -#> - - - -#endregion - -#region File Connect-NetboxAPI.ps1 - -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 File CreateEnum.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:25 - Created by: Claussen - Organization: NEOnet - Filename: CreateEnum.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - -#region File GetChoiceValidValues.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: GetChoiceValidValues.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 -} - -#endregion - -#region File GetNetboxAPIErrorBody.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: GetNetboxAPIErrorBody.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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() -} - -#endregion - -#region File 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 - -#region File 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 File GetNetboxConfigVariable.ps1 - -function GetNetboxConfigVariable { - return $script:NetboxConfig -} - -#endregion - -#region File Get-NetboxCredential.ps1 - -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 -} - -#endregion - -#region File 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 File 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 File 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 File 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 File 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 File 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 File 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 File Get-NetboxExtrasChoices.ps1 - -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 File Get-NetboxHostname.ps1 - -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 -} - -#endregion - -#region File Get-NetboxIPAMAddress.ps1 - -function Get-NetboxIPAMAddress { - [CmdletBinding()] - param - ( - [string]$Address, - - [uint16[]]$Id, - - [string]$Query, - - [object]$Family, - - [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, - - [uint16]$Limit, - - [uint16]$Offset, - - [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 File 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 File Get-NetboxIPAMAvailableIP.ps1 - -<# - .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 -} - -#endregion - -#region File 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 File Get-NetboxIPAMPrefix.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: 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 Query - A description of the Query parameter. - - .PARAMETER Id - A description of the Id parameter. - - .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 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 - ( - [string]$Prefix, - - [string]$Query, - - [uint16[]]$Id, - - [object]$Family, - - [boolean]$Is_Pool, - - [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, - - [uint16]$Limit, - - [uint16]$Offset, - - [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 - -#region File 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 File 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 File 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 File 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 File 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 File 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 File Get-NetboxVirtualizationClusterGroup.ps1 - -<# - .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 -} - -#endregion - -#region File 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 - ( - [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, - - [uint16]$Limit, - - [uint16]$Offset, - - [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 File 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 File InvokeNetboxRequest.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:24 - Created by: Claussen - Organization: NEOnet - Filename: InvokeNetboxRequest.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - } - } -} - -#endregion - -#region File 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 File 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 File 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 File New-NetboxIPAMVLAN.ps1 - -function New-NetboxIPAMVLAN { -<# - .SYNOPSIS - Create a new VLAN - - .DESCRIPTION - Create a new VLAN in Netbox with a status of Active by default. - - .PARAMETER VID - The VLAN ID. - - .PARAMETER Name - The name of the VLAN. - - .PARAMETER Status - Status of the VLAN. Defaults to Active - - .PARAMETER Tenant - Tenant ID - - .PARAMETER Role - Role such as anycast, loopback, etc... Defaults to nothing - - .PARAMETER Description - Description of IP address - - .PARAMETER Custom_Fields - Custom field hash table. Will be validated by the API service - - .PARAMETER Raw - Return raw results from API service - - .PARAMETER Address - IP address in CIDR notation: 192.168.1.1/24 - - .EXAMPLE - PS C:\> Create-NetboxIPAMAddress - - .NOTES - Additional information about the function. -#> - - [CmdletBinding()] - [OutputType([pscustomobject])] - param - ( - [Parameter(Mandatory = $true)] - [uint16]$VID, - - [Parameter(Mandatory = $true)] - [string]$Name, - - [object]$Status = 'Active', - - [uint16]$Tenant, - - [object]$Role, - - [string]$Description, - - [hashtable]$Custom_Fields, - - [switch]$Raw - ) - - $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus - - if ($null -ne $Role) { - $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole - } - - $segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) - - $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw -} - -#endregion - -#region File 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 File 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 File 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 File 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 File 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 File Remove-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: 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 { - - } -} - -#endregion - -#region File Set-NetboxCredential.ps1 - -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 - } -} - -#endregion - -#region File 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 File 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 File 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 File Set-NetboxHostName.ps1 - -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 - } -} - -#endregion - -#region File 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 File 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 File 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 File SetupNetboxConfigVariable.ps1 - -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 - -#region File Tenancy.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 - Organization: NEOnet - Filename: Tenancy.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - - - -#region GET commands - - - -#endregion GET commands - - -#region SET commands - -#endregion SET commands - - -#region ADD/NEW commands - -#endregion ADD/NEW commands - - -#region REMOVE commands - -#endregion REMOVE commands - -#endregion - -#region File ThrowNetboxRESTError.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:25 - Created by: Claussen - Organization: NEOnet - Filename: ThrowNetboxRESTError.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -function ThrowNetboxRESTError { - $uriSegments = [System.Collections.ArrayList]::new(@('fake', 'url')) - - $URIParameters = @{ - } - - $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters - - InvokeNetboxRequest -URI $uri -Raw -} - -#endregion - -#region File ValidateChoice.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: ValidateChoice.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - } - } -} - -#endregion - -#region File 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 File ValidateIPAMChoice.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: ValidateIPAMChoice.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 File 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 File VerifyAPIConnectivity.ps1 - -function VerifyAPIConnectivity { - [CmdletBinding()] - param () - - $uriSegments = [System.Collections.ArrayList]::new(@('extras', '_choices')) - - $uri = BuildNewURI -Segments $uriSegments -SkipConnectedCheck - - InvokeNetboxRequest -URI $uri -} - -#endregion - -<# - .NOTES - -------------------------------------------------------------------------------- - Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Generated on: 3/26/2020 15:16 - Generated by: Claussen - Organization: NEOnet - -------------------------------------------------------------------------------- - .DESCRIPTION - Script generated by PowerShell Studio 2020 -#> - -# 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 *-* From cc52fdc844f43541a098be54fc9ce62418d4b060 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:19:46 -0500 Subject: [PATCH 16/27] Update Set-NetboxIPAMAddress - Replace Interface parameter with Assigned_Object_Type and Assigned_Object_Id - Add validation logic for Assigned_Object_ parameters - Change Status parameter to string --- .../IPAM/Address/Set-NetboxIPAMAddress.ps1 | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 index 5b8614e..42c9214 100644 --- a/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 +++ b/Functions/IPAM/Address/Set-NetboxIPAMAddress.ps1 @@ -23,7 +23,7 @@ function Set-NetboxIPAMAddress { [string]$Address, - [object]$Status, + [string]$Status, [uint16]$Tenant, @@ -35,7 +35,10 @@ function Set-NetboxIPAMAddress { [hashtable]$Custom_Fields, - [uint16]$Interface, + [ValidateSet('dcim.interface', 'virtualization.vminterface', IgnoreCase = $true)] + [string]$Assigned_Object_Type, + + [uint16]$Assigned_Object_Id, [string]$Description, @@ -43,28 +46,34 @@ function Set-NetboxIPAMAddress { ) begin { -# Write-Verbose "Validating enum properties" -# $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) + # Write-Verbose "Validating enum properties" + # $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) $Method = 'PATCH' -# -# # Value validation -# $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method -# $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition -# -# foreach ($Property in $EnumProperties.Keys) { -# if ($PSBoundParameters.ContainsKey($Property)) { -# Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" -# $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property -# } else { -# Write-Verbose "User did not provide a value for [$Property]" -# } -# } -# -# Write-Verbose "Finished enum validation" + # + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } else { + # Write-Verbose "User did not provide a value for [$Property]" + # } + # } + # + # Write-Verbose "Finished enum validation" } process { foreach ($IPId in $Id) { + if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id))-and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) { + throw "Assigned_Object_Type is required when specifying Assigned_Object_Id" + } elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { + throw "Assigned_Object_Id is required when specifying Assigned_Object_Type" + } + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) Write-Verbose "Obtaining IP from ID $IPId" From ae9371e8833ecb305ab3f5c67d05d1c57cd83a8f Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:20:15 -0500 Subject: [PATCH 17/27] Add Get-ModelDefinition function --- Functions/Helpers/Get-ModelDefinition.ps1 | 64 +++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Functions/Helpers/Get-ModelDefinition.ps1 diff --git a/Functions/Helpers/Get-ModelDefinition.ps1 b/Functions/Helpers/Get-ModelDefinition.ps1 new file mode 100644 index 0000000..bf389fa --- /dev/null +++ b/Functions/Helpers/Get-ModelDefinition.ps1 @@ -0,0 +1,64 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 14:23 + Created by: Claussen + Organization: NEOnet + Filename: Get-ModelDefinition.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-ModelDefinition { + [CmdletBinding(DefaultParameterSetName = 'ByName')] + param + ( + [Parameter(ParameterSetName = 'ByName', + Mandatory = $true)] + [string]$ModelName, + + [Parameter(ParameterSetName = 'ByPath', + Mandatory = $true)] + [string]$URIPath, + + [Parameter(ParameterSetName = 'ByPath')] + [string]$Method = "post" + ) + + switch ($PsCmdlet.ParameterSetName) { + 'ByName' { + $script:NetboxConfig.APIDefinition.definitions.$ModelName + break + } + + 'ByPath' { + switch ($Method) { + "get" { + + break + } + + "post" { + if (-not $URIPath.StartsWith('/')) { + $URIPath = "/$URIPath" + } + + if (-not $URIPath.EndsWith('/')) { + $URIPath = "$URIPath/" + } + + $ModelName = $script:NetboxConfig.APIDefinition.paths.$URIPath.post.parameters.schema.'$ref'.split('/')[-1] + $script:NetboxConfig.APIDefinition.definitions.$ModelName + break + } + } + + break + } + } + +} From 3b82f91fc00d08f8aebfe38b435ddddf59f56382 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Fri, 13 Nov 2020 12:20:35 -0500 Subject: [PATCH 18/27] Update psproj --- NetboxPS.psproj | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/NetboxPS.psproj b/NetboxPS.psproj index 1ebbd3b..8551fec 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -25,6 +25,10 @@ Functions\Setup\Support Tests Functions\DCIM\Sites + Functions\Circuits\Circuits + Functions\Circuits\Providers + Functions\Circuits\Types + Functions\Circuits\Terminations NetboxPS.psd1 @@ -102,10 +106,15 @@ Functions\DCIM\Get-NetboxDCIMPlatform.ps1 Functions\DCIM\Get-NetboxDCIMChoices.ps1 Functions\Circuits\Get-NetboxCircuitsChoices.ps1 - Functions\Circuits\Get-NetboxCircuit.ps1 + Functions\Circuits\Circuits\Get-NetboxCircuit.ps1 deploy.ps1 Functions\Setup\Support\Get-NetboxAPIDefinition.ps1 Functions\DCIM\Sites\Get-NetboxDCIMSite.ps1 + Functions\Circuits\Terminations\Get-NetboxCircuitTermination.ps1 + Functions\Circuits\Circuits\New-NetboxCircuit.ps1 + Functions\Circuits\Providers\Get-NetboxCircuitProvider.ps1 + Functions\Circuits\Types\Get-NetboxCircuitType.ps1 + Functions\Helpers\Get-ModelDefinition.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file From 7badb7cda84e94abae5e06ae3c53b3707b9c9cf7 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 8 Dec 2020 11:45:20 -0500 Subject: [PATCH 19/27] Update deploy.ps1 variables --- deploy.ps1 | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/deploy.ps1 b/deploy.ps1 index 5644884..bb9e2cb 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -40,15 +40,17 @@ Write-Host "Beginning deployment" -ForegroundColor Green $ModuleName = 'NetboxPS' $ConcatenatedFilePath = "$PSScriptRoot\concatenated.ps1" -$PSD1OutputPath = "$PSScriptRoot\$ModuleName\$ModuleName.psd1" -$PSM1OutputPath = "$PSScriptRoot\$ModuleName\$ModuleName.psm1" +$FunctionPath = "$PSScriptRoot\Functions" +$OutputDirectory = "$PSScriptRoot\$ModuleName" +$PSD1OutputPath = "$OutputDirectory\$ModuleName.psd1" +$PSM1OutputPath = "$OutputDirectory\$ModuleName.psm1" -$PS1Files = Get-ChildItem "$PSScriptRoot\Functions" -Filter "*.ps1" -Recurse | Sort-Object Name +$PS1Files = Get-ChildItem $FunctionPath -Filter "*.ps1" -Recurse | Sort-Object Name "" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 $Counter = 0 -Write-Host "Concatenating [$($PS1Files.Count)] PS1 files from $PSScriptRoot\Functions" +Write-Host "Concatenating [$($PS1Files.Count)] PS1 files from $FunctionPath" foreach ($File in $PS1Files) { $Counter++ @@ -109,6 +111,16 @@ switch ($PSCmdlet.ParameterSetName) { } } + +if (-not (Test-Path $OutputDirectory)) { + try { + Write-Warning "Creating path [$OutputDirectory]" + $null = New-Item -Path $OutputDirectory -ItemType Directory -Force + } catch { + throw "Failed to create directory [$OutputDirectory]: $($_.Exception.Message)" + } +} + Write-Host " Copying psd1" Copy-Item -Path "$PSScriptRoot\$ModuleName.psd1" -Destination $PSD1OutputPath -Force From f29701ad2f1909f6395e99cb34192998bae1262f Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 8 Dec 2020 12:00:26 -0500 Subject: [PATCH 20/27] Update exported files --- NetboxPS.psd1 | 4 +- NetboxPS/NetboxPS.psd1 | 132 + NetboxPS/NetboxPS.psm1 | 5213 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 5347 insertions(+), 2 deletions(-) create mode 100644 NetboxPS/NetboxPS.psd1 create mode 100644 NetboxPS/NetboxPS.psm1 diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index 179e675..244e33d 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -3,7 +3,7 @@ # # Generated by: Ben Claussen # -# Generated on: 2020-10-05 +# Generated on: 2020-12-08 # @{ @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.2.0' +ModuleVersion = '1.2.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS/NetboxPS.psd1 b/NetboxPS/NetboxPS.psd1 new file mode 100644 index 0000000..244e33d --- /dev/null +++ b/NetboxPS/NetboxPS.psd1 @@ -0,0 +1,132 @@ +# +# Module manifest for module 'NetboxPS' +# +# Generated by: Ben Claussen +# +# Generated on: 2020-12-08 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'NetboxPS.psm1' + +# Version number of this module. +ModuleVersion = '1.2.1' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = 'bba9b06c-49c8-47cf-8358-aca7c4e78896' + +# Author of this module +Author = 'Ben Claussen' + +# Company or vendor of this module +CompanyName = 'NEOnet' + +# Copyright statement for this module +Copyright = '(c) 2018. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'A Powershell wrapper for Netbox API' + +# Minimum version of the Windows PowerShell engine required by this module +PowerShellVersion = '5.0' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +DotNetFrameworkVersion = '2.0' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +CLRVersion = '2.0.50727' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +RequiredAssemblies = 'System.Web' + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +NestedModules = @() + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = '*' + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = 'Netbox','API','DCIM','IPAM' + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/benclaussen/NetboxPS' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + # Prerelease = '' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + + } # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/NetboxPS/NetboxPS.psm1 b/NetboxPS/NetboxPS.psm1 new file mode 100644 index 0000000..adad955 --- /dev/null +++ b/NetboxPS/NetboxPS.psm1 @@ -0,0 +1,5213 @@ + + +#region File 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 File 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 File 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 File BuildNewURI.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:22 + Created by: Claussen + Organization: NEOnet + Filename: BuildNewURI.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 +} + +#endregion + +#region File BuildURIComponents.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:23 + Created by: Claussen + Organization: NEOnet + Filename: BuildURIComponents.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 + } +} + +#endregion + +#region File CheckNetboxIsConnected.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:22 + Created by: Claussen + Organization: NEOnet + Filename: CheckNetboxIsConnected.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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'" + } +} + +#endregion + +#region File 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 +#> + + + +#endregion + +#region File Connect-NetboxAPI.ps1 + +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 + } 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 API definition" + $script:NetboxConfig.APIDefinition = Get-NetboxAPIDefinition + + if ([version]$script:NetboxConfig.APIDefinition.info.version -lt 2.8) { + $Script:NetboxConfig.Connected = $false + throw "Netbox version is incompatible with this PS module. Requires >=2.8.*, found version $($script:NetboxConfig.APIDefinition.info.version)" + } + + $script:NetboxConfig.Connected = $true + Write-Verbose "Successfully connected!" + + #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 File CreateEnum.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:25 + Created by: Claussen + Organization: NEOnet + Filename: CreateEnum.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 + +#region File GetChoiceValidValues.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:23 + Created by: Claussen + Organization: NEOnet + Filename: GetChoiceValidValues.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 +} + +#endregion + +#region File Get-ModelDefinition.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 14:23 + Created by: Claussen + Organization: NEOnet + Filename: Get-ModelDefinition.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-ModelDefinition { + [CmdletBinding(DefaultParameterSetName = 'ByName')] + param + ( + [Parameter(ParameterSetName = 'ByName', + Mandatory = $true)] + [string]$ModelName, + + [Parameter(ParameterSetName = 'ByPath', + Mandatory = $true)] + [string]$URIPath, + + [Parameter(ParameterSetName = 'ByPath')] + [string]$Method = "post" + ) + + switch ($PsCmdlet.ParameterSetName) { + 'ByName' { + $script:NetboxConfig.APIDefinition.definitions.$ModelName + break + } + + 'ByPath' { + switch ($Method) { + "get" { + + break + } + + "post" { + if (-not $URIPath.StartsWith('/')) { + $URIPath = "/$URIPath" + } + + if (-not $URIPath.EndsWith('/')) { + $URIPath = "$URIPath/" + } + + $ModelName = $script:NetboxConfig.APIDefinition.paths.$URIPath.post.parameters.schema.'$ref'.split('/')[-1] + $script:NetboxConfig.APIDefinition.definitions.$ModelName + break + } + } + + break + } + } + +} + +#endregion + +#region File Get-NetboxAPIDefinition.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.174 + Created on: 4/28/2020 11:57 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxAPIDefinition.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxAPIDefinition { + [CmdletBinding()] + param () + + #$URI = "https://netbox.neonet.org/api/docs/?format=openapi" + + $Segments = [System.Collections.ArrayList]::new(@('docs')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary @{'format' = 'openapi'} + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters -SkipConnectedCheck + + InvokeNetboxRequest -URI $URI -Timeout 10 +} + +#endregion + +#region File GetNetboxAPIErrorBody.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:23 + Created by: Claussen + Organization: NEOnet + Filename: GetNetboxAPIErrorBody.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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() +} + +#endregion + +#region File 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 Id + Database ID of circuit. This will query for exactly the IDs provided + + .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 Limit + A description of the Limit parameter. + + .PARAMETER Offset + A description of the Offset parameter. + + .PARAMETER Raw + A description of the Raw parameter. + + .PARAMETER ID__IN + Multiple unique DB IDs to retrieve + + .EXAMPLE + PS C:\> Get-NetboxCircuit + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$CID, + + [Parameter(ParameterSetName = 'Query')] + [datetime]$InstallDate, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$CommitRate, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [object]$Provider, + + [Parameter(ParameterSetName = 'Query')] + [object]$Type, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} + +#endregion + +#region File Get-NetboxCircuitProvider.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 12:06 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitProvider.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitProvider { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById', + Mandatory = $true)] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query', + Mandatory = $false)] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$ASN, + + [Parameter(ParameterSetName = 'Query')] + [string]$Account, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'providers')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} + +#endregion + +#region File 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 File Get-NetboxCircuitTermination.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 10:22 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitTermination.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitTermination { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById', + ValueFromPipelineByPropertyName = $true)] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Circuit_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Term_Side, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Port_Speed, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [string]$XConnect_ID, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + process { + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-terminations')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + } +} + +#endregion + +#region File Get-NetboxCircuitType.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 12:34 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxCircuitType.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxCircuitType { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'ById')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($i in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit_types', $i)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuit-types')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} + +#endregion + +#region File GetNetboxConfigVariable.ps1 + +function GetNetboxConfigVariable { + return $script:NetboxConfig +} + +#endregion + +#region File Get-NetboxCredential.ps1 + +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 +} + +#endregion + +#region File 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 File 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 File 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 File 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 File 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 File 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 File 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 File Get-NetboxDCIMSite.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-10-02 15:52 + Created by: Claussen + Organization: NEOnet + Filename: Get-NetboxDCIMSite.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function Get-NetboxDCIMSite { + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(ParameterSetName = 'ByID', ValueFromPipelineByPropertyName = $true)] + [uint32]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$Facility, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$ASN, + + [Parameter(ParameterSetName = 'Query')] + [decimal]$Latitude, + + [Parameter(ParameterSetName = 'Query')] + [decimal]$Longitude, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Phone, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contact_Email, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Group_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant_Group, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [string]$Status, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Region_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Region, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Site_ID in $ID) { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites', $Site_Id)) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName "Id" + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('dcim', 'sites')) + + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $URI -Raw:$Raw + } + } +} + + +#endregion + +#region File Get-NetboxExtrasChoices.ps1 + +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 File Get-NetboxHostname.ps1 + +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 +} + +#endregion + +#region File Get-NetboxIPAMAddress.ps1 + +function Get-NetboxIPAMAddress { + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [string]$Address, + + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [object]$Family, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Parent, + + [Parameter(ParameterSetName = 'Query')] + [byte]$Mask_Length, + + [Parameter(ParameterSetName = 'Query')] + [string]$VRF, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$VRF_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Device, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Device_ID, + + [Parameter(ParameterSetName = 'Query')] + [string]$Virtual_Machine, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Virtual_Machine_Id, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Interface_Id, + + [Parameter(ParameterSetName = 'Query')] + [object]$Status, + + [Parameter(ParameterSetName = 'Query')] + [object]$Role, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($IP_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IP_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } +} + +#endregion + +#region File 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(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'ByID')] + [uint16[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Prefix, + + [Parameter(ParameterSetName = 'Query')] + [object]$Family, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$RIR_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$RIR, + + [Parameter(ParameterSetName = 'Query')] + [datetime]$Date_Added, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + +# if ($null -ne $Family) { +# $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -AggregateFamily + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($IP_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates', $IP_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + break + } + + default { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'aggregates')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + + break + } + } +} + +#endregion + +#region File Get-NetboxIPAMAvailableIP.ps1 + +<# + .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 +} + +#endregion + +#region File 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 File Get-NetboxIPAMPrefix.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: 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 Query + A description of the Query parameter. + + .PARAMETER Id + A description of the Id parameter. + + .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 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(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [string]$Prefix, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [object]$Family, + + [Parameter(ParameterSetName = 'Query')] + [boolean]$Is_Pool, + + [Parameter(ParameterSetName = 'Query')] + [string]$Within, + + [Parameter(ParameterSetName = 'Query')] + [string]$Within_Include, + + [Parameter(ParameterSetName = 'Query')] + [string]$Contains, + + [Parameter(ParameterSetName = 'Query')] + [ValidateRange(0, 127)] + [byte]$Mask_Length, + + [Parameter(ParameterSetName = 'Query')] + [string]$VRF, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$VRF_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Site_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Vlan_VId, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Vlan_Id, + + [Parameter(ParameterSetName = 'Query')] + [object]$Status, + + [Parameter(ParameterSetName = 'Query')] + [string]$Role, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Role_Id, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + # if ($null -ne $Family) { + # $PSBoundParameters.Family = ValidateIPAMChoice -ProvidedValue $Family -PrefixFamily + # } + # + # if ($null -ne $Status) { + # $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -PrefixStatus + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Prefix_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $Prefix_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } +} + +#endregion + +#region File 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 + ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [switch]$Brief, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Role_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'roles', $Role_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } +} + +#endregion + +#region File 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 + ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [ValidateRange(1, 4096)] + [uint16]$VID, + + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Name, + + [Parameter(ParameterSetName = 'Query')] + [string]$Tenant, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Tenant_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$TenantGroup, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$TenantGroup_Id, + + [Parameter(ParameterSetName = 'Query')] + [object]$Status, + + [Parameter(ParameterSetName = 'Query')] + [string]$Region, + + [Parameter(ParameterSetName = 'Query')] + [string]$Site, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Site_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Group, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Group_Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Role, + + [Parameter(ParameterSetName = 'Query')] + [uint32]$Role_Id, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + # if ($null -ne $Status) { + # $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus + # } + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($VLAN_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans', $VLAN_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } +} + + + + + +#endregion + +#region File 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 File 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 { +<# + .SYNOPSIS + Get a tenent from Netbox + + .DESCRIPTION + A detailed description of the Get-NetboxTenant function. + + .PARAMETER Name + The specific name of the tenant. Must match exactly as is defined in Netbox + + .PARAMETER Id + The database ID of the tenant + + .PARAMETER Query + A standard search query that will match one or more tenants. + + .PARAMETER Slug + The specific slug of the tenant. Must match exactly as is defined in Netbox + + .PARAMETER Group + The specific group as defined in Netbox. + + .PARAMETER GroupID + The database ID of the group in Netbox + + .PARAMETER CustomFields + Hashtable in the format @{"field_name" = "value"} to search + + .PARAMETER Limit + Limit the number of results to this number + + .PARAMETER Offset + Start the search at this index in results + + .PARAMETER Raw + Return the unparsed data from the HTTP request + + .EXAMPLE + PS C:\> Get-NetboxTenant + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(DefaultParameterSetName = 'Query')] + param + ( + [Parameter(ParameterSetName = 'Query', + Position = 0)] + [string]$Name, + + [Parameter(ParameterSetName = 'ByID')] + [uint32[]]$Id, + + [Parameter(ParameterSetName = 'Query')] + [string]$Query, + + [Parameter(ParameterSetName = 'Query')] + [string]$Slug, + + [Parameter(ParameterSetName = 'Query')] + [string]$Group, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$GroupID, + + [Parameter(ParameterSetName = 'Query')] + [hashtable]$CustomFields, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Limit, + + [Parameter(ParameterSetName = 'Query')] + [uint16]$Offset, + + [switch]$Raw + ) + + switch ($PSCmdlet.ParameterSetName) { + 'ById' { + foreach ($Tenant_ID in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('tenancy', 'tenants', $Tenant_ID)) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw + } + + break + } + + default { + $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 + + break + } + } +} + +#endregion + +#region File 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 File 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 + ( + [string]$Name, + + [Alias('q')] + [string]$Query, + + [uint16[]]$Id, + + [string]$Group, + + [uint16]$Group_Id, + + [string]$Type, + + [uint16]$Type_Id, + + [string]$Site, + + [uint16]$Site_Id, + + [uint16]$Limit, + + [uint16]$Offset, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'clusters')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} + +#endregion + +#region File Get-NetboxVirtualizationClusterGroup.ps1 + +<# + .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 + ( + [string]$Name, + + [string]$Slug, + + [string]$Description, + + [string]$Query, + + [uint32[]]$Id, + + [uint16]$Limit, + + [uint16]$Offset, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('virtualization', 'cluster-groups')) + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters + + InvokeNetboxRequest -URI $uri -Raw:$Raw +} + +#endregion + +#region File 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 + ( + [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, + + [uint16]$Limit, + + [uint16]$Offset, + + [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 File 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 + ( + [Parameter(ValueFromPipeline = $true)] + [uint16]$Id, + + [string]$Name, + + [string]$Query, + + [boolean]$Enabled, + + [uint16]$MTU, + + [uint16]$Virtual_Machine_Id, + + [string]$Virtual_Machine, + + [string]$MAC_Address, + + [uint16]$Limit, + + [uint16]$Offset, + + [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 File InvokeNetboxRequest.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:24 + Created by: Claussen + Organization: NEOnet + Filename: InvokeNetboxRequest.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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', 'OPTIONS', 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 + } + } +} + +#endregion + +#region File New-NetboxCircuit.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.181 + Created on: 2020-11-04 11:48 + Created by: Claussen + Organization: NEOnet + Filename: New-NetboxCircuit.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + +function New-NetboxCircuit { + [CmdletBinding(ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [string]$CID, + + [Parameter(Mandatory = $true)] + [uint32]$Provider, + + [Parameter(Mandatory = $true)] + [uint32]$Type, + + #[ValidateSet('Active', 'Planned', 'Provisioning', 'Offline', 'Deprovisioning', 'Decommissioned ')] + [uint16]$Status = 'Active', + + [string]$Description, + + [uint32]$Tenant, + + [string]$Termination_A, + + [datetime]$Install_Date, + + [string]$Termination_Z, + + [ValidateRange(0, 2147483647)] + [uint32]$Commit_Rate, + + [string]$Comments, + + [hashtable]$Custom_Fields, + + [switch]$Force, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('circuits', 'circuits')) + $Method = 'POST' + + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + if ($Force -or $PSCmdlet.ShouldProcess($CID, 'Create new circuit')) { + InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + } +} + +#endregion + +#region File 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 File 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 Force + Do not prompt for confirmation to create IP. + + .PARAMETER Raw + Return raw results from API service + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. +#> + + [CmdletBinding(ConfirmImpact = 'Low', + SupportsShouldProcess = $true)] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [string]$Address, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [uint16]$Interface, + + [string]$Description, + + [switch]$Force, + + [switch]$Raw + ) + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + $Method = 'POST' + + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } + # } + # + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + if ($Force -or $PSCmdlet.ShouldProcess($Address, 'Create new IP address')) { + InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + } +} + + + + + + +#endregion + +#region File 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 File New-NetboxIPAMVLAN.ps1 + +function New-NetboxIPAMVLAN { +<# + .SYNOPSIS + Create a new VLAN + + .DESCRIPTION + Create a new VLAN in Netbox with a status of Active by default. + + .PARAMETER VID + The VLAN ID. + + .PARAMETER Name + The name of the VLAN. + + .PARAMETER Status + Status of the VLAN. Defaults to Active + + .PARAMETER Tenant + Tenant ID + + .PARAMETER Role + Role such as anycast, loopback, etc... Defaults to nothing + + .PARAMETER Description + Description of IP address + + .PARAMETER Custom_Fields + Custom field hash table. Will be validated by the API service + + .PARAMETER Raw + Return raw results from API service + + .PARAMETER Address + IP address in CIDR notation: 192.168.1.1/24 + + .EXAMPLE + PS C:\> Create-NetboxIPAMAddress + + .NOTES + Additional information about the function. +#> + + [CmdletBinding()] + [OutputType([pscustomobject])] + param + ( + [Parameter(Mandatory = $true)] + [uint16]$VID, + + [Parameter(Mandatory = $true)] + [string]$Name, + + [object]$Status = 'Active', + + [uint16]$Tenant, + + [object]$Role, + + [string]$Description, + + [hashtable]$Custom_Fields, + + [switch]$Raw + ) + +# $PSBoundParameters.Status = ValidateIPAMChoice -ProvidedValue $Status -VLANStatus +# +# if ($null -ne $Role) { +# $PSBoundParameters.Role = ValidateIPAMChoice -ProvidedValue $Role -IPAddressRole +# } + + $segments = [System.Collections.ArrayList]::new(@('ipam', 'vlans')) + + $URIComponents = BuildURIComponents -URISegments $segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Method POST -Body $URIComponents.Parameters -Raw:$Raw +} + +#endregion + +#region File 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 + ) + +# $ModelDefinition = $script:NetboxConfig.APIDefinition.definitions.WritableVirtualMachineWithConfigContext +# +# # Validate the status against the APIDefinition +# if ($ModelDefinition.properties.status.enum -inotcontains $Status) { +# throw ("Invalid value [] for Status. Must be one of []" -f $Status, ($ModelDefinition.properties.status.enum -join ', ')) +# } +# + #$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 File 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 File 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 File 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 File 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 + ) + + 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 + } + } + } +} + +#endregion + +#region File Remove-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: 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 { + + } +} + +#endregion + +#region File Set-NetboxCredential.ps1 + +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 + } +} + +#endregion + +#region File 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 File 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 File 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 File Set-NetboxHostName.ps1 + +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 + } +} + +#endregion + +#region File 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, + + [string]$Status, + + [uint16]$Tenant, + + [uint16]$VRF, + + [object]$Role, + + [uint16]$NAT_Inside, + + [hashtable]$Custom_Fields, + + [ValidateSet('dcim.interface', 'virtualization.vminterface', IgnoreCase = $true)] + [string]$Assigned_Object_Type, + + [uint16]$Assigned_Object_Id, + + [string]$Description, + + [switch]$Force + ) + + begin { + # Write-Verbose "Validating enum properties" + # $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) + $Method = 'PATCH' + # + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } else { + # Write-Verbose "User did not provide a value for [$Property]" + # } + # } + # + # Write-Verbose "Finished enum validation" + } + + process { + foreach ($IPId in $Id) { + if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id))-and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) { + throw "Assigned_Object_Type is required when specifying Assigned_Object_Id" + } elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { + throw "Assigned_Object_Id is required when specifying Assigned_Object_Type" + } + + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) + + Write-Verbose "Obtaining IP 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 $Method + } + } + } +} + +#endregion + +#region File 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($ID, "Set properties on VM ID")) { + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method PATCH + } +} + +#endregion + +#region File 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 File SetupNetboxConfigVariable.ps1 + +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' = @{ + } + 'APIDefinition' = $null + } + } + + Write-Verbose "NetboxConfig hashtable already exists" +} + +#endregion + +#region File Tenancy.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 + Organization: NEOnet + Filename: Tenancy.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + + + +#region GET commands + + + +#endregion GET commands + + +#region SET commands + +#endregion SET commands + + +#region ADD/NEW commands + +#endregion ADD/NEW commands + + +#region REMOVE commands + +#endregion REMOVE commands + +#endregion + +#region File ThrowNetboxRESTError.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:25 + Created by: Claussen + Organization: NEOnet + Filename: ThrowNetboxRESTError.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function ThrowNetboxRESTError { + $uriSegments = [System.Collections.ArrayList]::new(@('fake', 'url')) + + $URIParameters = @{ + } + + $uri = BuildNewURI -Segments $uriSegments -Parameters $URIParameters + + InvokeNetboxRequest -URI $uri -Raw +} + +#endregion + +#region File ValidateChoice.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Created on: 3/26/2020 14:23 + Created by: Claussen + Organization: NEOnet + Filename: ValidateChoice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 + } + } +} + +#endregion + +#region File 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 File ValidateIPAMChoice.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: ValidateIPAMChoice.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +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 File 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 File VerifyAPIConnectivity.ps1 + +function VerifyAPIConnectivity { + [CmdletBinding()] + param () + + $uriSegments = [System.Collections.ArrayList]::new(@('extras')) + + $uri = BuildNewURI -Segments $uriSegments -Parameters @{'format' = 'json'} -SkipConnectedCheck + + InvokeNetboxRequest -URI $uri +} + +#endregion + +<# + .NOTES + -------------------------------------------------------------------------------- + Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 + Generated on: 3/26/2020 15:16 + Generated by: Claussen + Organization: NEOnet + -------------------------------------------------------------------------------- + .DESCRIPTION + Script generated by PowerShell Studio 2020 +#> + +# 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 *-* From acbbb284d32c467e8e4dff8346860f3be9780116 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 8 Dec 2020 12:11:44 -0500 Subject: [PATCH 21/27] Remove references to `_choices` API calls --- .../Circuits/Get-NetboxCircuitsChoices.ps1 | 38 -- Functions/DCIM/Get-NetboxDCIMChoices.ps1 | 25 - Functions/DCIM/ValidateDCIMChoice.ps1 | 102 --- Functions/Extras/Get-NetboxExtrasChoices.ps1 | 11 - Functions/Helpers/GetChoiceValidValues.ps1 | 41 -- Functions/Helpers/ValidateChoice.ps1 | 76 --- Functions/IPAM/Get-NetboxIPAMChoices.ps1 | 25 - Functions/IPAM/ValidateIPAMChoice.ps1 | 109 ---- .../Tenancy/Get-NetboxTenancyChoices.ps1 | 25 - .../Get-NetboxVirtualizationChoices.ps1 | 25 - .../ValidateVirtualizationChoice.ps1 | 76 --- NetboxPS.psd1 | 2 +- NetboxPS.psproj | 12 - NetboxPS/NetboxPS.psd1 | 2 +- NetboxPS/NetboxPS.psm1 | 608 ------------------ 15 files changed, 2 insertions(+), 1175 deletions(-) delete mode 100644 Functions/Circuits/Get-NetboxCircuitsChoices.ps1 delete mode 100644 Functions/DCIM/Get-NetboxDCIMChoices.ps1 delete mode 100644 Functions/DCIM/ValidateDCIMChoice.ps1 delete mode 100644 Functions/Extras/Get-NetboxExtrasChoices.ps1 delete mode 100644 Functions/Helpers/GetChoiceValidValues.ps1 delete mode 100644 Functions/Helpers/ValidateChoice.ps1 delete mode 100644 Functions/IPAM/Get-NetboxIPAMChoices.ps1 delete mode 100644 Functions/IPAM/ValidateIPAMChoice.ps1 delete mode 100644 Functions/Tenancy/Get-NetboxTenancyChoices.ps1 delete mode 100644 Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 delete mode 100644 Functions/Virtualization/ValidateVirtualizationChoice.ps1 diff --git a/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 b/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 deleted file mode 100644 index 67fbbdf..0000000 --- a/Functions/Circuits/Get-NetboxCircuitsChoices.ps1 +++ /dev/null @@ -1,38 +0,0 @@ -<# - .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/Get-NetboxDCIMChoices.ps1 b/Functions/DCIM/Get-NetboxDCIMChoices.ps1 deleted file mode 100644 index 55104dd..0000000 --- a/Functions/DCIM/Get-NetboxDCIMChoices.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -<# - .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/ValidateDCIMChoice.ps1 b/Functions/DCIM/ValidateDCIMChoice.ps1 deleted file mode 100644 index 25b3130..0000000 --- a/Functions/DCIM/ValidateDCIMChoice.ps1 +++ /dev/null @@ -1,102 +0,0 @@ -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 -} \ No newline at end of file diff --git a/Functions/Extras/Get-NetboxExtrasChoices.ps1 b/Functions/Extras/Get-NetboxExtrasChoices.ps1 deleted file mode 100644 index 78118e0..0000000 --- a/Functions/Extras/Get-NetboxExtrasChoices.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -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 -} diff --git a/Functions/Helpers/GetChoiceValidValues.ps1 b/Functions/Helpers/GetChoiceValidValues.ps1 deleted file mode 100644 index 7579416..0000000 --- a/Functions/Helpers/GetChoiceValidValues.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: GetChoiceValidValues.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 -} \ No newline at end of file diff --git a/Functions/Helpers/ValidateChoice.ps1 b/Functions/Helpers/ValidateChoice.ps1 deleted file mode 100644 index bb99844..0000000 --- a/Functions/Helpers/ValidateChoice.ps1 +++ /dev/null @@ -1,76 +0,0 @@ -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: ValidateChoice.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - } - } -} \ No newline at end of file diff --git a/Functions/IPAM/Get-NetboxIPAMChoices.ps1 b/Functions/IPAM/Get-NetboxIPAMChoices.ps1 deleted file mode 100644 index 13d1c99..0000000 --- a/Functions/IPAM/Get-NetboxIPAMChoices.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -<# - .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/ValidateIPAMChoice.ps1 b/Functions/IPAM/ValidateIPAMChoice.ps1 deleted file mode 100644 index 6b46427..0000000 --- a/Functions/IPAM/ValidateIPAMChoice.ps1 +++ /dev/null @@ -1,109 +0,0 @@ -<# - .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 - - .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 -} \ No newline at end of file diff --git a/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 b/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 deleted file mode 100644 index 1017a91..0000000 --- a/Functions/Tenancy/Get-NetboxTenancyChoices.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -<# - .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/Virtualization/Get-NetboxVirtualizationChoices.ps1 b/Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 deleted file mode 100644 index 1e12a9d..0000000 --- a/Functions/Virtualization/Get-NetboxVirtualizationChoices.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -<# - .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/ValidateVirtualizationChoice.ps1 b/Functions/Virtualization/ValidateVirtualizationChoice.ps1 deleted file mode 100644 index 76ccf6b..0000000 --- a/Functions/Virtualization/ValidateVirtualizationChoice.ps1 +++ /dev/null @@ -1,76 +0,0 @@ -<# - .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 -} \ No newline at end of file diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index 244e33d..787786b 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.2.1' +ModuleVersion = '1.2.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS.psproj b/NetboxPS.psproj index 8551fec..c1ba101 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -5,7 +5,6 @@ Functions Functions\DCIM - Functions\Extras Functions\Circuits Functions\Virtualization Functions\IPAM @@ -47,8 +46,6 @@ Functions\Helpers\CheckNetboxIsConnected.ps1 Functions\Helpers\BuildNewURI.ps1 Functions\Helpers\BuildURIComponents.ps1 - Functions\Helpers\GetChoiceValidValues.ps1 - Functions\Helpers\ValidateChoice.ps1 Functions\Helpers\GetNetboxAPIErrorBody.ps1 Functions\Helpers\InvokeNetboxRequest.ps1 Functions\Helpers\ThrowNetboxRESTError.ps1 @@ -61,8 +58,6 @@ Functions\Setup\Set-NetboxCredential.ps1 Functions\Setup\Get-NetboxCredential.ps1 Functions\Setup\Connect-NetboxAPI.ps1 - Functions\Extras\Get-NetboxExtrasChoices.ps1 - Functions\DCIM\ValidateDCIMChoice.ps1 Functions\IPAM\VLAN\Get-NetboxIPAMVLAN.ps1 Functions\IPAM\VLAN\New-NetboxIPAMVLAN.ps1 Functions\IPAM\Role\Get-NetboxIPAMRole.ps1 @@ -74,10 +69,7 @@ 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 @@ -85,10 +77,8 @@ 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 @@ -104,8 +94,6 @@ 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\Circuits\Get-NetboxCircuit.ps1 deploy.ps1 Functions\Setup\Support\Get-NetboxAPIDefinition.ps1 diff --git a/NetboxPS/NetboxPS.psd1 b/NetboxPS/NetboxPS.psd1 index 244e33d..787786b 100644 --- a/NetboxPS/NetboxPS.psd1 +++ b/NetboxPS/NetboxPS.psd1 @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.2.1' +ModuleVersion = '1.2.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS/NetboxPS.psm1 b/NetboxPS/NetboxPS.psm1 index adad955..1ba04dd 100644 --- a/NetboxPS/NetboxPS.psm1 +++ b/NetboxPS/NetboxPS.psm1 @@ -611,52 +611,6 @@ public enum $EnumName #endregion -#region File GetChoiceValidValues.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: GetChoiceValidValues.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 -} - -#endregion - #region File Get-ModelDefinition.ps1 <# @@ -1007,49 +961,6 @@ function Get-NetboxCircuitProvider { #endregion -#region File 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 File Get-NetboxCircuitTermination.ps1 <# @@ -1227,36 +1138,6 @@ function Get-NetboxCredential { #endregion -#region File 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 File Get-NetboxDCIMDevice.ps1 <# @@ -1790,22 +1671,6 @@ function Get-NetboxDCIMSite { } -#endregion - -#region File Get-NetboxExtrasChoices.ps1 - -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 File Get-NetboxHostname.ps1 @@ -2075,36 +1940,6 @@ function Get-NetboxIPAMAvailableIP { #endregion -#region File 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 File Get-NetboxIPAMPrefix.ps1 <# @@ -2532,36 +2367,6 @@ function Get-NetboxIPAMVLAN { -#endregion - -#region File 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 File Get-NetboxTenant.ps1 @@ -2690,36 +2495,6 @@ function Get-NetboxTenant { #endregion -#region File 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 File Get-NetboxVirtualizationCluster.ps1 <# @@ -4791,389 +4566,6 @@ function ThrowNetboxRESTError { #endregion -#region File ValidateChoice.ps1 - -<# - .NOTES - =========================================================================== - Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 - Created on: 3/26/2020 14:23 - Created by: Claussen - Organization: NEOnet - Filename: ValidateChoice.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 - } - } -} - -#endregion - -#region File 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 File ValidateIPAMChoice.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: ValidateIPAMChoice.ps1 - =========================================================================== - .DESCRIPTION - A description of the file. -#> - - -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 File 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 File VerifyAPIConnectivity.ps1 function VerifyAPIConnectivity { From 3a4f8d9152f96158c8ad4301e1fa5b83b88066ef Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 8 Dec 2020 15:29:01 -0500 Subject: [PATCH 22/27] Add Postman collection From d087ff8eedb25e77296a86ae1a6e9d8005d1cfa6 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 8 Dec 2020 15:29:01 -0500 Subject: [PATCH 23/27] Add Postman collection --- Postman/Netbox.postman_collection.json | 1189 ++++++++++++++++++++++++ 1 file changed, 1189 insertions(+) create mode 100644 Postman/Netbox.postman_collection.json diff --git a/Postman/Netbox.postman_collection.json b/Postman/Netbox.postman_collection.json new file mode 100644 index 0000000..427c372 --- /dev/null +++ b/Postman/Netbox.postman_collection.json @@ -0,0 +1,1189 @@ +{ + "info": { + "_postman_id": "eba3e2e2-fd8e-5304-be69-4aebe1237cfc", + "name": "Netbox", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "IPAM", + "item": [ + { + "name": "Role", + "item": [ + { + "name": "Get-NetboxIPAMRole", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/roles?brief=0", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "roles" + ], + "query": [ + { + "key": "brief", + "value": "0" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Prefix", + "item": [ + { + "name": "Get Prefixes", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/prefixes/?prefix", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "prefixes", + "" + ], + "query": [ + { + "key": "id", + "value": null, + "disabled": true + }, + { + "key": "prefix", + "value": null + }, + { + "key": "q", + "value": null, + "disabled": true + }, + { + "key": "is_pool", + "value": null, + "disabled": true + }, + { + "key": "tenant_group_id", + "value": null, + "disabled": true + }, + { + "key": "tenant_group", + "value": null, + "disabled": true + }, + { + "key": "tenant_id", + "value": null, + "disabled": true + }, + { + "key": "tenant", + "value": null, + "disabled": true + }, + { + "key": "family", + "value": null, + "disabled": true + }, + { + "key": "within", + "value": null, + "disabled": true + }, + { + "key": "mask_length", + "value": null, + "disabled": true + }, + { + "key": "region", + "value": null, + "disabled": true + }, + { + "key": "region_id", + "value": null, + "disabled": true + }, + { + "key": "status", + "value": null, + "disabled": true + }, + { + "key": "limit", + "value": null, + "disabled": true + }, + { + "key": "offset", + "value": null, + "disabled": true + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "IP Address", + "item": [ + { + "name": "Create New IP Address", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"status\": 3,\r\n \"description\": \"TEST API CALL DELETE ME\",\r\n \"tenant\": \"2\",\r\n \"address\": \"1.2.3.4/5\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/ip-addresses/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "ip-addresses", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Available IP", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/prefixes/PREFIX_DATABASE_ID/available-ips", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "prefixes", + "PREFIX_DATABASE_ID", + "available-ips" + ] + } + }, + "response": [] + }, + { + "name": "Get IP Addresses By Query", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/ip-addresses/?q=1.2.3.4", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "ip-addresses", + "" + ], + "query": [ + { + "key": "q", + "value": "1.2.3.4" + }, + { + "key": "id", + "value": null, + "disabled": true + }, + { + "key": "dns_name", + "value": null, + "disabled": true + }, + { + "key": "tenant_group_id", + "value": null, + "disabled": true + }, + { + "key": "tenant_group", + "value": null, + "disabled": true + }, + { + "key": "tenant_id", + "value": null, + "disabled": true + }, + { + "key": "tenant", + "value": null, + "disabled": true + }, + { + "key": "family", + "value": null, + "disabled": true + }, + { + "key": "parent", + "value": null, + "disabled": true + }, + { + "key": "address", + "value": null, + "disabled": true + }, + { + "key": "mask_length", + "value": null, + "disabled": true + }, + { + "key": "virtual_machine", + "value": null, + "disabled": true + }, + { + "key": "virtual_machine_id", + "value": null, + "disabled": true + }, + { + "key": "status", + "value": null, + "disabled": true + }, + { + "key": "limit", + "value": null, + "disabled": true + }, + { + "key": "offset", + "value": null, + "disabled": true + } + ] + } + }, + "response": [] + }, + { + "name": "Get IP Address By ID", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/ip-addresses/DATABASEID", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "ip-addresses", + "DATABASEID" + ] + } + }, + "response": [] + }, + { + "name": "Remove IP", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "formdata", + "formdata": [] + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/ip-addresses/4110/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "ip-addresses", + "4110", + "" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "VLAN", + "item": [ + { + "name": "New-VLAN", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"status\": 1,\r\n \"description\": \"\",\r\n \"tenant\": \"2\",\r\n \"address\": \"0.0.0.0/0\",\r\n \"custom_fields\": {\r\n \"requested_by\": null,\r\n \"dns_host_name\": \"\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/vlans/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "vlans", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get VLANs", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/ipam/vlans?vid", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "ipam", + "vlans" + ], + "query": [ + { + "key": "id", + "value": null, + "disabled": true + }, + { + "key": "vid", + "value": null + }, + { + "key": "name", + "value": null, + "disabled": true + }, + { + "key": "q", + "value": null, + "disabled": true + }, + { + "key": "tenant_group_id", + "value": null, + "disabled": true + }, + { + "key": "tenant_group", + "value": null, + "disabled": true + }, + { + "key": "tenant_id", + "value": null, + "disabled": true + }, + { + "key": "tenant", + "value": "", + "disabled": true + }, + { + "key": "site", + "value": null, + "disabled": true + }, + { + "key": "site_id", + "value": null, + "disabled": true + }, + { + "key": "group", + "value": null, + "disabled": true + }, + { + "key": "role", + "value": null, + "disabled": true + }, + { + "key": "role_id", + "value": null, + "disabled": true + }, + { + "key": "status", + "value": null, + "disabled": true + }, + { + "key": "limit", + "value": null, + "disabled": true + }, + { + "key": "offset", + "value": null, + "disabled": true + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Tenancy", + "item": [ + { + "name": "Get Tenants", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/tenancy/tenants/?name", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "tenancy", + "tenants", + "" + ], + "query": [ + { + "key": "id", + "value": null, + "disabled": true + }, + { + "key": "name", + "value": null + }, + { + "key": "q", + "value": null, + "disabled": true + }, + { + "key": "slug", + "value": null, + "disabled": true + }, + { + "key": "group_id", + "value": null, + "disabled": true + }, + { + "key": "group", + "value": null, + "disabled": true + }, + { + "key": "limit", + "value": null, + "disabled": true + }, + { + "key": "offset", + "value": null, + "disabled": true + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Virtualization", + "item": [ + { + "name": "Get Virtual machines", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/virtual-machines", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "virtual-machines" + ] + } + }, + "response": [] + }, + { + "name": "Set Virtual Machine", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/virtual-machines/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "virtual-machines", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Clusters", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/clusters/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "clusters", + "" + ] + } + }, + "response": [] + }, + { + "name": "New Virtual machine", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n\t\"status\": 1,\n\t\"name\": \"my-vm-name\",\n\t\"platform\": 12,\n\t\"memory\": 4096,\n\t\"cluster\": 9,\n\t\"vcpus\": 2,\n\t\"role\": 10,\n\t\"disk\": 54,\n\t\"tenant\": 47\n}" + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/virtual-machines/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "virtual-machines", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Virtual Machine Interfaces", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/interfaces/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "interfaces", + "" + ], + "query": [ + { + "key": "virtual_machine", + "value": "neo-claussen-vm", + "disabled": true + }, + { + "key": "name", + "value": "Ethernet1", + "disabled": true + } + ] + } + }, + "response": [] + }, + { + "name": "New Virtual Machine Interface", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"virtual_machine\": 281,\n\t\"name\": \"Ethernet0\"\n}" + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/interfaces/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "interfaces", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Virtual Machine Interfaces", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/interfaces/?virtual_machine_id=198", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "interfaces", + "" + ], + "query": [ + { + "key": "virtual_machine", + "value": null, + "disabled": true + }, + { + "key": "name", + "value": "Ethernet1", + "disabled": true + }, + { + "key": "virtual_machine_id", + "value": "198" + } + ] + } + }, + "response": [] + }, + { + "name": "Set Virtual Machine", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"primary_ip\": null,\n \"primary_ip4\": null\n}" + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/virtual-machines/198/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "virtual-machines", + "198", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Virtual machines", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/virtualization/virtual-machines/?q=Barracuda+Load", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "virtualization", + "virtual-machines", + "" + ], + "query": [ + { + "key": "q", + "value": "Barracuda+Load" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Platforms", + "item": [ + { + "name": "Get Platforms", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/device-roles/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "device-roles", + "" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "DCIM", + "item": [ + { + "name": "Get Device Roles", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/device-roles/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "device-roles", + "" + ] + } + }, + "response": [] + }, + { + "name": "New Device", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/devices/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "devices", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Device", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/devices/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "devices", + "" + ] + } + }, + "response": [] + }, + { + "name": "Get Device Interfaces", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/interfaces/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "interfaces", + "" + ] + } + }, + "response": [] + }, + { + "name": "Add Interface", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"device\": 62,\r\n \"name\": \"TestINterface2\",\r\n \"mgmt_only\": true\r\n}" + }, + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/dcim/interfaces/", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "dcim", + "interfaces", + "" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Circuits", + "item": [ + { + "name": "Get Circuits", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/circuits/circuits/?cid", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "circuits", + "circuits", + "" + ], + "query": [ + { + "key": "q", + "value": null, + "disabled": true + }, + { + "key": "id", + "value": null, + "disabled": true + }, + { + "key": "cid", + "value": null + }, + { + "key": "commit_rate", + "value": null, + "disabled": true + }, + { + "key": "tenant_group_id", + "value": null, + "disabled": true + }, + { + "key": "tenant_group", + "value": null, + "disabled": true + }, + { + "key": "tenant_id", + "value": null, + "disabled": true + }, + { + "key": "tenant", + "value": null, + "disabled": true + }, + { + "key": "provider_id", + "value": null, + "disabled": true + }, + { + "key": "provider", + "value": null, + "disabled": true + }, + { + "key": "type_id", + "value": null, + "disabled": true + }, + { + "key": "type", + "value": null, + "disabled": true + }, + { + "key": "status", + "value": null, + "disabled": true + }, + { + "key": "site_id", + "value": null, + "disabled": true + }, + { + "key": "site", + "value": null, + "disabled": true + }, + { + "key": "id__in", + "value": "1", + "disabled": true + }, + { + "key": "limit", + "value": null, + "disabled": true + }, + { + "key": "offset", + "value": null, + "disabled": true + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Get-NetboxAPIInformation", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{SCHEME}}://{{HOSTNAME}}:{{PORT}}/api/extras/_choices", + "protocol": "{{SCHEME}}", + "host": [ + "{{HOSTNAME}}" + ], + "port": "{{PORT}}", + "path": [ + "api", + "extras", + "_choices" + ] + } + }, + "response": [] + } + ], + "auth": { + "type": "apikey", + "apikey": [ + { + "key": "value", + "value": "Token {{APIKey}}", + "type": "string" + }, + { + "key": "key", + "value": "Authorization", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "pm.request.headers.upsert(", + " {", + " key: 'content-type',", + " value: 'application/json'", + " }", + ");", + "", + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "SCHEME", + "value": "https" + }, + { + "key": "HOSTNAME", + "value": "my.host.name" + }, + { + "key": "PORT", + "value": "443" + }, + { + "key": "APIKey", + "value": "myapikey" + } + ] +} \ No newline at end of file From e11dfe726ba0ebb1ec601efb45982f973660aa94 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 23 Mar 2021 14:32:20 -0400 Subject: [PATCH 24/27] Update deploy.ps1 --- deploy.ps1 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/deploy.ps1 b/deploy.ps1 index bb9e2cb..644d0f7 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -36,6 +36,8 @@ param [version]$NewVersion ) +Import-Module "Microsoft.PowerShell.Utility" -ErrorAction Stop + Write-Host "Beginning deployment" -ForegroundColor Green $ModuleName = 'NetboxPS' @@ -57,11 +59,11 @@ foreach ($File in $PS1Files) { try { Write-Host (" Adding file {0:D2}/{1:D2}: $($File.Name)" -f $Counter, $PS1Files.Count) - "`r`n#region File $($File.Name)`r`n" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + "`r`n#region File $($File.Name)`r`n" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append -ErrorAction Stop - Get-Content $File.FullName -Encoding UTF8 | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + Get-Content $File.FullName -Encoding UTF8 -ErrorAction Stop | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append -ErrorAction Stop - "`r`n#endregion" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append + "`r`n#endregion" | Out-File -FilePath $ConcatenatedFilePath -Encoding utf8 -Append -ErrorAction Stop } catch { Write-Host "FAILED TO WRITE CONCATENATED FILE: $($_.Exception.Message): $($_.TargetObject)" -ForegroundColor Red return From ad4c80e4f6c570a7856f48fb46e06665c5495698 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 23 Mar 2021 14:39:08 -0400 Subject: [PATCH 25/27] Add Set-NetboxIPAMPrefix function --- .../IPAM/Prefix/Set-NetboxIPAMPrefix.ps1 | 92 +++++++++++++++++++ NetboxPS.psproj | 1 + 2 files changed, 93 insertions(+) create mode 100644 Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1 diff --git a/Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1 b/Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1 new file mode 100644 index 0000000..0670ad7 --- /dev/null +++ b/Functions/IPAM/Prefix/Set-NetboxIPAMPrefix.ps1 @@ -0,0 +1,92 @@ +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2021 v5.8.186 + Created on: 2021-03-23 13:54 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxIPAMPrefix { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Prefix, + + [string]$Status, + + [uint16]$Tenant, + + [uint16]$Site, + + [uint16]$VRF, + + [uint16]$VLAN, + + [object]$Role, + + [hashtable]$Custom_Fields, + + [string]$Description, + + [switch]$Is_Pool, + + [switch]$Force + ) + + begin { + # Write-Verbose "Validating enum properties" + # $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) + $Method = 'PATCH' + # + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } else { + # Write-Verbose "User did not provide a value for [$Property]" + # } + # } + # + # Write-Verbose "Finished enum validation" + } + + process { + foreach ($PrefixId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $PrefixId)) + + Write-Verbose "Obtaining Prefix from ID $PrefixId" + $CurrentPrefix = Get-NetboxIPAMPrefix -Id $PrefixId -ErrorAction Stop + + if ($Force -or $PSCmdlet.ShouldProcess($CurrentPrefix.Prefix, 'Set')) { + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method + } + } + } +} + + + + + + + + diff --git a/NetboxPS.psproj b/NetboxPS.psproj index c1ba101..b1f5a6f 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -103,6 +103,7 @@ Functions\Circuits\Providers\Get-NetboxCircuitProvider.ps1 Functions\Circuits\Types\Get-NetboxCircuitType.ps1 Functions\Helpers\Get-ModelDefinition.ps1 + Functions\IPAM\Prefix\Set-NetboxIPAMPrefix.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file From 6d00855644fdc978bbdae2738a78010899c16e1e Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Thu, 25 Mar 2021 16:45:40 -0400 Subject: [PATCH 26/27] Increment version to 1.3.0 --- NetboxPS.psd1 | 4 +- NetboxPS.psproj | 2 +- NetboxPS/NetboxPS.psd1 | 4 +- NetboxPS/NetboxPS.psm1 | 107 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 108 insertions(+), 9 deletions(-) diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index 787786b..1a2fe44 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -3,7 +3,7 @@ # # Generated by: Ben Claussen # -# Generated on: 2020-12-08 +# Generated on: 2021-03-25 # @{ @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.2.2' +ModuleVersion = '1.3.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS.psproj b/NetboxPS.psproj index b1f5a6f..7fc51c9 100644 --- a/NetboxPS.psproj +++ b/NetboxPS.psproj @@ -103,7 +103,7 @@ Functions\Circuits\Providers\Get-NetboxCircuitProvider.ps1 Functions\Circuits\Types\Get-NetboxCircuitType.ps1 Functions\Helpers\Get-ModelDefinition.ps1 - Functions\IPAM\Prefix\Set-NetboxIPAMPrefix.ps1 + Functions\IPAM\Prefix\Set-NetboxIPAMPrefix.ps1 R:\Netbox\NetboxPS\Test-Module.ps1 \ No newline at end of file diff --git a/NetboxPS/NetboxPS.psd1 b/NetboxPS/NetboxPS.psd1 index 787786b..1a2fe44 100644 --- a/NetboxPS/NetboxPS.psd1 +++ b/NetboxPS/NetboxPS.psd1 @@ -3,7 +3,7 @@ # # Generated by: Ben Claussen # -# Generated on: 2020-12-08 +# Generated on: 2021-03-25 # @{ @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.2.2' +ModuleVersion = '1.3.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS/NetboxPS.psm1 b/NetboxPS/NetboxPS.psm1 index 1ba04dd..1583b40 100644 --- a/NetboxPS/NetboxPS.psm1 +++ b/NetboxPS/NetboxPS.psm1 @@ -4300,10 +4300,12 @@ function Set-NetboxIPAMAddress { process { foreach ($IPId in $Id) { - if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id))-and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) { - throw "Assigned_Object_Type is required when specifying Assigned_Object_Id" - } elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { - throw "Assigned_Object_Id is required when specifying Assigned_Object_Type" + if ($PSBoundParameters.ContainsKey('Assigned_Object_Type') -or $PSBoundParameters.ContainsKey('Assigned_Object_Id')) { + if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) { + throw "Assigned_Object_Type is required when specifying Assigned_Object_Id" + } elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { + throw "Assigned_Object_Id is required when specifying Assigned_Object_Type" + } } $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) @@ -4322,6 +4324,103 @@ function Set-NetboxIPAMAddress { } } +#endregion + +#region File Set-NetboxIPAMPrefix.ps1 + +<# + .NOTES + =========================================================================== + Created with: SAPIEN Technologies, Inc., PowerShell Studio 2021 v5.8.186 + Created on: 2021-03-23 13:54 + Created by: Claussen + Organization: NEOnet + Filename: Set-NetboxIPAMPrefix.ps1 + =========================================================================== + .DESCRIPTION + A description of the file. +#> + + +function Set-NetboxIPAMPrefix { + [CmdletBinding(ConfirmImpact = 'Medium', + SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [uint16[]]$Id, + + [string]$Prefix, + + [string]$Status, + + [uint16]$Tenant, + + [uint16]$Site, + + [uint16]$VRF, + + [uint16]$VLAN, + + [object]$Role, + + [hashtable]$Custom_Fields, + + [string]$Description, + + [switch]$Is_Pool, + + [switch]$Force + ) + + begin { + # Write-Verbose "Validating enum properties" + # $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) + $Method = 'PATCH' + # + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } else { + # Write-Verbose "User did not provide a value for [$Property]" + # } + # } + # + # Write-Verbose "Finished enum validation" + } + + process { + foreach ($PrefixId in $Id) { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'prefixes', $PrefixId)) + + Write-Verbose "Obtaining Prefix from ID $PrefixId" + $CurrentPrefix = Get-NetboxIPAMPrefix -Id $PrefixId -ErrorAction Stop + + if ($Force -or $PSCmdlet.ShouldProcess($CurrentPrefix.Prefix, 'Set')) { + $URIComponents = BuildURIComponents -URISegments $Segments.Clone() -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id', 'Force' + + $URI = BuildNewURI -Segments $URIComponents.Segments + + InvokeNetboxRequest -URI $URI -Body $URIComponents.Parameters -Method $Method + } + } + } +} + + + + + + + + + #endregion #region File Set-NetboxVirtualMachine.ps1 From 5a23e7551208a1583ce6f4dd14ff59f76768dc30 Mon Sep 17 00:00:00 2001 From: Ben Claussen Date: Tue, 30 Mar 2021 11:00:53 -0400 Subject: [PATCH 27/27] Increment version to 1.3.2 --- NetboxPS.psd1 | 4 +- NetboxPS/NetboxPS.psd1 | 4 +- NetboxPS/NetboxPS.psm1 | 316 +++++++++++++++++++++-------------------- 3 files changed, 168 insertions(+), 156 deletions(-) diff --git a/NetboxPS.psd1 b/NetboxPS.psd1 index 1a2fe44..63ef84e 100644 --- a/NetboxPS.psd1 +++ b/NetboxPS.psd1 @@ -3,7 +3,7 @@ # # Generated by: Ben Claussen # -# Generated on: 2021-03-25 +# Generated on: 2021-03-30 # @{ @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.3.0' +ModuleVersion = '1.3.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS/NetboxPS.psd1 b/NetboxPS/NetboxPS.psd1 index 1a2fe44..63ef84e 100644 --- a/NetboxPS/NetboxPS.psd1 +++ b/NetboxPS/NetboxPS.psd1 @@ -3,7 +3,7 @@ # # Generated by: Ben Claussen # -# Generated on: 2021-03-25 +# Generated on: 2021-03-30 # @{ @@ -12,7 +12,7 @@ RootModule = 'NetboxPS.psm1' # Version number of this module. -ModuleVersion = '1.3.0' +ModuleVersion = '1.3.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/NetboxPS/NetboxPS.psm1 b/NetboxPS/NetboxPS.psm1 index 1583b40..a4b5aa6 100644 --- a/NetboxPS/NetboxPS.psm1 +++ b/NetboxPS/NetboxPS.psm1 @@ -1696,90 +1696,90 @@ function Get-NetboxIPAMAddress { param ( [Parameter(ParameterSetName = 'Query', - Position = 0)] + Position = 0)] [string]$Address, - + [Parameter(ParameterSetName = 'ByID')] [uint32[]]$Id, - + [Parameter(ParameterSetName = 'Query')] [string]$Query, - + [Parameter(ParameterSetName = 'Query')] [object]$Family, - + [Parameter(ParameterSetName = 'Query')] [uint32]$Parent, - + [Parameter(ParameterSetName = 'Query')] [byte]$Mask_Length, - + [Parameter(ParameterSetName = 'Query')] [string]$VRF, - + [Parameter(ParameterSetName = 'Query')] [uint32]$VRF_Id, - + [Parameter(ParameterSetName = 'Query')] [string]$Tenant, - + [Parameter(ParameterSetName = 'Query')] [uint32]$Tenant_Id, - + [Parameter(ParameterSetName = 'Query')] [string]$Device, - + [Parameter(ParameterSetName = 'Query')] [uint32]$Device_ID, - + [Parameter(ParameterSetName = 'Query')] [string]$Virtual_Machine, - + [Parameter(ParameterSetName = 'Query')] [uint32]$Virtual_Machine_Id, - + [Parameter(ParameterSetName = 'Query')] [uint32]$Interface_Id, - + [Parameter(ParameterSetName = 'Query')] [object]$Status, - + [Parameter(ParameterSetName = 'Query')] [object]$Role, - + [Parameter(ParameterSetName = 'Query')] [uint16]$Limit, - + [Parameter(ParameterSetName = 'Query')] [uint16]$Offset, - + [switch]$Raw ) - + switch ($PSCmdlet.ParameterSetName) { 'ById' { foreach ($IP_ID in $Id) { $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IP_ID)) - + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters -SkipParameterByName 'Id' - + $uri = BuildNewURI -Segments $URIComponents.Segments -Parameters $URIComponents.Parameters - + InvokeNetboxRequest -URI $uri -Raw:$Raw } - + break } - + default { $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 - + break } } @@ -1873,7 +1873,7 @@ function Get-NetboxIPAMAggregate { #region File Get-NetboxIPAMAvailableIP.ps1 -<# +<# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 @@ -1888,54 +1888,56 @@ function Get-NetboxIPAMAggregate { 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)] + ValueFromPipelineByPropertyName = $true)] [Alias('Id')] - [uint16]$Prefix_ID, - + [int]$Prefix_ID, + [Alias('NumberOfIPs')] - [uint16]$Limit, - + [int]$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 + + process { + $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 + } } #endregion @@ -3188,7 +3190,7 @@ function New-NetboxDCIMDevice { #region File New-NetboxIPAMAddress.ps1 -<# +<# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 @@ -3203,103 +3205,110 @@ function New-NetboxDCIMDevice { 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 Dns_name + DNS Name of IP address (example : netbox.example.com) + .PARAMETER Force Do not prompt for confirmation to create IP. - + .PARAMETER Raw Return raw results from API service - + .EXAMPLE PS C:\> Create-NetboxIPAMAddress - + .NOTES Additional information about the function. #> - + [CmdletBinding(ConfirmImpact = 'Low', - SupportsShouldProcess = $true)] + SupportsShouldProcess = $true)] [OutputType([pscustomobject])] param ( [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] + ValueFromPipelineByPropertyName = $true)] [string]$Address, - + [object]$Status = 'Active', - - [uint16]$Tenant, - - [uint16]$VRF, - + + [int]$Tenant, + + [int]$VRF, + [object]$Role, - - [uint16]$NAT_Inside, - + + [int]$NAT_Inside, + [hashtable]$Custom_Fields, - - [uint16]$Interface, - + + [int]$Interface, + [string]$Description, - + + [string]$Dns_name, + [switch]$Force, - + [switch]$Raw ) - - $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) - $Method = 'POST' - - # # Value validation - # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method - # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition - # - # foreach ($Property in $EnumProperties.Keys) { - # if ($PSBoundParameters.ContainsKey($Property)) { - # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" - # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property - # } - # } - # - $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters - - $URI = BuildNewURI -Segments $URIComponents.Segments - - if ($Force -or $PSCmdlet.ShouldProcess($Address, 'Create new IP address')) { - InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + + process { + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses')) + $Method = 'POST' + + # # Value validation + # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method + # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition + # + # foreach ($Property in $EnumProperties.Keys) { + # if ($PSBoundParameters.ContainsKey($Property)) { + # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" + # $PSBoundParameters.$Property = ValidateValue -ModelDefinition $ModelDefinition -Property $Property -ProvidedValue $PSBoundParameters.$Property + # } + # } + # + $URIComponents = BuildURIComponents -URISegments $Segments -ParametersDictionary $PSBoundParameters + + $URI = BuildNewURI -Segments $URIComponents.Segments + + if ($Force -or $PSCmdlet.ShouldProcess($Address, 'Create new IP address')) { + InvokeNetboxRequest -URI $URI -Method $Method -Body $URIComponents.Parameters -Raw:$Raw + } } } @@ -3736,7 +3745,7 @@ function Remove-NetboxDCIMInterfaceConnection { #region File Remove-NetboxIPAMAddress.ps1 -<# +<# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 @@ -3750,46 +3759,46 @@ function Remove-NetboxDCIMInterfaceConnection { #> 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)] + SupportsShouldProcess = $true)] param ( [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - + ValueFromPipelineByPropertyName = $true)] + [int[]]$Id, + [switch]$Force ) - + 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 } } @@ -4230,7 +4239,7 @@ function Set-NetboxHostName { #region File Set-NetboxIPAMAddress.ps1 -<# +<# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.172 @@ -4246,46 +4255,48 @@ function Set-NetboxHostName { function Set-NetboxIPAMAddress { [CmdletBinding(ConfirmImpact = 'Medium', - SupportsShouldProcess = $true)] + SupportsShouldProcess = $true)] param ( [Parameter(Mandatory = $true, - ValueFromPipelineByPropertyName = $true)] - [uint16[]]$Id, - + ValueFromPipelineByPropertyName = $true)] + [int[]]$Id, + [string]$Address, - + [string]$Status, - - [uint16]$Tenant, - - [uint16]$VRF, - + + [int]$Tenant, + + [int]$VRF, + [object]$Role, - - [uint16]$NAT_Inside, - + + [int]$NAT_Inside, + [hashtable]$Custom_Fields, - + [ValidateSet('dcim.interface', 'virtualization.vminterface', IgnoreCase = $true)] [string]$Assigned_Object_Type, - + [uint16]$Assigned_Object_Id, - + [string]$Description, - + + [string]$Dns_name, + [switch]$Force ) - + begin { # Write-Verbose "Validating enum properties" # $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', 0)) $Method = 'PATCH' - # + # # # Value validation # $ModelDefinition = GetModelDefinitionFromURIPath -Segments $Segments -Method $Method # $EnumProperties = GetModelEnumProperties -ModelDefinition $ModelDefinition - # + # # foreach ($Property in $EnumProperties.Keys) { # if ($PSBoundParameters.ContainsKey($Property)) { # Write-Verbose "Validating property [$Property] with value [$($PSBoundParameters.$Property)]" @@ -4294,30 +4305,31 @@ function Set-NetboxIPAMAddress { # Write-Verbose "User did not provide a value for [$Property]" # } # } - # + # # Write-Verbose "Finished enum validation" } - + process { foreach ($IPId in $Id) { if ($PSBoundParameters.ContainsKey('Assigned_Object_Type') -or $PSBoundParameters.ContainsKey('Assigned_Object_Id')) { if ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) { throw "Assigned_Object_Type is required when specifying Assigned_Object_Id" - } elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { + } + elseif ((-not [string]::IsNullOrWhiteSpace($Assigned_Object_Type)) -and [string]::IsNullOrWhiteSpace($Assigned_Object_Id)) { throw "Assigned_Object_Id is required when specifying Assigned_Object_Type" } } - + $Segments = [System.Collections.ArrayList]::new(@('ipam', 'ip-addresses', $IPId)) - + Write-Verbose "Obtaining IP 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 $Method } }