Skip to content

Commit d28cce4

Browse files
committed
Initial commit: generate spot placement score py
1 parent efa4945 commit d28cce4

2 files changed

Lines changed: 260 additions & 0 deletions

File tree

src/azure-cli/azure/cli/command_modules/compute_recommender/aaz/latest/compute_recommender/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@
1010

1111
from .__cmd_group import *
1212
from ._spot_placement_recommender import *
13+
from ._spot_placement_score import *
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
# --------------------------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for license information.
4+
#
5+
# Code generated by aaz-dev-tools
6+
# --------------------------------------------------------------------------------------------
7+
8+
# pylint: skip-file
9+
# flake8: noqa
10+
11+
from azure.cli.core.aaz import *
12+
13+
14+
@register_command(
15+
"compute-recommender spot-placement-score",
16+
is_preview=True,
17+
)
18+
class SpotPlacementScore(AAZCommand):
19+
"""Generate placement scores for Spot VM skus.
20+
21+
:example: generate spot vm placement score example
22+
az compute-recommender spot-placement-score -l eastus --subscription ffffffff-ffff-ffff-ffff-ffffffffffff --availability-zones true --desired-locations '["eastus", "eastus2"]' --desired-count 1 --desired-sizes '[{"sku": "Standard_D2_v2"}]'
23+
"""
24+
25+
_aaz_info = {
26+
"version": "2025-06-05",
27+
"resources": [
28+
["mgmt-plane", "/subscriptions/{}/providers/microsoft.compute/locations/{}/placementscores/spot/generate", "2025-06-05"],
29+
]
30+
}
31+
32+
def _handler(self, command_args):
33+
super()._handler(command_args)
34+
self._execute_operations()
35+
return self._output()
36+
37+
_args_schema = None
38+
39+
@classmethod
40+
def _build_arguments_schema(cls, *args, **kwargs):
41+
if cls._args_schema is not None:
42+
return cls._args_schema
43+
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)
44+
45+
# define Arg Group ""
46+
47+
_args_schema = cls._args_schema
48+
_args_schema.location = AAZResourceLocationArg(
49+
required=True,
50+
id_part="name",
51+
)
52+
53+
# define Arg Group "SpotPlacementScoresInput"
54+
55+
_args_schema = cls._args_schema
56+
_args_schema.availability_zones = AAZBoolArg(
57+
options=["--availability-zones"],
58+
arg_group="SpotPlacementScoresInput",
59+
help="Defines if the scope is zonal or regional.",
60+
)
61+
_args_schema.desired_count = AAZIntArg(
62+
options=["--desired-count"],
63+
arg_group="SpotPlacementScoresInput",
64+
help="Desired instance count per region/zone based on the scope.",
65+
)
66+
_args_schema.desired_locations = AAZListArg(
67+
options=["--desired-locations"],
68+
arg_group="SpotPlacementScoresInput",
69+
help="The desired regions",
70+
)
71+
_args_schema.desired_sizes = AAZListArg(
72+
options=["--desired-sizes"],
73+
arg_group="SpotPlacementScoresInput",
74+
help="The desired resource SKUs.",
75+
)
76+
77+
desired_locations = cls._args_schema.desired_locations
78+
desired_locations.Element = AAZStrArg()
79+
80+
desired_sizes = cls._args_schema.desired_sizes
81+
desired_sizes.Element = AAZObjectArg()
82+
83+
_element = cls._args_schema.desired_sizes.Element
84+
_element.sku = AAZStrArg(
85+
options=["sku"],
86+
help="The resource's CRP virtual machine SKU size.",
87+
)
88+
return cls._args_schema
89+
90+
def _execute_operations(self):
91+
self.pre_operations()
92+
self.SpotPlacementScoresPost(ctx=self.ctx)()
93+
self.post_operations()
94+
95+
@register_callback
96+
def pre_operations(self):
97+
pass
98+
99+
@register_callback
100+
def post_operations(self):
101+
pass
102+
103+
def _output(self, *args, **kwargs):
104+
result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True)
105+
return result
106+
107+
class SpotPlacementScoresPost(AAZHttpOperation):
108+
CLIENT_TYPE = "MgmtClient"
109+
110+
def __call__(self, *args, **kwargs):
111+
request = self.make_request()
112+
session = self.client.send_request(request=request, stream=False, **kwargs)
113+
if session.http_response.status_code in [200]:
114+
return self.on_200(session)
115+
116+
return self.on_error(session.http_response)
117+
118+
@property
119+
def url(self):
120+
return self.client.format_url(
121+
"/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/placementScores/spot/generate",
122+
**self.url_parameters
123+
)
124+
125+
@property
126+
def method(self):
127+
return "POST"
128+
129+
@property
130+
def error_format(self):
131+
return "MgmtErrorFormat"
132+
133+
@property
134+
def url_parameters(self):
135+
parameters = {
136+
**self.serialize_url_param(
137+
"location", self.ctx.args.location,
138+
required=True,
139+
),
140+
**self.serialize_url_param(
141+
"subscriptionId", self.ctx.subscription_id,
142+
required=True,
143+
),
144+
}
145+
return parameters
146+
147+
@property
148+
def query_parameters(self):
149+
parameters = {
150+
**self.serialize_query_param(
151+
"api-version", "2025-06-05",
152+
required=True,
153+
),
154+
}
155+
return parameters
156+
157+
@property
158+
def header_parameters(self):
159+
parameters = {
160+
**self.serialize_header_param(
161+
"Content-Type", "application/json",
162+
),
163+
**self.serialize_header_param(
164+
"Accept", "application/json",
165+
),
166+
}
167+
return parameters
168+
169+
@property
170+
def content(self):
171+
_content_value, _builder = self.new_content_builder(
172+
self.ctx.args,
173+
typ=AAZObjectType,
174+
typ_kwargs={"flags": {"required": True, "client_flatten": True}}
175+
)
176+
_builder.set_prop("availabilityZones", AAZBoolType, ".availability_zones")
177+
_builder.set_prop("desiredCount", AAZIntType, ".desired_count")
178+
_builder.set_prop("desiredLocations", AAZListType, ".desired_locations")
179+
_builder.set_prop("desiredSizes", AAZListType, ".desired_sizes")
180+
181+
desired_locations = _builder.get(".desiredLocations")
182+
if desired_locations is not None:
183+
desired_locations.set_elements(AAZStrType, ".")
184+
185+
desired_sizes = _builder.get(".desiredSizes")
186+
if desired_sizes is not None:
187+
desired_sizes.set_elements(AAZObjectType, ".")
188+
189+
_elements = _builder.get(".desiredSizes[]")
190+
if _elements is not None:
191+
_elements.set_prop("sku", AAZStrType, ".sku")
192+
193+
return self.serialize_content(_content_value)
194+
195+
def on_200(self, session):
196+
data = self.deserialize_http_content(session)
197+
self.ctx.set_var(
198+
"instance",
199+
data,
200+
schema_builder=self._build_schema_on_200
201+
)
202+
203+
_schema_on_200 = None
204+
205+
@classmethod
206+
def _build_schema_on_200(cls):
207+
if cls._schema_on_200 is not None:
208+
return cls._schema_on_200
209+
210+
cls._schema_on_200 = AAZObjectType()
211+
212+
_schema_on_200 = cls._schema_on_200
213+
_schema_on_200.availability_zones = AAZBoolType(
214+
serialized_name="availabilityZones",
215+
)
216+
_schema_on_200.desired_count = AAZIntType(
217+
serialized_name="desiredCount",
218+
)
219+
_schema_on_200.desired_locations = AAZListType(
220+
serialized_name="desiredLocations",
221+
)
222+
_schema_on_200.desired_sizes = AAZListType(
223+
serialized_name="desiredSizes",
224+
)
225+
_schema_on_200.placement_scores = AAZListType(
226+
serialized_name="placementScores",
227+
)
228+
229+
desired_locations = cls._schema_on_200.desired_locations
230+
desired_locations.Element = AAZStrType()
231+
232+
desired_sizes = cls._schema_on_200.desired_sizes
233+
desired_sizes.Element = AAZObjectType()
234+
235+
_element = cls._schema_on_200.desired_sizes.Element
236+
_element.sku = AAZStrType()
237+
238+
placement_scores = cls._schema_on_200.placement_scores
239+
placement_scores.Element = AAZObjectType()
240+
241+
_element = cls._schema_on_200.placement_scores.Element
242+
_element.availability_zone = AAZStrType(
243+
serialized_name="availabilityZone",
244+
)
245+
_element.is_quota_available = AAZBoolType(
246+
serialized_name="isQuotaAvailable",
247+
)
248+
_element.region = AAZStrType()
249+
_element.score = AAZStrType()
250+
_element.sku = AAZStrType()
251+
252+
return cls._schema_on_200
253+
254+
255+
class _SpotPlacementScoreHelper:
256+
"""Helper class for SpotPlacementScore"""
257+
258+
259+
__all__ = ["SpotPlacementScore"]

0 commit comments

Comments
 (0)