Skip to content

Commit 0b644e9

Browse files
committed
Allow instance selection by name or UUID
1 parent 5e74942 commit 0b644e9

File tree

4 files changed

+93
-26
lines changed

4 files changed

+93
-26
lines changed

nexus/src/app/affinity.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,15 @@ impl super::Nexus {
240240
&self,
241241
opctx: &OpContext,
242242
affinity_group_lookup: &lookup::AffinityGroup<'_>,
243-
member: external::AffinityGroupMember,
243+
instance_lookup: &lookup::Instance<'_>,
244244
) -> Result<(), Error> {
245245
let (.., authz_affinity_group) =
246246
affinity_group_lookup.lookup_for(authz::Action::Modify).await?;
247+
let (.., authz_instance) =
248+
instance_lookup.lookup_for(authz::Action::Read).await?;
249+
let member =
250+
external::AffinityGroupMember::Instance(authz_instance.id());
251+
247252
self.db_datastore
248253
.affinity_group_member_add(opctx, &authz_affinity_group, member)
249254
.await
@@ -253,11 +258,16 @@ impl super::Nexus {
253258
&self,
254259
opctx: &OpContext,
255260
anti_affinity_group_lookup: &lookup::AntiAffinityGroup<'_>,
256-
member: external::AntiAffinityGroupMember,
261+
instance_lookup: &lookup::Instance<'_>,
257262
) -> Result<(), Error> {
258263
let (.., authz_anti_affinity_group) = anti_affinity_group_lookup
259264
.lookup_for(authz::Action::Modify)
260265
.await?;
266+
let (.., authz_instance) =
267+
instance_lookup.lookup_for(authz::Action::Read).await?;
268+
let member =
269+
external::AntiAffinityGroupMember::Instance(authz_instance.id());
270+
261271
self.db_datastore
262272
.anti_affinity_group_member_add(
263273
opctx,
@@ -271,10 +281,15 @@ impl super::Nexus {
271281
&self,
272282
opctx: &OpContext,
273283
affinity_group_lookup: &lookup::AffinityGroup<'_>,
274-
member: external::AffinityGroupMember,
284+
instance_lookup: &lookup::Instance<'_>,
275285
) -> Result<(), Error> {
276286
let (.., authz_affinity_group) =
277287
affinity_group_lookup.lookup_for(authz::Action::Modify).await?;
288+
let (.., authz_instance) =
289+
instance_lookup.lookup_for(authz::Action::Read).await?;
290+
let member =
291+
external::AffinityGroupMember::Instance(authz_instance.id());
292+
278293
self.db_datastore
279294
.affinity_group_member_delete(opctx, &authz_affinity_group, member)
280295
.await
@@ -284,11 +299,16 @@ impl super::Nexus {
284299
&self,
285300
opctx: &OpContext,
286301
anti_affinity_group_lookup: &lookup::AntiAffinityGroup<'_>,
287-
member: external::AntiAffinityGroupMember,
302+
instance_lookup: &lookup::Instance<'_>,
288303
) -> Result<(), Error> {
289304
let (.., authz_anti_affinity_group) = anti_affinity_group_lookup
290305
.lookup_for(authz::Action::Modify)
291306
.await?;
307+
let (.., authz_instance) =
308+
instance_lookup.lookup_for(authz::Action::Read).await?;
309+
let member =
310+
external::AntiAffinityGroupMember::Instance(authz_instance.id());
311+
292312
self.db_datastore
293313
.anti_affinity_group_member_delete(
294314
opctx,

nexus/src/external_api/http_entrypoints.rs

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,15 +2597,29 @@ impl NexusExternalApi for NexusExternalApiImpl {
25972597
let nexus = &apictx.context.nexus;
25982598
let path = path_params.into_inner();
25992599
let query = query_params.into_inner();
2600+
2601+
// Select group
26002602
let group_selector = params::AffinityGroupSelector {
26012603
affinity_group: path.affinity_group,
2602-
project: query.project,
2604+
project: query.project.clone(),
26032605
};
26042606
let group_lookup =
26052607
nexus.affinity_group_lookup(&opctx, group_selector)?;
2606-
let instance = AffinityGroupMember::Instance(path.instance);
2608+
2609+
// Select instance
2610+
let instance_selector = params::InstanceSelector {
2611+
project: query.project,
2612+
instance: path.instance,
2613+
};
2614+
let instance_lookup =
2615+
nexus.instance_lookup(&opctx, instance_selector)?;
2616+
26072617
nexus
2608-
.affinity_group_member_add(&opctx, &group_lookup, instance)
2618+
.affinity_group_member_add(
2619+
&opctx,
2620+
&group_lookup,
2621+
&instance_lookup,
2622+
)
26092623
.await?;
26102624
Ok(HttpResponseUpdatedNoContent {})
26112625
};
@@ -2628,15 +2642,28 @@ impl NexusExternalApi for NexusExternalApiImpl {
26282642
let nexus = &apictx.context.nexus;
26292643
let path = path_params.into_inner();
26302644
let query = query_params.into_inner();
2645+
2646+
// Select group
26312647
let group_selector = params::AffinityGroupSelector {
26322648
affinity_group: path.affinity_group,
2633-
project: query.project,
2649+
project: query.project.clone(),
26342650
};
26352651
let group_lookup =
26362652
nexus.affinity_group_lookup(&opctx, group_selector)?;
2637-
let instance = AffinityGroupMember::Instance(path.instance);
2653+
2654+
// Select instance
2655+
let instance_selector = params::InstanceSelector {
2656+
project: query.project,
2657+
instance: path.instance,
2658+
};
2659+
let instance_lookup =
2660+
nexus.instance_lookup(&opctx, instance_selector)?;
26382661
nexus
2639-
.affinity_group_member_delete(&opctx, &group_lookup, instance)
2662+
.affinity_group_member_delete(
2663+
&opctx,
2664+
&group_lookup,
2665+
&instance_lookup,
2666+
)
26402667
.await?;
26412668
Ok(HttpResponseDeleted())
26422669
};
@@ -2795,15 +2822,29 @@ impl NexusExternalApi for NexusExternalApiImpl {
27952822
let nexus = &apictx.context.nexus;
27962823
let path = path_params.into_inner();
27972824
let query = query_params.into_inner();
2825+
2826+
// Select group
27982827
let group_selector = params::AntiAffinityGroupSelector {
27992828
anti_affinity_group: path.anti_affinity_group,
2800-
project: query.project,
2829+
project: query.project.clone(),
28012830
};
28022831
let group_lookup =
28032832
nexus.anti_affinity_group_lookup(&opctx, group_selector)?;
2804-
let instance = AntiAffinityGroupMember::Instance(path.instance);
2833+
2834+
// Select instance
2835+
let instance_selector = params::InstanceSelector {
2836+
project: query.project,
2837+
instance: path.instance,
2838+
};
2839+
let instance_lookup =
2840+
nexus.instance_lookup(&opctx, instance_selector)?;
2841+
28052842
nexus
2806-
.anti_affinity_group_member_add(&opctx, &group_lookup, instance)
2843+
.anti_affinity_group_member_add(
2844+
&opctx,
2845+
&group_lookup,
2846+
&instance_lookup,
2847+
)
28072848
.await?;
28082849
Ok(HttpResponseUpdatedNoContent {})
28092850
};
@@ -2826,18 +2867,28 @@ impl NexusExternalApi for NexusExternalApiImpl {
28262867
let nexus = &apictx.context.nexus;
28272868
let path = path_params.into_inner();
28282869
let query = query_params.into_inner();
2870+
2871+
// Select group
28292872
let group_selector = params::AntiAffinityGroupSelector {
28302873
anti_affinity_group: path.anti_affinity_group,
2831-
project: query.project,
2874+
project: query.project.clone(),
28322875
};
28332876
let group_lookup =
28342877
nexus.anti_affinity_group_lookup(&opctx, group_selector)?;
2835-
let instance = AntiAffinityGroupMember::Instance(path.instance);
2878+
2879+
// Select instance
2880+
let instance_selector = params::InstanceSelector {
2881+
project: query.project,
2882+
instance: path.instance,
2883+
};
2884+
let instance_lookup =
2885+
nexus.instance_lookup(&opctx, instance_selector)?;
2886+
28362887
nexus
28372888
.anti_affinity_group_member_delete(
28382889
&opctx,
28392890
&group_lookup,
2840-
instance,
2891+
&instance_lookup,
28412892
)
28422893
.await?;
28432894
Ok(HttpResponseDeleted())

nexus/types/src/external_api/params.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,13 +823,13 @@ pub struct AffinityGroupCreate {
823823
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
824824
pub struct AffinityInstanceGroupMemberPath {
825825
pub affinity_group: NameOrId,
826-
pub instance: Uuid,
826+
pub instance: NameOrId,
827827
}
828828

829829
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
830830
pub struct AntiAffinityInstanceGroupMemberPath {
831831
pub anti_affinity_group: NameOrId,
832-
pub instance: Uuid,
832+
pub instance: NameOrId,
833833
}
834834

835835
/// Create-time parameters for an `AntiAffinityGroup`

openapi/nexus.json

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -940,8 +940,7 @@
940940
"name": "instance",
941941
"required": true,
942942
"schema": {
943-
"type": "string",
944-
"format": "uuid"
943+
"$ref": "#/components/schemas/NameOrId"
945944
}
946945
}
947946
],
@@ -985,8 +984,7 @@
985984
"name": "instance",
986985
"required": true,
987986
"schema": {
988-
"type": "string",
989-
"format": "uuid"
987+
"$ref": "#/components/schemas/NameOrId"
990988
}
991989
}
992990
],
@@ -1260,8 +1258,7 @@
12601258
"name": "instance",
12611259
"required": true,
12621260
"schema": {
1263-
"type": "string",
1264-
"format": "uuid"
1261+
"$ref": "#/components/schemas/NameOrId"
12651262
}
12661263
}
12671264
],
@@ -1305,8 +1302,7 @@
13051302
"name": "instance",
13061303
"required": true,
13071304
"schema": {
1308-
"type": "string",
1309-
"format": "uuid"
1305+
"$ref": "#/components/schemas/NameOrId"
13101306
}
13111307
}
13121308
],

0 commit comments

Comments
 (0)