github.com/timsutton/packer@v1.3.2/builder/amazon/ebssurrogate/step_register_ami_test.go (about) 1 package ebssurrogate 2 3 import ( 4 "reflect" 5 "sort" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/service/ec2" 10 ) 11 12 const sourceDeviceName = "/dev/xvdf" 13 const rootDeviceName = "/dev/xvda" 14 15 func newStepRegisterAMI(amiDevices, launchDevices []*ec2.BlockDeviceMapping) *StepRegisterAMI { 16 return &StepRegisterAMI{ 17 RootDevice: RootBlockDevice{ 18 SourceDeviceName: sourceDeviceName, 19 DeviceName: rootDeviceName, 20 DeleteOnTermination: true, 21 VolumeType: "ebs", 22 VolumeSize: 10, 23 }, 24 AMIDevices: amiDevices, 25 LaunchDevices: launchDevices, 26 } 27 } 28 29 func sorted(devices []*ec2.BlockDeviceMapping) []*ec2.BlockDeviceMapping { 30 sort.SliceStable(devices, func(i, j int) bool { 31 return *devices[i].DeviceName < *devices[j].DeviceName 32 }) 33 return devices 34 } 35 36 func TestStepRegisterAmi_combineDevices(t *testing.T) { 37 cases := []struct { 38 snapshotIds map[string]string 39 amiDevices []*ec2.BlockDeviceMapping 40 launchDevices []*ec2.BlockDeviceMapping 41 allDevices []*ec2.BlockDeviceMapping 42 }{ 43 { 44 snapshotIds: map[string]string{}, 45 amiDevices: []*ec2.BlockDeviceMapping{}, 46 launchDevices: []*ec2.BlockDeviceMapping{}, 47 allDevices: []*ec2.BlockDeviceMapping{}, 48 }, 49 { 50 snapshotIds: map[string]string{}, 51 amiDevices: []*ec2.BlockDeviceMapping{}, 52 launchDevices: []*ec2.BlockDeviceMapping{ 53 { 54 Ebs: &ec2.EbsBlockDevice{}, 55 DeviceName: aws.String(sourceDeviceName), 56 }, 57 }, 58 allDevices: []*ec2.BlockDeviceMapping{ 59 { 60 Ebs: &ec2.EbsBlockDevice{}, 61 DeviceName: aws.String(rootDeviceName), 62 }, 63 }, 64 }, 65 { 66 // Minimal single device 67 snapshotIds: map[string]string{ 68 sourceDeviceName: "snap-0123456789abcdef1", 69 }, 70 amiDevices: []*ec2.BlockDeviceMapping{}, 71 launchDevices: []*ec2.BlockDeviceMapping{ 72 { 73 Ebs: &ec2.EbsBlockDevice{}, 74 DeviceName: aws.String(sourceDeviceName), 75 }, 76 }, 77 allDevices: []*ec2.BlockDeviceMapping{ 78 { 79 Ebs: &ec2.EbsBlockDevice{ 80 SnapshotId: aws.String("snap-0123456789abcdef1"), 81 }, 82 DeviceName: aws.String(rootDeviceName), 83 }, 84 }, 85 }, 86 { 87 // Single launch device with AMI device 88 snapshotIds: map[string]string{ 89 sourceDeviceName: "snap-0123456789abcdef1", 90 }, 91 amiDevices: []*ec2.BlockDeviceMapping{ 92 { 93 Ebs: &ec2.EbsBlockDevice{}, 94 DeviceName: aws.String("/dev/xvdg"), 95 }, 96 }, 97 launchDevices: []*ec2.BlockDeviceMapping{ 98 { 99 Ebs: &ec2.EbsBlockDevice{}, 100 DeviceName: aws.String(sourceDeviceName), 101 }, 102 }, 103 allDevices: []*ec2.BlockDeviceMapping{ 104 { 105 Ebs: &ec2.EbsBlockDevice{ 106 SnapshotId: aws.String("snap-0123456789abcdef1"), 107 }, 108 DeviceName: aws.String(rootDeviceName), 109 }, 110 { 111 Ebs: &ec2.EbsBlockDevice{}, 112 DeviceName: aws.String("/dev/xvdg"), 113 }, 114 }, 115 }, 116 { 117 // Multiple launch devices 118 snapshotIds: map[string]string{ 119 sourceDeviceName: "snap-0123456789abcdef1", 120 "/dev/xvdg": "snap-0123456789abcdef2", 121 }, 122 amiDevices: []*ec2.BlockDeviceMapping{}, 123 launchDevices: []*ec2.BlockDeviceMapping{ 124 { 125 Ebs: &ec2.EbsBlockDevice{}, 126 DeviceName: aws.String(sourceDeviceName), 127 }, 128 { 129 Ebs: &ec2.EbsBlockDevice{}, 130 DeviceName: aws.String("/dev/xvdg"), 131 }, 132 }, 133 allDevices: []*ec2.BlockDeviceMapping{ 134 { 135 Ebs: &ec2.EbsBlockDevice{ 136 SnapshotId: aws.String("snap-0123456789abcdef1"), 137 }, 138 DeviceName: aws.String(rootDeviceName), 139 }, 140 { 141 Ebs: &ec2.EbsBlockDevice{ 142 SnapshotId: aws.String("snap-0123456789abcdef2"), 143 }, 144 DeviceName: aws.String("/dev/xvdg"), 145 }, 146 }, 147 }, 148 { 149 // Multiple launch devices with encryption 150 snapshotIds: map[string]string{ 151 sourceDeviceName: "snap-0123456789abcdef1", 152 "/dev/xvdg": "snap-0123456789abcdef2", 153 }, 154 amiDevices: []*ec2.BlockDeviceMapping{}, 155 launchDevices: []*ec2.BlockDeviceMapping{ 156 { 157 Ebs: &ec2.EbsBlockDevice{ 158 Encrypted: aws.Bool(true), 159 }, 160 DeviceName: aws.String(sourceDeviceName), 161 }, 162 { 163 Ebs: &ec2.EbsBlockDevice{ 164 Encrypted: aws.Bool(true), 165 }, 166 DeviceName: aws.String("/dev/xvdg"), 167 }, 168 }, 169 allDevices: []*ec2.BlockDeviceMapping{ 170 { 171 Ebs: &ec2.EbsBlockDevice{ 172 SnapshotId: aws.String("snap-0123456789abcdef1"), 173 // Encrypted: true stripped from snapshotted devices 174 }, 175 DeviceName: aws.String(rootDeviceName), 176 }, 177 { 178 Ebs: &ec2.EbsBlockDevice{ 179 SnapshotId: aws.String("snap-0123456789abcdef2"), 180 }, 181 DeviceName: aws.String("/dev/xvdg"), 182 }, 183 }, 184 }, 185 { 186 // Multiple launch devices and AMI devices with encryption 187 snapshotIds: map[string]string{ 188 sourceDeviceName: "snap-0123456789abcdef1", 189 "/dev/xvdg": "snap-0123456789abcdef2", 190 }, 191 amiDevices: []*ec2.BlockDeviceMapping{ 192 { 193 Ebs: &ec2.EbsBlockDevice{ 194 Encrypted: aws.Bool(true), 195 KmsKeyId: aws.String("keyId"), 196 }, 197 // Source device name can be used in AMI devices 198 // since launch device of same name gets renamed 199 // to root device name 200 DeviceName: aws.String(sourceDeviceName), 201 }, 202 }, 203 launchDevices: []*ec2.BlockDeviceMapping{ 204 { 205 Ebs: &ec2.EbsBlockDevice{ 206 Encrypted: aws.Bool(true), 207 }, 208 DeviceName: aws.String(sourceDeviceName), 209 }, 210 { 211 Ebs: &ec2.EbsBlockDevice{ 212 Encrypted: aws.Bool(true), 213 }, 214 DeviceName: aws.String("/dev/xvdg"), 215 }, 216 }, 217 allDevices: []*ec2.BlockDeviceMapping{ 218 { 219 Ebs: &ec2.EbsBlockDevice{ 220 Encrypted: aws.Bool(true), 221 KmsKeyId: aws.String("keyId"), 222 }, 223 DeviceName: aws.String(sourceDeviceName), 224 }, 225 { 226 Ebs: &ec2.EbsBlockDevice{ 227 SnapshotId: aws.String("snap-0123456789abcdef1"), 228 }, 229 DeviceName: aws.String(rootDeviceName), 230 }, 231 { 232 Ebs: &ec2.EbsBlockDevice{ 233 SnapshotId: aws.String("snap-0123456789abcdef2"), 234 }, 235 DeviceName: aws.String("/dev/xvdg"), 236 }, 237 }, 238 }, 239 } 240 for _, tc := range cases { 241 stepRegisterAmi := newStepRegisterAMI(tc.amiDevices, tc.launchDevices) 242 allDevices := stepRegisterAmi.combineDevices(tc.snapshotIds) 243 if !reflect.DeepEqual(sorted(allDevices), sorted(tc.allDevices)) { 244 t.Fatalf("Unexpected output from combineDevices") 245 } 246 } 247 }