github.com/ddnomad/packer@v1.3.2/provisioner/chef-client/provisioner_test.go (about) 1 package chefclient 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 func testConfig() map[string]interface{} { 14 return map[string]interface{}{ 15 "server_url": "foo", 16 } 17 } 18 19 func TestProvisioner_Impl(t *testing.T) { 20 var raw interface{} 21 raw = &Provisioner{} 22 if _, ok := raw.(packer.Provisioner); !ok { 23 t.Fatalf("must be a Provisioner") 24 } 25 } 26 27 func TestProvisionerPrepare_chefEnvironment(t *testing.T) { 28 var p Provisioner 29 30 config := testConfig() 31 config["chef_environment"] = "some-env" 32 33 err := p.Prepare(config) 34 if err != nil { 35 t.Fatalf("err: %s", err) 36 } 37 38 if p.config.ChefEnvironment != "some-env" { 39 t.Fatalf("unexpected: %#v", p.config.ChefEnvironment) 40 } 41 } 42 43 func TestProvisionerPrepare_configTemplate(t *testing.T) { 44 var err error 45 var p Provisioner 46 47 // Test no config template 48 config := testConfig() 49 delete(config, "config_template") 50 err = p.Prepare(config) 51 if err != nil { 52 t.Fatalf("err: %s", err) 53 } 54 55 // Test with a file 56 tf, err := ioutil.TempFile("", "packer") 57 if err != nil { 58 t.Fatalf("err: %s", err) 59 } 60 defer os.Remove(tf.Name()) 61 62 config = testConfig() 63 config["config_template"] = tf.Name() 64 p = Provisioner{} 65 err = p.Prepare(config) 66 if err != nil { 67 t.Fatalf("err: %s", err) 68 } 69 70 // Test with a directory 71 td, err := ioutil.TempDir("", "packer") 72 if err != nil { 73 t.Fatalf("err: %s", err) 74 } 75 defer os.RemoveAll(td) 76 77 config = testConfig() 78 config["config_template"] = td 79 p = Provisioner{} 80 err = p.Prepare(config) 81 if err == nil { 82 t.Fatal("should have err") 83 } 84 } 85 86 func TestProvisionerPrepare_commands(t *testing.T) { 87 commands := []string{ 88 "execute_command", 89 "install_command", 90 "knife_command", 91 } 92 93 for _, command := range commands { 94 var p Provisioner 95 96 // Test not set 97 config := testConfig() 98 delete(config, command) 99 err := p.Prepare(config) 100 if err != nil { 101 t.Fatalf("err: %s", err) 102 } 103 104 // Test invalid template 105 config = testConfig() 106 config[command] = "{{if NOPE}}" 107 err = p.Prepare(config) 108 if err == nil { 109 t.Fatal("should error") 110 } 111 112 // Test good template 113 config = testConfig() 114 config[command] = "{{.Foo}}" 115 err = p.Prepare(config) 116 if err != nil { 117 t.Fatalf("err: %s", err) 118 } 119 } 120 } 121 122 func TestProvisionerPrepare_serverUrl(t *testing.T) { 123 var p Provisioner 124 125 // Test not set 126 config := testConfig() 127 delete(config, "server_url") 128 err := p.Prepare(config) 129 if err == nil { 130 t.Fatal("should error") 131 } 132 133 // Test set 134 config = testConfig() 135 config["server_url"] = "foo" 136 err = p.Prepare(config) 137 if err != nil { 138 t.Fatalf("err: %s", err) 139 } 140 } 141 142 func TestProvisionerPrepare_encryptedDataBagSecretPath(t *testing.T) { 143 var err error 144 var p Provisioner 145 146 // Test no config template 147 config := testConfig() 148 delete(config, "encrypted_data_bag_secret_path") 149 err = p.Prepare(config) 150 if err != nil { 151 t.Fatalf("err: %s", err) 152 } 153 154 // Test with a file 155 tf, err := ioutil.TempFile("", "packer") 156 if err != nil { 157 t.Fatalf("err: %s", err) 158 } 159 defer os.Remove(tf.Name()) 160 161 config = testConfig() 162 config["encrypted_data_bag_secret_path"] = tf.Name() 163 p = Provisioner{} 164 err = p.Prepare(config) 165 if err != nil { 166 t.Fatalf("err: %s", err) 167 } 168 169 // Test with a directory 170 td, err := ioutil.TempDir("", "packer") 171 if err != nil { 172 t.Fatalf("err: %s", err) 173 } 174 defer os.RemoveAll(td) 175 176 config = testConfig() 177 config["encrypted_data_bag_secret_path"] = td 178 p = Provisioner{} 179 err = p.Prepare(config) 180 if err == nil { 181 t.Fatal("should have err") 182 } 183 } 184 185 func TestProvisioner_createDir(t *testing.T) { 186 for _, sudo := range []bool{true, false} { 187 config := testConfig() 188 config["prevent_sudo"] = !sudo 189 190 p := &Provisioner{} 191 comm := &packer.MockCommunicator{} 192 ui := &packer.BasicUi{ 193 Reader: new(bytes.Buffer), 194 Writer: new(bytes.Buffer), 195 } 196 197 err := p.Prepare(config) 198 if err != nil { 199 t.Fatalf("err: %s", err) 200 } 201 202 if err := p.createDir(ui, comm, "/tmp/foo"); err != nil { 203 t.Fatalf("err: %s", err) 204 } 205 206 if !sudo && strings.HasPrefix(comm.StartCmd.Command, "sudo") { 207 t.Fatalf("createDir should not use sudo, got: \"%s\"", comm.StartCmd.Command) 208 } 209 210 if sudo && !strings.HasPrefix(comm.StartCmd.Command, "sudo") { 211 t.Fatalf("createDir should use sudo, got: \"%s\"", comm.StartCmd.Command) 212 } 213 } 214 } 215 216 func TestProvisioner_removeDir(t *testing.T) { 217 for _, sudo := range []bool{true, false} { 218 config := testConfig() 219 config["prevent_sudo"] = !sudo 220 221 p := &Provisioner{} 222 comm := &packer.MockCommunicator{} 223 ui := &packer.BasicUi{ 224 Reader: new(bytes.Buffer), 225 Writer: new(bytes.Buffer), 226 } 227 228 err := p.Prepare(config) 229 if err != nil { 230 t.Fatalf("err: %s", err) 231 } 232 233 if err := p.removeDir(ui, comm, "/tmp/foo"); err != nil { 234 t.Fatalf("err: %s", err) 235 } 236 237 if !sudo && strings.HasPrefix(comm.StartCmd.Command, "sudo") { 238 t.Fatalf("removeDir should not use sudo, got: \"%s\"", comm.StartCmd.Command) 239 } 240 241 if sudo && !strings.HasPrefix(comm.StartCmd.Command, "sudo") { 242 t.Fatalf("removeDir should use sudo, got: \"%s\"", comm.StartCmd.Command) 243 } 244 } 245 } 246 247 func TestProvisionerPrepare_policy(t *testing.T) { 248 var p Provisioner 249 250 var policyTests = []struct { 251 name string 252 group string 253 success bool 254 }{ 255 {"", "", true}, 256 {"a", "b", true}, 257 {"a", "", false}, 258 {"", "a", false}, 259 } 260 for _, tt := range policyTests { 261 config := testConfig() 262 config["policy_name"] = tt.name 263 config["policy_group"] = tt.group 264 err := p.Prepare(config) 265 if (err == nil) != tt.success { 266 t.Fatalf("wasn't expecting %+v to fail: %s", tt, err.Error()) 267 } 268 } 269 }