Skip to content

Commit 1047cd0

Browse files
authored
Merge pull request Azure#5140 from maddieclayton/RollBack
Rollback modules script
2 parents a2ebcee + 2b81057 commit 1047cd0

File tree

1 file changed

+232
-0
lines changed

1 file changed

+232
-0
lines changed

tools/DeleteModules.ps1

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
# ----------------------------------------------------------------------------------
2+
#
3+
# Copyright Microsoft Corporation
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
# ----------------------------------------------------------------------------------
14+
15+
#Requires -Modules AzureRM.KeyVault
16+
[CmdletBinding(
17+
DefaultParameterSetName='Scope',
18+
SupportsShouldProcess=$true
19+
)]
20+
param(
21+
[Parameter(ParameterSetName='Scope', Mandatory = $true, Position = 0)]
22+
[ValidateSet("AzureRMAndDependencies", "AzureAndDependencies", "NetCoreModules", "AzureStackAndDependencies")]
23+
[string] $scope,
24+
[Parameter(ParameterSetName='ModuleList', Mandatory = $true)]
25+
[string[]] $listOfModules,
26+
[Parameter(ParameterSetName='ModulesAndVersionsList', Mandatory = $true)]
27+
[hashtable[]] $moduleVersionTable,
28+
[Parameter(Mandatory = $false)]
29+
[string] $repoName,
30+
[Parameter(Mandatory = $false)]
31+
[string] $nugetExe,
32+
[Parameter(Mandatory = $false)]
33+
[string] $apiKey,
34+
[Parameter(Mandatory = $false)]
35+
[switch] $Force
36+
)
37+
38+
function Get-TargetModules
39+
{
40+
[CmdletBinding()]
41+
param
42+
(
43+
[string]$scope,
44+
[string[]]$moduleList,
45+
[hashtable[]]$moduleVersionTable
46+
)
47+
48+
$targets = @()
49+
50+
if ($listOfModules.Count -ge 1)
51+
{
52+
$moduleList | ForEach-Object {
53+
$targets += Find-Module -Name $_ -Repository $repoName
54+
}
55+
}
56+
57+
elseif ($moduleVersionTable.Count -ge 1)
58+
{
59+
$moduleVersionTable | ForEach-Object {
60+
$targets += Find-Module -Name $_.Module -RequiredVersion $_.Version -Repository $repoName
61+
}
62+
}
63+
64+
else
65+
{
66+
$query = ""
67+
if ($scope -eq "AzureRMAndDependencies") {
68+
$query = "AzureRM"
69+
} elseif ($scope -eq "AzureAndDependencies") {
70+
$query = "Azure"
71+
} elseif ($scope -eq "NetCoreModules") {
72+
$query = "AzureRM.Netcore"
73+
} elseif ($scope -eq "AzureStackAndDependencies") {
74+
$query = "AzureStack"
75+
}
76+
77+
$azureRmAllVersions = Find-Module -Name $query -Repository PSGallery -AllVersions
78+
$targets += $azureRmAllVersions[0]
79+
$currentDependencies = $azureRmAllVersions[0].Dependencies
80+
$previousDependencies = $azureRmAllVersions[1].Dependencies
81+
$currentDependencies | ForEach-Object {
82+
$CDModule = $_
83+
$versionChanged = $true
84+
$previousDependencies | ForEach-Object {
85+
if (($_.Name -eq $CDModule.Name) -and (($_.RequiredVersion -eq $CDModule.RequiredVersion) -and ($_.MinimumVersion -eq $CDModule.MinimumVersion)))
86+
{
87+
$versionChanged = $false
88+
}
89+
}
90+
91+
if ($versionChanged)
92+
{
93+
$targets += $CDModule
94+
}
95+
}
96+
}
97+
98+
return $targets
99+
}
100+
101+
function Get-DependentModules
102+
{
103+
param(
104+
[string]$repoName,
105+
[string]$moduleName,
106+
[string]$moduleVersion,
107+
[object[]]$allModules,
108+
[object[]]$azureModules
109+
)
110+
111+
$dependencies = @()
112+
$azureModules | ForEach-Object {
113+
$targetName = $_.Name
114+
$moduleBeingDeleted = $allModules | Where-Object {$_.Name -eq $targetName}
115+
116+
$_.Dependencies | ForEach-Object {
117+
$dependencyName = $_.Name
118+
119+
if (($moduleBeingDeleted -eq $null) -and ($moduleName -eq $dependencyName))
120+
{
121+
$allTargetVersions = Find-Module -Name $targetName -Repository $repoName -AllVersions
122+
$allTargetVersions | ForEach-Object {
123+
$targetVersion = $_.Version
124+
$_.Dependencies | ForEach-Object {
125+
if (($moduleName -eq $_.Name) -and (($_.MinimumVersion -eq $moduleVersion) -or ($_.RequiredVersion -eq $moduleVersion)))
126+
{
127+
$dependencies += "`"$targetName $targetVersion`","
128+
}
129+
}
130+
}
131+
}
132+
}
133+
}
134+
if ($dependencies.Count -ne 0)
135+
{
136+
return "$moduleName $moduleVersion is a dependency for $dependencies the module(s) will have an orphaned dependency. Are you sure you want to unlist this package?"
137+
}
138+
}
139+
140+
function Get-ApiKey
141+
{
142+
param([string]$repoName)
143+
144+
if ($repoName -eq "PSGallery")
145+
{
146+
$vaultKey = "PowerShellGalleryApiKey"
147+
}
148+
149+
elseif ($repoName -eq "TestGallery")
150+
{
151+
$vaultKey="PSTestGalleryApiKey"
152+
}
153+
154+
else
155+
{
156+
throw "Must supply ApiKey if not using PSGallery or TestGallery"
157+
}
158+
159+
$context = $null
160+
try {
161+
$context = Get-AzureRMContext -ErrorAction Stop
162+
} catch {}
163+
164+
if ($context -eq $null)
165+
{
166+
Add-AzureRMAccount
167+
}
168+
169+
$secret = Get-AzureKeyVaultSecret -VaultName kv-azuresdk -Name $vaultKey
170+
171+
$secret.SecretValueText
172+
}
173+
174+
if ([string]::IsNullOrEmpty($nugetExe))
175+
{
176+
$nugetExe = "$PSScriptRoot\nuget.exe"
177+
}
178+
Write-Host "Using the following NuGet path: $nugetExe"
179+
180+
if ([string]::IsNullOrEmpty($repoName))
181+
{
182+
$repoName = "PSGallery"
183+
}
184+
Write-Host "Deleting modules from the following repository: $repoName"
185+
186+
if (($repoName -eq "PSGallery") -or ([string]::IsNullOrEmpty($repoName)))
187+
{
188+
$repositoryLocation = "https://www.powershellgallery.com/api/v2/package/"
189+
}
190+
191+
elseif ($repoName -eq "TestGallery")
192+
{
193+
$repositoryLocation = "https://dtlgalleryint.cloudapp.net/api/v2/package/"
194+
}
195+
196+
else
197+
{
198+
$repositoryLocation = $repoName
199+
}
200+
201+
if ([string]::IsNullOrEmpty($apiKey))
202+
{
203+
$apiKey = Get-ApiKey -repoName $repoName
204+
}
205+
206+
$ModulesToDelete = Get-TargetModules -scope $scope -moduleList $listOfModules -moduleVersionTable $moduleVersionTable
207+
$ModulesToDeleteName = $ModulesToDelete | ForEach-Object {$_.Name}
208+
$azureModules = Find-Module Azure* -Repository $repoName
209+
if ($PSCmdlet.ShouldProcess("Module(s) being deleted: $ModulesToDeleteName"))
210+
{
211+
$ModulesToDelete | ForEach-Object {
212+
$version = $null
213+
if (![string]::IsNullOrEmpty($_.Version))
214+
{
215+
$version = $_.Version
216+
}
217+
elseif (![string]::IsNullOrEmpty($_.RequiredVersion))
218+
{
219+
$version = $_.RequiredVersion
220+
}
221+
elseif (![string]::IsNullOrEmpty($_.MinimumVersion))
222+
{
223+
$version = $_.MinimumVersion
224+
}
225+
226+
$warning = Get-DependentModules -repoName $repoName -moduleName $_.Name -moduleVersion $version -allModules $ModulesToDelete -azureModules $azureModules
227+
if (($warning -eq $null) -or ($Force) -or ($PSCmdlet.ShouldContinue($warning, "Deleting package with orphaned dependencies")))
228+
{
229+
&$nugetExe delete $_.Name $version -ApiKey $apiKey -Source $repositoryLocation -NonInteractive
230+
}
231+
}
232+
}

0 commit comments

Comments
 (0)