1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use aws_sdk_ec2::types::InstanceType;

/// Defines an instance that can be launched via [`Aws::create_ec2_instance`]
pub struct Ec2InstanceDefinition {
    pub(crate) instance_type: InstanceType,
    pub(crate) volume_size_gb: u32,
    pub(crate) network_interface_count: u32,
    pub(crate) os: InstanceOs,
}

impl Ec2InstanceDefinition {
    /// Start defining an instance with the specified instance type
    pub fn new(instance_type: InstanceType) -> Self {
        Ec2InstanceDefinition {
            instance_type,
            volume_size_gb: 8,
            network_interface_count: 1,
            os: InstanceOs::Ubuntu22_04,
        }
    }

    // Set instance to have a root volume of the specified size.
    // Defaults to 8GB.
    pub fn volume_size_gigabytes(mut self, size_gb: u32) -> Self {
        self.volume_size_gb = size_gb;
        self
    }

    /// Sets the amount of network interfaces to use on this instance.
    /// Defaults to 1
    ///
    /// Setting this to a value other than 1 will result in the creation of an elastic ip to point at your instance.
    /// This is an unfortunate requirement of AWS ECS, instances with multiple network interfaces do not get the automatically assigned ipv4 address given to instances with 1 network interface.
    /// For most users there is a hard limit of 5 elastic ip addresses allowed at one time.
    pub fn network_interface_count(mut self, count: u32) -> Self {
        self.network_interface_count = count;
        self
    }

    // Set the OS used by the instance.
    // Defaults to `Ubuntu 22.04`
    pub fn os(mut self, os: InstanceOs) -> Self {
        self.os = os;
        self
    }
}

/// aws-throwaway needs to manually support each OS, so the only OS's you can use are those listed in this enum.
/// Support for more (similar) OS's is welcome via pull request.
#[derive(Clone, Copy)]
#[non_exhaustive]
pub enum InstanceOs {
    Ubuntu20_04,
    Ubuntu22_04,
}