From 524bffb2cc493af3bc2cec63a634196ebb861387 Mon Sep 17 00:00:00 2001 From: Justin Bennett Date: Tue, 5 Apr 2022 00:30:40 -0400 Subject: [PATCH] Remove extra params wrapper for network_interfaces in instance create --- nexus/src/external_api/params.rs | 7 +--- nexus/src/sagas.rs | 12 ++---- nexus/tests/integration_tests/instances.rs | 47 ++++++++++------------ openapi/nexus.json | 19 ++------- 4 files changed, 31 insertions(+), 54 deletions(-) diff --git a/nexus/src/external_api/params.rs b/nexus/src/external_api/params.rs index 6b2bc08b7c2..ee44b406e63 100644 --- a/nexus/src/external_api/params.rs +++ b/nexus/src/external_api/params.rs @@ -94,7 +94,7 @@ pub struct NetworkInterfaceCreate { #[serde(tag = "type", content = "params")] pub enum InstanceNetworkInterfaceAttachment { /// Create one or more `NetworkInterface`s for the `Instance` - Create(InstanceNetworkInterfaceCreate), + Create(Vec), /// Default networking setup, which creates a single interface with an /// auto-assigned IP address from project's "default" VPC and "default" VPC @@ -105,11 +105,6 @@ pub enum InstanceNetworkInterfaceAttachment { None, } -#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema)] -pub struct InstanceNetworkInterfaceCreate { - pub params: Vec, -} - impl Default for InstanceNetworkInterfaceAttachment { fn default() -> Self { Self::Default diff --git a/nexus/src/sagas.rs b/nexus/src/sagas.rs index cd1d3c3ffa0..176d5a6367b 100644 --- a/nexus/src/sagas.rs +++ b/nexus/src/sagas.rs @@ -273,7 +273,7 @@ async fn sic_allocate_network_interface_ids( params::InstanceNetworkInterfaceAttachment::Create( ref create_params, ) => { - if create_params.params.len() + if create_params.len() > crate::nexus::MAX_NICS_PER_INSTANCE.try_into().unwrap() { return Err(ActionError::action_failed( @@ -287,8 +287,8 @@ async fn sic_allocate_network_interface_ids( ), )); } - let mut ids = Vec::with_capacity(create_params.params.len()); - for _ in 0..create_params.params.len() { + let mut ids = Vec::with_capacity(create_params.len()); + for _ in 0..create_params.len() { ids.push(Uuid::new_v4()); } Ok(ids) @@ -307,11 +307,7 @@ async fn sic_create_network_interfaces( params::InstanceNetworkInterfaceAttachment::Create( ref create_params, ) => { - sic_create_custom_network_interfaces( - &sagactx, - &create_params.params, - ) - .await + sic_create_custom_network_interfaces(&sagactx, &create_params).await } } } diff --git a/nexus/tests/integration_tests/instances.rs b/nexus/tests/integration_tests/instances.rs index b70db9d1926..92130724aab 100644 --- a/nexus/tests/integration_tests/instances.rs +++ b/nexus/tests/integration_tests/instances.rs @@ -549,11 +549,10 @@ async fn test_instance_create_saga_removes_instance_database_record( subnet_name: default_name.clone(), ip: Some(requested_address), }; - let interface_params = params::InstanceNetworkInterfaceAttachment::Create( - params::InstanceNetworkInterfaceCreate { - params: vec![if0_params.clone()], - }, - ); + let interface_params = + params::InstanceNetworkInterfaceAttachment::Create(vec![ + if0_params.clone() + ]); // Create the parameters for the instance itself, and create it. let instance_params = params::InstanceCreate { @@ -611,11 +610,10 @@ async fn test_instance_create_saga_removes_instance_database_record( subnet_name: default_name.clone(), ip: Some(requested_address), }; - let interface_params = params::InstanceNetworkInterfaceAttachment::Create( - params::InstanceNetworkInterfaceCreate { - params: vec![if0_params.clone()], - }, - ); + let interface_params = + params::InstanceNetworkInterfaceAttachment::Create(vec![ + if0_params.clone() + ]); let instance_params = params::InstanceCreate { network_interfaces: interface_params, ..instance_params.clone() @@ -657,11 +655,10 @@ async fn test_instance_with_single_explicit_ip_address( subnet_name: default_name.clone(), ip: Some(requested_address), }; - let interface_params = params::InstanceNetworkInterfaceAttachment::Create( - params::InstanceNetworkInterfaceCreate { - params: vec![if0_params.clone()], - }, - ); + let interface_params = + params::InstanceNetworkInterfaceAttachment::Create(vec![ + if0_params.clone() + ]); // Create the parameters for the instance itself, and create it. let instance_params = params::InstanceCreate { @@ -773,11 +770,11 @@ async fn test_instance_with_new_custom_network_interfaces( subnet_name: non_default_subnet_name.clone(), ip: None, }; - let interface_params = params::InstanceNetworkInterfaceAttachment::Create( - params::InstanceNetworkInterfaceCreate { - params: vec![if0_params.clone(), if1_params.clone()], - }, - ); + let interface_params = + params::InstanceNetworkInterfaceAttachment::Create(vec![ + if0_params.clone(), + if1_params.clone(), + ]); // Create the parameters for the instance itself, and create it. let instance_params = params::InstanceCreate { @@ -1049,11 +1046,11 @@ async fn test_instance_with_multiple_nics_unwinds_completely( subnet_name: default_name.clone(), ip: Some("172.30.0.6".parse().unwrap()), }; - let interface_params = params::InstanceNetworkInterfaceAttachment::Create( - params::InstanceNetworkInterfaceCreate { - params: vec![if0_params.clone(), if1_params.clone()], - }, - ); + let interface_params = + params::InstanceNetworkInterfaceAttachment::Create(vec![ + if0_params.clone(), + if1_params.clone(), + ]); // Create the parameters for the instance itself, and create it. let instance_params = params::InstanceCreate { diff --git a/openapi/nexus.json b/openapi/nexus.json index ff75aab5120..b71b5a71fc0 100644 --- a/openapi/nexus.json +++ b/openapi/nexus.json @@ -5423,7 +5423,10 @@ "type": "object", "properties": { "params": { - "$ref": "#/components/schemas/InstanceNetworkInterfaceCreate" + "type": "array", + "items": { + "$ref": "#/components/schemas/NetworkInterfaceCreate" + } }, "type": { "type": "string", @@ -5469,20 +5472,6 @@ } ] }, - "InstanceNetworkInterfaceCreate": { - "type": "object", - "properties": { - "params": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NetworkInterfaceCreate" - } - } - }, - "required": [ - "params" - ] - }, "InstanceResultsPage": { "description": "A single page of results", "type": "object",