github.com/angdraug/packer@v1.3.2/provisioner/chef-solo/provisioner_test.go (about) 1 package chefsolo 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 8 "github.com/hashicorp/packer/packer" 9 ) 10 11 func testConfig() map[string]interface{} { 12 return map[string]interface{}{} 13 } 14 15 func TestProvisioner_Impl(t *testing.T) { 16 var raw interface{} 17 raw = &Provisioner{} 18 if _, ok := raw.(packer.Provisioner); !ok { 19 t.Fatalf("must be a Provisioner") 20 } 21 } 22 23 func TestProvisionerPrepare_chefEnvironment(t *testing.T) { 24 var p Provisioner 25 26 config := testConfig() 27 config["chef_environment"] = "some-env" 28 29 err := p.Prepare(config) 30 if err != nil { 31 t.Fatalf("err: %s", err) 32 } 33 34 if p.config.ChefEnvironment != "some-env" { 35 t.Fatalf("unexpected: %#v", p.config.ChefEnvironment) 36 } 37 } 38 39 func TestProvisionerPrepare_configTemplate(t *testing.T) { 40 var err error 41 var p Provisioner 42 43 // Test no config template 44 config := testConfig() 45 delete(config, "config_template") 46 err = p.Prepare(config) 47 if err != nil { 48 t.Fatalf("err: %s", err) 49 } 50 51 // Test with a file 52 tf, err := ioutil.TempFile("", "packer") 53 if err != nil { 54 t.Fatalf("err: %s", err) 55 } 56 defer os.Remove(tf.Name()) 57 58 config = testConfig() 59 config["config_template"] = tf.Name() 60 p = Provisioner{} 61 err = p.Prepare(config) 62 if err != nil { 63 t.Fatalf("err: %s", err) 64 } 65 66 // Test with a directory 67 td, err := ioutil.TempDir("", "packer") 68 if err != nil { 69 t.Fatalf("err: %s", err) 70 } 71 defer os.RemoveAll(td) 72 73 config = testConfig() 74 config["config_template"] = td 75 p = Provisioner{} 76 err = p.Prepare(config) 77 if err == nil { 78 t.Fatal("should have err") 79 } 80 } 81 82 func TestProvisionerPrepare_cookbookPaths(t *testing.T) { 83 var p Provisioner 84 85 path1, err := ioutil.TempDir("", "cookbooks_one") 86 if err != nil { 87 t.Fatalf("err: %s", err) 88 } 89 90 path2, err := ioutil.TempDir("", "cookbooks_two") 91 if err != nil { 92 t.Fatalf("err: %s", err) 93 } 94 95 rolesPath, err := ioutil.TempDir("", "roles") 96 if err != nil { 97 t.Fatalf("err: %s", err) 98 } 99 100 dataBagsPath, err := ioutil.TempDir("", "data_bags") 101 if err != nil { 102 t.Fatalf("err: %s", err) 103 } 104 105 defer os.Remove(path1) 106 defer os.Remove(path2) 107 defer os.Remove(rolesPath) 108 defer os.Remove(dataBagsPath) 109 110 config := testConfig() 111 config["cookbook_paths"] = []string{path1, path2} 112 config["roles_path"] = rolesPath 113 config["data_bags_path"] = dataBagsPath 114 115 err = p.Prepare(config) 116 if err != nil { 117 t.Fatalf("err: %s", err) 118 } 119 120 if len(p.config.CookbookPaths) != 2 { 121 t.Fatalf("unexpected: %#v", p.config.CookbookPaths) 122 } 123 124 if p.config.CookbookPaths[0] != path1 || p.config.CookbookPaths[1] != path2 { 125 t.Fatalf("unexpected: %#v", p.config.CookbookPaths) 126 } 127 128 if p.config.RolesPath != rolesPath { 129 t.Fatalf("unexpected: %#v", p.config.RolesPath) 130 } 131 132 if p.config.DataBagsPath != dataBagsPath { 133 t.Fatalf("unexpected: %#v", p.config.DataBagsPath) 134 } 135 } 136 137 func TestProvisionerPrepare_dataBagsPath(t *testing.T) { 138 var p Provisioner 139 140 dataBagsPath, err := ioutil.TempDir("", "data_bags") 141 if err != nil { 142 t.Fatalf("err: %s", err) 143 } 144 defer os.Remove(dataBagsPath) 145 146 config := testConfig() 147 config["data_bags_path"] = dataBagsPath 148 149 err = p.Prepare(config) 150 if err != nil { 151 t.Fatalf("err: %s", err) 152 } 153 154 if p.config.DataBagsPath != dataBagsPath { 155 t.Fatalf("unexpected: %#v", p.config.DataBagsPath) 156 } 157 } 158 159 func TestProvisionerPrepare_encryptedDataBagSecretPath(t *testing.T) { 160 var err error 161 var p Provisioner 162 163 // Test no config template 164 config := testConfig() 165 delete(config, "encrypted_data_bag_secret_path") 166 err = p.Prepare(config) 167 if err != nil { 168 t.Fatalf("err: %s", err) 169 } 170 171 // Test with a file 172 tf, err := ioutil.TempFile("", "packer") 173 if err != nil { 174 t.Fatalf("err: %s", err) 175 } 176 defer os.Remove(tf.Name()) 177 178 config = testConfig() 179 config["encrypted_data_bag_secret_path"] = tf.Name() 180 p = Provisioner{} 181 err = p.Prepare(config) 182 if err != nil { 183 t.Fatalf("err: %s", err) 184 } 185 186 // Test with a directory 187 td, err := ioutil.TempDir("", "packer") 188 if err != nil { 189 t.Fatalf("err: %s", err) 190 } 191 defer os.RemoveAll(td) 192 193 config = testConfig() 194 config["encrypted_data_bag_secret_path"] = td 195 p = Provisioner{} 196 err = p.Prepare(config) 197 if err == nil { 198 t.Fatal("should have err") 199 } 200 } 201 202 func TestProvisionerPrepare_environmentsPath(t *testing.T) { 203 var p Provisioner 204 205 environmentsPath, err := ioutil.TempDir("", "environments") 206 if err != nil { 207 t.Fatalf("err: %s", err) 208 } 209 defer os.Remove(environmentsPath) 210 211 config := testConfig() 212 config["environments_path"] = environmentsPath 213 214 err = p.Prepare(config) 215 if err != nil { 216 t.Fatalf("err: %s", err) 217 } 218 219 if p.config.EnvironmentsPath != environmentsPath { 220 t.Fatalf("unexpected: %#v", p.config.EnvironmentsPath) 221 } 222 } 223 224 func TestProvisionerPrepare_rolesPath(t *testing.T) { 225 var p Provisioner 226 227 rolesPath, err := ioutil.TempDir("", "roles") 228 if err != nil { 229 t.Fatalf("err: %s", err) 230 } 231 defer os.Remove(rolesPath) 232 233 config := testConfig() 234 config["roles_path"] = rolesPath 235 236 err = p.Prepare(config) 237 if err != nil { 238 t.Fatalf("err: %s", err) 239 } 240 241 if p.config.RolesPath != rolesPath { 242 t.Fatalf("unexpected: %#v", p.config.RolesPath) 243 } 244 } 245 246 func TestProvisionerPrepare_json(t *testing.T) { 247 config := testConfig() 248 config["json"] = map[string]interface{}{ 249 "foo": "{{ user `foo` }}", 250 } 251 252 config[packer.UserVariablesConfigKey] = map[string]string{ 253 "foo": `"bar\baz"`, 254 } 255 256 var p Provisioner 257 err := p.Prepare(config) 258 if err != nil { 259 t.Fatalf("err: %s", err) 260 } 261 262 if p.config.Json["foo"] != `"bar\baz"` { 263 t.Fatalf("bad: %#v", p.config.Json) 264 } 265 } 266 267 func TestProvisionerPrepare_jsonNested(t *testing.T) { 268 config := testConfig() 269 config["json"] = map[string]interface{}{ 270 "foo": map[interface{}]interface{}{ 271 "bar": []uint8("baz"), 272 }, 273 274 "bar": []interface{}{ 275 "foo", 276 277 map[interface{}]interface{}{ 278 "bar": "baz", 279 }, 280 }, 281 282 "bFalse": false, 283 "bTrue": true, 284 "bNil": nil, 285 "bStr": []uint8("bar"), 286 287 "bInt": 1, 288 "bFloat": 4.5, 289 } 290 291 var p Provisioner 292 err := p.Prepare(config) 293 if err != nil { 294 t.Fatalf("err: %s", err) 295 } 296 297 fooMap := p.config.Json["foo"].(map[string]interface{}) 298 if fooMap["bar"] != "baz" { 299 t.Fatalf("nope: %#v", fooMap["bar"]) 300 } 301 if p.config.Json["bStr"] != "bar" { 302 t.Fatalf("nope: %#v", fooMap["bar"]) 303 } 304 }