github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/provisioner/salt-masterless/provisioner_test.go (about) 1 package saltmasterless 2 3 import ( 4 "github.com/mitchellh/packer/packer" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 ) 10 11 func testConfig() map[string]interface{} { 12 return map[string]interface{}{ 13 "local_state_tree": os.TempDir(), 14 } 15 } 16 17 func TestProvisioner_Impl(t *testing.T) { 18 var raw interface{} 19 raw = &Provisioner{} 20 if _, ok := raw.(packer.Provisioner); !ok { 21 t.Fatalf("must be a Provisioner") 22 } 23 } 24 25 func TestProvisionerPrepare_Defaults(t *testing.T) { 26 var p Provisioner 27 config := testConfig() 28 29 err := p.Prepare(config) 30 if err != nil { 31 t.Fatalf("err: %s", err) 32 } 33 34 if p.config.TempConfigDir != DefaultTempConfigDir { 35 t.Errorf("unexpected temp config dir: %s", p.config.TempConfigDir) 36 } 37 } 38 39 func TestProvisionerPrepare_InvalidKey(t *testing.T) { 40 var p Provisioner 41 config := testConfig() 42 43 // Add a random key 44 config["i_should_not_be_valid"] = true 45 err := p.Prepare(config) 46 if err == nil { 47 t.Fatal("should have error") 48 } 49 } 50 51 func TestProvisionerPrepare_CustomeState(t *testing.T) { 52 var p Provisioner 53 config := testConfig() 54 55 err := p.Prepare(config) 56 if err != nil { 57 t.Fatalf("err: %s", err) 58 } 59 60 if !strings.Contains(p.config.CmdArgs, "state.") { 61 t.Fatal("a state should be specified in CmdArgs") 62 } 63 64 config["custom_state"] = "birb" 65 err = p.Prepare(config) 66 if err != nil { 67 t.Fatalf("err: %s", err) 68 } 69 70 if !strings.Contains(p.config.CmdArgs, "state.sls birb") { 71 t.Fatal("birb state should be specified in CmdArgs") 72 } 73 } 74 75 func TestProvisionerPrepare_MinionConfig(t *testing.T) { 76 var p Provisioner 77 config := testConfig() 78 79 config["minion_config"] = "/i/dont/exist/i/think" 80 err := p.Prepare(config) 81 if err == nil { 82 t.Fatal("should have error") 83 } 84 85 tf, err := ioutil.TempFile("", "minion") 86 if err != nil { 87 t.Fatalf("error tempfile: %s", err) 88 } 89 defer os.Remove(tf.Name()) 90 91 config["minion_config"] = tf.Name() 92 err = p.Prepare(config) 93 if err != nil { 94 t.Fatalf("err: %s", err) 95 } 96 } 97 98 func TestProvisionerPrepare_MinionConfig_RemoteStateTree(t *testing.T) { 99 var p Provisioner 100 config := testConfig() 101 102 config["minion_config"] = "/i/dont/exist/i/think" 103 config["remote_state_tree"] = "/i/dont/exist/remote_state_tree" 104 err := p.Prepare(config) 105 if err == nil { 106 t.Fatal("minion_config and remote_state_tree should cause error") 107 } 108 } 109 110 func TestProvisionerPrepare_MinionConfig_RemotePillarRoots(t *testing.T) { 111 var p Provisioner 112 config := testConfig() 113 114 config["minion_config"] = "/i/dont/exist/i/think" 115 config["remote_pillar_roots"] = "/i/dont/exist/remote_pillar_roots" 116 err := p.Prepare(config) 117 if err == nil { 118 t.Fatal("minion_config and remote_pillar_roots should cause error") 119 } 120 } 121 122 func TestProvisionerPrepare_LocalStateTree(t *testing.T) { 123 var p Provisioner 124 config := testConfig() 125 126 config["local_state_tree"] = "/i/dont/exist/i/think" 127 err := p.Prepare(config) 128 if err == nil { 129 t.Fatal("should have error") 130 } 131 132 config["local_state_tree"] = os.TempDir() 133 err = p.Prepare(config) 134 if err != nil { 135 t.Fatalf("err: %s", err) 136 } 137 } 138 139 func TestProvisionerPrepare_LocalPillarRoots(t *testing.T) { 140 var p Provisioner 141 config := testConfig() 142 143 config["local_pillar_roots"] = "/i/dont/exist/i/think" 144 err := p.Prepare(config) 145 if err == nil { 146 t.Fatal("should have error") 147 } 148 149 config["local_pillar_roots"] = os.TempDir() 150 err = p.Prepare(config) 151 if err != nil { 152 t.Fatalf("err: %s", err) 153 } 154 } 155 156 func TestProvisionerSudo(t *testing.T) { 157 var p Provisioner 158 config := testConfig() 159 160 err := p.Prepare(config) 161 if err != nil { 162 t.Fatalf("err: %s", err) 163 } 164 165 withSudo := p.sudo("echo hello") 166 if withSudo != "sudo echo hello" { 167 t.Fatalf("sudo command not generated correctly") 168 } 169 170 config["disable_sudo"] = true 171 err = p.Prepare(config) 172 if err != nil { 173 t.Fatalf("err: %s", err) 174 } 175 withoutSudo := p.sudo("echo hello") 176 if withoutSudo != "echo hello" { 177 t.Fatalf("sudo-less command not generated correctly") 178 } 179 } 180 181 func TestProvisionerPrepare_RemoteStateTree(t *testing.T) { 182 var p Provisioner 183 config := testConfig() 184 185 config["remote_state_tree"] = "/remote_state_tree" 186 err := p.Prepare(config) 187 if err != nil { 188 t.Fatalf("err: %s", err) 189 } 190 191 if !strings.Contains(p.config.CmdArgs, "--file-root=/remote_state_tree") { 192 t.Fatal("--file-root should be set in CmdArgs") 193 } 194 } 195 196 func TestProvisionerPrepare_RemotePillarRoots(t *testing.T) { 197 var p Provisioner 198 config := testConfig() 199 200 config["remote_pillar_roots"] = "/remote_pillar_roots" 201 err := p.Prepare(config) 202 if err != nil { 203 t.Fatalf("err: %s", err) 204 } 205 206 if !strings.Contains(p.config.CmdArgs, "--pillar-root=/remote_pillar_roots") { 207 t.Fatal("--pillar-root should be set in CmdArgs") 208 } 209 } 210 211 func TestProvisionerPrepare_RemoteStateTree_Default(t *testing.T) { 212 var p Provisioner 213 config := testConfig() 214 215 // no minion_config, no remote_state_tree 216 err := p.Prepare(config) 217 if err != nil { 218 t.Fatalf("err: %s", err) 219 } 220 221 if !strings.Contains(p.config.CmdArgs, "--file-root=/srv/salt") { 222 t.Fatal("--file-root should be set in CmdArgs") 223 } 224 } 225 226 func TestProvisionerPrepare_RemotePillarRoots_Default(t *testing.T) { 227 var p Provisioner 228 config := testConfig() 229 230 // no minion_config, no remote_pillar_roots 231 err := p.Prepare(config) 232 if err != nil { 233 t.Fatalf("err: %s", err) 234 } 235 236 if !strings.Contains(p.config.CmdArgs, "--pillar-root=/srv/pillar") { 237 t.Fatal("--pillar-root should be set in CmdArgs") 238 } 239 } 240 241 func TestProvisionerPrepare_NoExitOnFailure(t *testing.T) { 242 var p Provisioner 243 config := testConfig() 244 245 err := p.Prepare(config) 246 if err != nil { 247 t.Fatalf("err: %s", err) 248 } 249 250 if !strings.Contains(p.config.CmdArgs, "--retcode-passthrough") { 251 t.Fatal("--retcode-passthrough should be set in CmdArgs") 252 } 253 254 config["no_exit_on_failure"] = true 255 err = p.Prepare(config) 256 if err != nil { 257 t.Fatalf("err: %s", err) 258 } 259 260 if strings.Contains(p.config.CmdArgs, "--retcode-passthrough") { 261 t.Fatal("--retcode-passthrough should not be set in CmdArgs") 262 } 263 } 264 265 func TestProvisionerPrepare_LogLevel(t *testing.T) { 266 var p Provisioner 267 config := testConfig() 268 269 err := p.Prepare(config) 270 if err != nil { 271 t.Fatalf("err: %s", err) 272 } 273 274 if !strings.Contains(p.config.CmdArgs, "-l info") { 275 t.Fatal("-l info should be set in CmdArgs") 276 } 277 278 config["log_level"] = "debug" 279 err = p.Prepare(config) 280 if err != nil { 281 t.Fatalf("err: %s", err) 282 } 283 284 if !strings.Contains(p.config.CmdArgs, "-l debug") { 285 t.Fatal("-l debug should be set in CmdArgs") 286 } 287 }