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  }