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 }