Skip to content
Open
2 changes: 2 additions & 0 deletions common/src/api/external/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -996,6 +996,8 @@ pub enum ResourceType {
Snapshot,
SshKey,
SupportBundle,
SubnetPool,
SubnetPoolMember,
Switch,
SwitchPort,
SwitchPortSettings,
Expand Down
16 changes: 16 additions & 0 deletions nexus/external-api/output/nexus_tags.txt
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,22 @@ API operations found with tag "system/status"
OPERATION ID METHOD URL PATH
ping GET /v1/ping

API operations found with tag "system/subnet-pools"
OPERATION ID METHOD URL PATH
subnet_pool_create POST /v1/system/subnet-pools
subnet_pool_delete DELETE /v1/system/subnet-pools/{pool}
subnet_pool_list GET /v1/system/subnet-pools
subnet_pool_member_list GET /v1/system/subnet-pools/{pool}/subnets
subnet_pool_silo_link POST /v1/system/subnet-pools/{pool}/silos
subnet_pool_silo_list GET /v1/system/subnet-pools/{pool}/silos
subnet_pool_silo_unlink DELETE /v1/system/subnet-pools/{pool}/silos/{silo}
subnet_pool_silo_update PUT /v1/system/subnet-pools/{pool}/silos/{silo}
subnet_pool_subnet_add POST /v1/system/subnet-pools/{pool}/subnets/add
subnet_pool_subnet_remove POST /v1/system/subnet-pools/{pool}/subnets/remove
subnet_pool_update PUT /v1/system/subnet-pools/{pool}
subnet_pool_utilization_view GET /v1/system/subnet-pools/{pool}/utilization
subnet_pool_view GET /v1/system/subnet-pools/{pool}

API operations found with tag "system/update"
OPERATION ID METHOD URL PATH
system_update_repository_list GET /v1/system/update/repositories
Expand Down
175 changes: 175 additions & 0 deletions nexus/external-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ api_versions!([
// | date-based version should be at the top of the list.
// v
// (next_yyyymmddnn, IDENT),
(2026011601, EXTERNAL_SUBNET_ATTACHMENT),
(2026011600, RENAME_ADDRESS_SELECTOR_TO_ADDRESS_ALLOCATOR),
(2026011501, AUDIT_LOG_CREDENTIAL_ID),
(2026011500, AUDIT_LOG_AUTH_METHOD_ENUM),
Expand Down Expand Up @@ -295,6 +296,15 @@ const PUT_UPDATE_REPOSITORY_MAX_BYTES: usize = 4 * GIB;
url = "http://docs.oxide.computer/api/system-ip-pools"
}
},
"system/subnet-pools" = {
description = "Subnet pools are collections of IP subnets \
that can be assigned to silos. When a pool is linked to \
a silo, users in that silo can allocate external subnets \
from the pool.",
external_docs = {
url = "http://docs.oxide.computer/api/system-subnet-pools"
}
},
"system/networking" = {
description = "This provides rack-level network configuration.",
external_docs = {
Expand Down Expand Up @@ -1277,6 +1287,171 @@ pub trait NexusExternalApi {
range_params: TypedBody<shared::IpRange>,
) -> Result<HttpResponseUpdatedNoContent, HttpError>;

// Subnet Pools

/// List subnet pools
#[endpoint {
method = GET,
path = "/v1/system/subnet-pools",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_list(
rqctx: RequestContext<Self::Context>,
query_params: Query<PaginatedByNameOrId>,
) -> Result<HttpResponseOk<ResultsPage<views::SubnetPool>>, HttpError>;

/// Create a subnet pool
#[endpoint {
method = POST,
path = "/v1/system/subnet-pools",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_create(
rqctx: RequestContext<Self::Context>,
pool_params: TypedBody<params::SubnetPoolCreate>,
) -> Result<HttpResponseCreated<views::SubnetPool>, HttpError>;

/// Fetch a subnet pool
#[endpoint {
method = GET,
path = "/v1/system/subnet-pools/{pool}",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_view(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
) -> Result<HttpResponseOk<views::SubnetPool>, HttpError>;

/// Update a subnet pool
#[endpoint {
method = PUT,
path = "/v1/system/subnet-pools/{pool}",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_update(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
updates: TypedBody<params::SubnetPoolUpdate>,
) -> Result<HttpResponseOk<views::SubnetPool>, HttpError>;

/// Delete a subnet pool
#[endpoint {
method = DELETE,
path = "/v1/system/subnet-pools/{pool}",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_delete(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
) -> Result<HttpResponseDeleted, HttpError>;

/// List subnets in a pool
#[endpoint {
method = GET,
path = "/v1/system/subnet-pools/{pool}/subnets",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_member_list(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
query_params: Query<PaginatedByNameOrId>,
) -> Result<HttpResponseOk<ResultsPage<views::SubnetPoolMember>>, HttpError>;

/// Add a subnet to a pool
#[endpoint {
method = POST,
path = "/v1/system/subnet-pools/{pool}/subnets/add",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_subnet_add(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
subnet_params: TypedBody<params::SubnetPoolMemberAdd>,
) -> Result<HttpResponseCreated<views::SubnetPoolMember>, HttpError>;

/// Remove a subnet from a pool
#[endpoint {
method = POST,
path = "/v1/system/subnet-pools/{pool}/subnets/remove",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_subnet_remove(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
subnet_params: TypedBody<params::SubnetPoolMemberRemove>,
) -> Result<HttpResponseUpdatedNoContent, HttpError>;

/// List silos linked to a subnet pool
#[endpoint {
method = GET,
path = "/v1/system/subnet-pools/{pool}/silos",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_silo_list(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
query_params: Query<PaginatedById>,
) -> Result<HttpResponseOk<ResultsPage<views::SubnetPoolSiloLink>>, HttpError>;

/// Link a subnet pool to a silo
#[endpoint {
method = POST,
path = "/v1/system/subnet-pools/{pool}/silos",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_silo_link(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
silo_link: TypedBody<params::SubnetPoolLinkSilo>,
) -> Result<HttpResponseCreated<views::SubnetPoolSiloLink>, HttpError>;

/// Update a subnet pool's link to a silo
#[endpoint {
method = PUT,
path = "/v1/system/subnet-pools/{pool}/silos/{silo}",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_silo_update(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolSiloPath>,
update: TypedBody<params::SubnetPoolSiloUpdate>,
) -> Result<HttpResponseOk<views::SubnetPoolSiloLink>, HttpError>;

/// Unlink a subnet pool from a silo
#[endpoint {
method = DELETE,
path = "/v1/system/subnet-pools/{pool}/silos/{silo}",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_silo_unlink(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolSiloPath>,
) -> Result<HttpResponseUpdatedNoContent, HttpError>;

/// Fetch subnet pool utilization
#[endpoint {
method = GET,
path = "/v1/system/subnet-pools/{pool}/utilization",
tags = ["system/subnet-pools"],
versions = VERSION_EXTERNAL_SUBNET_ATTACHMENT..,
}]
async fn subnet_pool_utilization_view(
rqctx: RequestContext<Self::Context>,
path_params: Path<params::SubnetPoolPath>,
) -> Result<HttpResponseOk<views::SubnetPoolUtilization>, HttpError>;

// Floating IP Addresses

/// List floating IPs
Expand Down
1 change: 1 addition & 0 deletions nexus/src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ mod sled;
mod sled_instance;
mod snapshot;
mod ssh_key;
mod subnet_pool;
pub(crate) mod support_bundles;
mod switch;
mod switch_interface;
Expand Down
Loading
Loading