Skip to content

Commit 04e88d9

Browse files
committed
Add diagnostics and potential changes to what-if output
1 parent 3d8ac89 commit 04e88d9

File tree

7 files changed

+73
-15
lines changed

7 files changed

+73
-15
lines changed

src/azure-cli-core/azure/cli/core/profiles/_shared.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def default_api_version(self):
177177
ResourceType.MGMT_RESOURCE_POLICY: SDKProfile('2021-06-01', {
178178
'policy_exemptions': '2020-07-01-preview'
179179
}),
180-
ResourceType.MGMT_RESOURCE_RESOURCES: '2022-09-01',
180+
ResourceType.MGMT_RESOURCE_RESOURCES: '2024-11-01',
181181
ResourceType.MGMT_RESOURCE_SUBSCRIPTIONS: '2022-12-01',
182182
ResourceType.MGMT_RESOURCE_DEPLOYMENTSCRIPTS: '2020-10-01',
183183
ResourceType.MGMT_RESOURCE_TEMPLATESPECS: '2021-05-01',

src/azure-cli/azure/cli/command_modules/resource/_color.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class Color(Enum):
1313
PURPLE = "\033[38;5;141m"
1414
BLUE = "\033[38;5;39m"
1515
GRAY = "\033[38;5;246m"
16+
RED = "\033[38;5;196m"
17+
DARK_YELLOW = "\033[38;5;136m"
1618
RESET = "\033[0m"
1719

1820
def __str__(self):

src/azure-cli/azure/cli/command_modules/resource/_formatters.py

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from itertools import groupby
77

8-
from azure.mgmt.resource.resources.models import ChangeType, PropertyChangeType
8+
from azure.mgmt.resource.resources.models import ChangeType, PropertyChangeType, Level
99

1010
from ._symbol import Symbol
1111
from ._color import Color, ColoredStringBuilder
@@ -30,6 +30,12 @@
3030
PropertyChangeType.no_effect: Color.GRAY,
3131
}
3232

33+
_diagnostic_level_to_color = {
34+
Level.ERROR: Color.RED,
35+
Level.WARNING: Color.DARK_YELLOW,
36+
Level.INFO: Color.RESET,
37+
}
38+
3339
_change_type_to_symbol = {
3440
ChangeType.create: Symbol.PLUS,
3541
ChangeType.delete: Symbol.MINUS,
@@ -73,8 +79,22 @@ def format_what_if_operation_result(what_if_operation_result, enable_color=True)
7379
builder = ColoredStringBuilder(enable_color)
7480
_format_noise_notice(builder)
7581
_format_change_type_legend(builder, what_if_operation_result.changes)
76-
_format_resource_changes(builder, what_if_operation_result.changes)
77-
_format_resource_changes_stats(builder, what_if_operation_result.changes)
82+
_format_resource_changes(builder,
83+
what_if_operation_result.changes,
84+
definite_changes=True)
85+
_format_resource_changes_stats(builder,
86+
what_if_operation_result.changes,
87+
definite_changes=True)
88+
_format_resource_changes(builder,
89+
what_if_operation_result.potential_changes,
90+
definite_changes=False)
91+
_format_resource_changes_stats(builder,
92+
what_if_operation_result.potential_changes,
93+
definite_changes=False)
94+
_format_diagnostics(builder,
95+
what_if_operation_result.changes,
96+
what_if_operation_result.potential_changes,
97+
what_if_operation_result.diagnostics)
7898
return builder.build()
7999

80100

@@ -120,12 +140,15 @@ def populate_change_type_set(property_changes):
120140
builder.append_line(change_type.title())
121141

122142

123-
def _format_resource_changes_stats(builder, resource_changes):
124-
builder.append_line().append("Resource changes: ")
143+
def _format_resource_changes_stats(builder, resource_changes, definite_changes = True):
144+
if definite_changes:
145+
builder.append_line().append("Resource changes: ")
125146

126-
if not resource_changes:
127-
builder.append("no change.")
128-
return
147+
if not resource_changes:
148+
builder.append("no change.")
149+
return
150+
elif resource_changes:
151+
builder.append_line().append("Potential changes: ")
129152

130153
sorted_resource_changes = sorted(resource_changes, key=lambda x: _change_type_to_weight[x.change_type])
131154
resource_changes_by_change_type = groupby(sorted_resource_changes, lambda x: x.change_type)
@@ -155,15 +178,48 @@ def _format_change_type_count(change_type, count): # pylint: disable=too-many-r
155178
raise ValueError(f"Invalid ChangeType: {change_type}")
156179

157180

158-
def _format_resource_changes(builder, resource_changes):
181+
def _format_diagnostics(builder, resource_changes, potential_changes, diagnostics):
182+
short_circuited_resources = [r for r in (resource_changes or []) + (potential_changes or []) if r.change_type == ChangeType.UNSUPPORTED]
183+
184+
diags = diagnostics or []
185+
186+
if len(short_circuited_resources) + len(diags) > 0:
187+
builder.append_line()
188+
builder.append_line()
189+
builder.append(f"Diagnostics ({len(short_circuited_resources) + len(diags)}): ")
190+
builder.append_line()
191+
192+
for change in short_circuited_resources:
193+
with builder.new_color_scope(_diagnostic_level_to_color[Level.WARNING]):
194+
builder.append(_get_relative_resource_id(change))
195+
builder.append(" (Unsupported) ")
196+
builder.append(change.unsupported_reason)
197+
builder.append_line()
198+
199+
for diag in diags:
200+
with builder.new_color_scope(_diagnostic_level_to_color[diag.level]):
201+
builder.append(diag.target)
202+
builder.append(" (")
203+
builder.append(diag.Code)
204+
builder.append(") ")
205+
builder.append(diag.message)
206+
builder.append_line()
207+
208+
209+
def _format_resource_changes(builder, resource_changes, definite_changes = True):
159210
if not resource_changes:
160211
return
161212

162213
num_scopes = len(set(map(_get_scope_uppercase, resource_changes)))
163214
resource_changes_by_scope = groupby(sorted(resource_changes, key=_get_scope_uppercase), _get_scope_uppercase)
164215

165216
builder.append_line()
166-
builder.append_line(f"The deployment will update the following {'scope:' if num_scopes == 1 else 'scopes'}")
217+
if definite_changes:
218+
builder.append("The deployment will update the following ")
219+
else:
220+
builder.append("The following change MAY OR MAY NOT be deployed to the following ")
221+
222+
builder.append_line('scope:' if num_scopes == 1 else 'scopes:')
167223

168224
for _, resource_changes_in_scope in resource_changes_by_scope:
169225
resource_changes_in_scope_list = list(resource_changes_in_scope)

src/azure-cli/requirements.py3.Darwin.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ azure-mgmt-recoveryservices==3.0.0
6565
azure-mgmt-recoveryservicesbackup==9.1.0
6666
azure-mgmt-redhatopenshift==1.5.0
6767
azure-mgmt-redis==14.5.0
68-
azure-mgmt-resource==23.1.1
68+
azure-mgmt-resource==23.3.0
6969
azure-mgmt-search==9.0.0
7070
azure-mgmt-security==6.0.0
7171
azure-mgmt-servicebus==8.2.0

src/azure-cli/requirements.py3.Linux.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ azure-mgmt-recoveryservices==3.0.0
6565
azure-mgmt-recoveryservicesbackup==9.1.0
6666
azure-mgmt-redhatopenshift==1.5.0
6767
azure-mgmt-redis==14.5.0
68-
azure-mgmt-resource==23.1.1
68+
azure-mgmt-resource==23.3.0
6969
azure-mgmt-search==9.0.0
7070
azure-mgmt-security==6.0.0
7171
azure-mgmt-servicebus==8.2.0

src/azure-cli/requirements.py3.windows.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ azure-mgmt-recoveryservices==3.0.0
6565
azure-mgmt-recoveryservicesbackup==9.1.0
6666
azure-mgmt-redhatopenshift==1.5.0
6767
azure-mgmt-redis==14.5.0
68-
azure-mgmt-resource==23.1.1
68+
azure-mgmt-resource==23.3.0
6969
azure-mgmt-search==9.0.0
7070
azure-mgmt-security==6.0.0
7171
azure-mgmt-servicebus==8.2.0

src/azure-cli/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
'azure-mgmt-recoveryservices~=3.0.0',
109109
'azure-mgmt-redhatopenshift~=1.5.0',
110110
'azure-mgmt-redis~=14.5.0',
111-
'azure-mgmt-resource==23.1.1',
111+
'azure-mgmt-resource==23.3.0',
112112
'azure-mgmt-search~=9.0',
113113
'azure-mgmt-security==6.0.0',
114114
'azure-mgmt-servicebus~=8.2.0',

0 commit comments

Comments
 (0)