package ebsvolume import ( "testing" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" ) func testConfig() map[string]interface{} { return map[string]interface{}{ "access_key": "foo", "secret_key": "bar", "source_ami": "foo", "instance_type": "foo", "region": "us-east-1", "ssh_username": "root", } } func TestBuilder_ImplementsBuilder(t *testing.T) { var raw interface{} raw = &Builder{} if _, ok := raw.(packersdk.Builder); !ok { t.Fatalf("Builder should be a builder") } } func TestBuilder_Prepare_BadType(t *testing.T) { b := &Builder{} c := map[string]interface{}{ "access_key": []string{}, } _, warnings, err := b.Prepare(c) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err == nil { t.Fatalf("prepare should fail") } } func TestBuilderPrepare_InvalidKey(t *testing.T) { var b Builder config := testConfig() // Add a random key config["i_should_not_be_valid"] = true _, warnings, err := b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err == nil { t.Fatal("should have error") } } func TestBuilderPrepare_InvalidShutdownBehavior(t *testing.T) { var b Builder config := testConfig() // Test good config["shutdown_behavior"] = "terminate" _, warnings, err := b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err != nil { t.Fatalf("should not have error: %s", err) } // Test good config["shutdown_behavior"] = "stop" _, warnings, err = b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err != nil { t.Fatalf("should not have error: %s", err) } // Test bad config["shutdown_behavior"] = "foobar" _, warnings, err = b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err == nil { t.Fatal("should have error") } } func TestBuilderPrepare_ReturnGeneratedData(t *testing.T) { var b Builder config := testConfig() generatedData, warnings, err := b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err != nil { t.Fatalf("should not have error: %s", err) } if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } if generatedData[0] != "SourceAMIName" { t.Fatalf("Generated data should contain SourceAMIName") } if generatedData[1] != "BuildRegion" { t.Fatalf("Generated data should contain BuildRegion") } if generatedData[2] != "SourceAMI" { t.Fatalf("Generated data should contain SourceAMI") } if generatedData[3] != "SourceAMICreationDate" { t.Fatalf("Generated data should contain SourceAMICreationDate") } if generatedData[4] != "SourceAMIOwner" { t.Fatalf("Generated data should contain SourceAMIOwner") } if generatedData[5] != "SourceAMIOwnerName" { t.Fatalf("Generated data should contain SourceAMIOwnerName") } } func TestBuidler_ConfigBlockdevicemapping(t *testing.T) { var b Builder config := testConfig() //Set some snapshot settings config["ebs_volumes"] = []map[string]interface{}{ { "device_name": "/dev/xvdb", "volume_size": "32", "delete_on_termination": true, }, { "device_name": "/dev/xvdc", "volume_size": "32", "delete_on_termination": true, "snapshot_tags": map[string]string{ "Test_Tag": "tag_value", "another tag": "another value", }, "snapshot_users": []string{ "123", "456", }, }, } generatedData, warnings, err := b.Prepare(config) if len(warnings) > 0 { t.Fatalf("bad: %#v", warnings) } if err != nil { t.Fatalf("should not have error: %s", err) } if len(generatedData) == 0 { t.Fatalf("Generated data should not be empty") } t.Logf("Test gen %+v", b.config.VolumeMappings) }