github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/oracle/oci/config_test.go (about)

     1  package oci
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"reflect"
     7  	"strings"
     8  	"testing"
     9  
    10  	client "github.com/hashicorp/packer/builder/oracle/oci/client"
    11  )
    12  
    13  func testConfig(accessConfFile *os.File) map[string]interface{} {
    14  	return map[string]interface{}{
    15  		"availability_domain": "aaaa:PHX-AD-3",
    16  		"access_cfg_file":     accessConfFile.Name(),
    17  
    18  		// Image
    19  		"base_image_ocid": "ocd1...",
    20  		"shape":           "VM.Standard1.1",
    21  		"image_name":      "HelloWorld",
    22  
    23  		// Networking
    24  		"subnet_ocid": "ocd1...",
    25  
    26  		// Comm
    27  		"ssh_username": "opc",
    28  	}
    29  }
    30  
    31  func getField(c *client.Config, field string) string {
    32  	r := reflect.ValueOf(c)
    33  	f := reflect.Indirect(r).FieldByName(field)
    34  	return string(f.String())
    35  }
    36  
    37  func TestConfig(t *testing.T) {
    38  	// Shared set-up and defered deletion
    39  
    40  	cfg, keyFile, err := client.BaseTestConfig()
    41  	if err != nil {
    42  		t.Fatal(err)
    43  	}
    44  	defer os.Remove(keyFile.Name())
    45  
    46  	cfgFile, err := client.WriteTestConfig(cfg)
    47  	if err != nil {
    48  		t.Fatal(err)
    49  	}
    50  	defer os.Remove(cfgFile.Name())
    51  
    52  	// Temporarily set $HOME to temp directory to bypass default
    53  	// access config loading.
    54  
    55  	tmpHome, err := ioutil.TempDir("", "packer_config_test")
    56  	if err != nil {
    57  		t.Fatalf("err: %+v", err)
    58  	}
    59  	defer os.Remove(tmpHome)
    60  
    61  	home := os.Getenv("HOME")
    62  	os.Setenv("HOME", tmpHome)
    63  	defer os.Setenv("HOME", home)
    64  
    65  	// Config tests
    66  
    67  	t.Run("BaseConfig", func(t *testing.T) {
    68  		raw := testConfig(cfgFile)
    69  		_, errs := NewConfig(raw)
    70  
    71  		if errs != nil {
    72  			t.Fatalf("err: %+v", errs)
    73  		}
    74  
    75  	})
    76  
    77  	t.Run("NoAccessConfig", func(t *testing.T) {
    78  		raw := testConfig(cfgFile)
    79  		delete(raw, "access_cfg_file")
    80  
    81  		_, errs := NewConfig(raw)
    82  
    83  		s := errs.Error()
    84  		expectedErrors := []string{
    85  			"'user_ocid'", "'tenancy_ocid'", "'fingerprint'",
    86  			"'key_file'",
    87  		}
    88  		for _, expected := range expectedErrors {
    89  			if !strings.Contains(s, expected) {
    90  				t.Errorf("Expected %s to contain '%s'", s, expected)
    91  			}
    92  		}
    93  	})
    94  
    95  	t.Run("AccessConfigTemplateOnly", func(t *testing.T) {
    96  		raw := testConfig(cfgFile)
    97  		delete(raw, "access_cfg_file")
    98  		raw["user_ocid"] = "ocid1..."
    99  		raw["tenancy_ocid"] = "ocid1..."
   100  		raw["fingerprint"] = "00:00..."
   101  		raw["key_file"] = keyFile.Name()
   102  
   103  		_, errs := NewConfig(raw)
   104  
   105  		if errs != nil {
   106  			t.Fatalf("err: %+v", errs)
   107  		}
   108  
   109  	})
   110  
   111  	t.Run("TenancyReadFromAccessCfgFile", func(t *testing.T) {
   112  		raw := testConfig(cfgFile)
   113  		c, errs := NewConfig(raw)
   114  		if errs != nil {
   115  			t.Fatalf("err: %+v", errs)
   116  		}
   117  
   118  		expected := "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
   119  		if c.AccessCfg.Tenancy != expected {
   120  			t.Errorf("Expected tenancy: %s, got %s.", expected, c.AccessCfg.Tenancy)
   121  		}
   122  
   123  	})
   124  
   125  	// Test the correct errors are produced when required template keys are
   126  	// omitted.
   127  	requiredKeys := []string{"availability_domain", "base_image_ocid", "shape", "subnet_ocid"}
   128  	for _, k := range requiredKeys {
   129  		t.Run(k+"_required", func(t *testing.T) {
   130  			raw := testConfig(cfgFile)
   131  			delete(raw, k)
   132  
   133  			_, errs := NewConfig(raw)
   134  
   135  			if !strings.Contains(errs.Error(), k) {
   136  				t.Errorf("Expected '%s' to contain '%s'", errs.Error(), k)
   137  			}
   138  		})
   139  	}
   140  
   141  	t.Run("ImageNameDefaultedIfEmpty", func(t *testing.T) {
   142  		raw := testConfig(cfgFile)
   143  		delete(raw, "image_name")
   144  
   145  		c, errs := NewConfig(raw)
   146  		if errs != nil {
   147  			t.Errorf("Unexpected error(s): %s", errs)
   148  		}
   149  
   150  		if !strings.Contains(c.ImageName, "packer-") {
   151  			t.Errorf("got default ImageName %q, want image name 'packer-{{timestamp}}'", c.ImageName)
   152  		}
   153  	})
   154  
   155  	// Test that AccessCfgFile properties are overridden by their
   156  	// corosponding template keys.
   157  	accessOverrides := map[string]string{
   158  		"user_ocid":    "User",
   159  		"tenancy_ocid": "Tenancy",
   160  		"region":       "Region",
   161  		"fingerprint":  "Fingerprint",
   162  	}
   163  	for k, v := range accessOverrides {
   164  		t.Run("AccessCfg."+v+"Overridden", func(t *testing.T) {
   165  			expected := "override"
   166  
   167  			raw := testConfig(cfgFile)
   168  			raw[k] = expected
   169  
   170  			c, errs := NewConfig(raw)
   171  			if errs != nil {
   172  				t.Fatalf("err: %+v", errs)
   173  			}
   174  
   175  			accessVal := getField(c.AccessCfg, v)
   176  			if accessVal != expected {
   177  				t.Errorf("Expected AccessCfg.%s: %s, got %s", v, expected, accessVal)
   178  			}
   179  		})
   180  	}
   181  }