github.com/angdraug/packer@v1.3.2/builder/digitalocean/builder_test.go (about) 1 package digitalocean 2 3 import ( 4 "strconv" 5 "testing" 6 "time" 7 8 "github.com/hashicorp/packer/packer" 9 ) 10 11 func testConfig() map[string]interface{} { 12 return map[string]interface{}{ 13 "api_token": "bar", 14 "region": "nyc2", 15 "size": "512mb", 16 "ssh_username": "root", 17 "image": "foo", 18 } 19 } 20 21 func TestBuilder_ImplementsBuilder(t *testing.T) { 22 var raw interface{} 23 raw = &Builder{} 24 if _, ok := raw.(packer.Builder); !ok { 25 t.Fatalf("Builder should be a builder") 26 } 27 } 28 29 func TestBuilder_Prepare_BadType(t *testing.T) { 30 b := &Builder{} 31 c := map[string]interface{}{ 32 "api_key": []string{}, 33 } 34 35 warnings, err := b.Prepare(c) 36 if len(warnings) > 0 { 37 t.Fatalf("bad: %#v", warnings) 38 } 39 if err == nil { 40 t.Fatalf("prepare should fail") 41 } 42 } 43 44 func TestBuilderPrepare_InvalidKey(t *testing.T) { 45 var b Builder 46 config := testConfig() 47 48 // Add a random key 49 config["i_should_not_be_valid"] = true 50 warnings, err := b.Prepare(config) 51 if len(warnings) > 0 { 52 t.Fatalf("bad: %#v", warnings) 53 } 54 if err == nil { 55 t.Fatal("should have error") 56 } 57 } 58 59 func TestBuilderPrepare_Region(t *testing.T) { 60 var b Builder 61 config := testConfig() 62 63 // Test default 64 delete(config, "region") 65 warnings, err := b.Prepare(config) 66 if len(warnings) > 0 { 67 t.Fatalf("bad: %#v", warnings) 68 } 69 if err == nil { 70 t.Fatalf("should error") 71 } 72 73 expected := "sfo1" 74 75 // Test set 76 config["region"] = expected 77 b = Builder{} 78 warnings, err = b.Prepare(config) 79 if len(warnings) > 0 { 80 t.Fatalf("bad: %#v", warnings) 81 } 82 if err != nil { 83 t.Fatalf("should not have error: %s", err) 84 } 85 86 if b.config.Region != expected { 87 t.Errorf("found %s, expected %s", b.config.Region, expected) 88 } 89 } 90 91 func TestBuilderPrepare_Size(t *testing.T) { 92 var b Builder 93 config := testConfig() 94 95 // Test default 96 delete(config, "size") 97 warnings, err := b.Prepare(config) 98 if len(warnings) > 0 { 99 t.Fatalf("bad: %#v", warnings) 100 } 101 if err == nil { 102 t.Fatalf("should error") 103 } 104 105 expected := "1024mb" 106 107 // Test set 108 config["size"] = expected 109 b = Builder{} 110 warnings, err = b.Prepare(config) 111 if len(warnings) > 0 { 112 t.Fatalf("bad: %#v", warnings) 113 } 114 if err != nil { 115 t.Fatalf("should not have error: %s", err) 116 } 117 118 if b.config.Size != expected { 119 t.Errorf("found %s, expected %s", b.config.Size, expected) 120 } 121 } 122 123 func TestBuilderPrepare_Image(t *testing.T) { 124 var b Builder 125 config := testConfig() 126 127 // Test default 128 delete(config, "image") 129 warnings, err := b.Prepare(config) 130 if len(warnings) > 0 { 131 t.Fatalf("bad: %#v", warnings) 132 } 133 if err == nil { 134 t.Fatal("should error") 135 } 136 137 expected := "ubuntu-14-04-x64" 138 139 // Test set 140 config["image"] = expected 141 b = Builder{} 142 warnings, err = b.Prepare(config) 143 if len(warnings) > 0 { 144 t.Fatalf("bad: %#v", warnings) 145 } 146 if err != nil { 147 t.Fatalf("should not have error: %s", err) 148 } 149 150 if b.config.Image != expected { 151 t.Errorf("found %s, expected %s", b.config.Image, expected) 152 } 153 } 154 155 func TestBuilderPrepare_StateTimeout(t *testing.T) { 156 var b Builder 157 config := testConfig() 158 159 // Test default 160 warnings, err := b.Prepare(config) 161 if len(warnings) > 0 { 162 t.Fatalf("bad: %#v", warnings) 163 } 164 if err != nil { 165 t.Fatalf("should not have error: %s", err) 166 } 167 168 if b.config.StateTimeout != 6*time.Minute { 169 t.Errorf("invalid: %s", b.config.StateTimeout) 170 } 171 172 // Test set 173 config["state_timeout"] = "5m" 174 b = Builder{} 175 warnings, err = b.Prepare(config) 176 if len(warnings) > 0 { 177 t.Fatalf("bad: %#v", warnings) 178 } 179 if err != nil { 180 t.Fatalf("should not have error: %s", err) 181 } 182 183 // Test bad 184 config["state_timeout"] = "tubes" 185 b = Builder{} 186 warnings, err = b.Prepare(config) 187 if len(warnings) > 0 { 188 t.Fatalf("bad: %#v", warnings) 189 } 190 if err == nil { 191 t.Fatal("should have error") 192 } 193 194 } 195 196 func TestBuilderPrepare_PrivateNetworking(t *testing.T) { 197 var b Builder 198 config := testConfig() 199 200 // Test default 201 warnings, err := b.Prepare(config) 202 if len(warnings) > 0 { 203 t.Fatalf("bad: %#v", warnings) 204 } 205 if err != nil { 206 t.Fatalf("should not have error: %s", err) 207 } 208 209 if b.config.PrivateNetworking != false { 210 t.Errorf("invalid: %t", b.config.PrivateNetworking) 211 } 212 213 // Test set 214 config["private_networking"] = true 215 b = Builder{} 216 warnings, err = b.Prepare(config) 217 if len(warnings) > 0 { 218 t.Fatalf("bad: %#v", warnings) 219 } 220 if err != nil { 221 t.Fatalf("should not have error: %s", err) 222 } 223 224 if b.config.PrivateNetworking != true { 225 t.Errorf("invalid: %t", b.config.PrivateNetworking) 226 } 227 } 228 229 func TestBuilderPrepare_SnapshotName(t *testing.T) { 230 var b Builder 231 config := testConfig() 232 233 // Test default 234 warnings, err := b.Prepare(config) 235 if len(warnings) > 0 { 236 t.Fatalf("bad: %#v", warnings) 237 } 238 if err != nil { 239 t.Fatalf("should not have error: %s", err) 240 } 241 242 if b.config.SnapshotName == "" { 243 t.Errorf("invalid: %s", b.config.SnapshotName) 244 } 245 246 // Test set 247 config["snapshot_name"] = "foobarbaz" 248 b = Builder{} 249 warnings, err = b.Prepare(config) 250 if len(warnings) > 0 { 251 t.Fatalf("bad: %#v", warnings) 252 } 253 if err != nil { 254 t.Fatalf("should not have error: %s", err) 255 } 256 257 // Test set with template 258 config["snapshot_name"] = "{{timestamp}}" 259 b = Builder{} 260 warnings, err = b.Prepare(config) 261 if len(warnings) > 0 { 262 t.Fatalf("bad: %#v", warnings) 263 } 264 if err != nil { 265 t.Fatalf("should not have error: %s", err) 266 } 267 268 _, err = strconv.ParseInt(b.config.SnapshotName, 0, 0) 269 if err != nil { 270 t.Fatalf("failed to parse int in template: %s", err) 271 } 272 273 } 274 275 func TestBuilderPrepare_DropletName(t *testing.T) { 276 var b Builder 277 config := testConfig() 278 279 // Test default 280 warnings, err := b.Prepare(config) 281 if len(warnings) > 0 { 282 t.Fatalf("bad: %#v", warnings) 283 } 284 if err != nil { 285 t.Fatalf("should not have error: %s", err) 286 } 287 288 if b.config.DropletName == "" { 289 t.Errorf("invalid: %s", b.config.DropletName) 290 } 291 292 // Test normal set 293 config["droplet_name"] = "foobar" 294 b = Builder{} 295 warnings, err = b.Prepare(config) 296 if len(warnings) > 0 { 297 t.Fatalf("bad: %#v", warnings) 298 } 299 if err != nil { 300 t.Fatalf("should not have error: %s", err) 301 } 302 303 // Test with template 304 config["droplet_name"] = "foobar-{{timestamp}}" 305 b = Builder{} 306 warnings, err = b.Prepare(config) 307 if len(warnings) > 0 { 308 t.Fatalf("bad: %#v", warnings) 309 } 310 if err != nil { 311 t.Fatalf("should not have error: %s", err) 312 } 313 314 // Test with bad template 315 config["droplet_name"] = "foobar-{{" 316 b = Builder{} 317 warnings, err = b.Prepare(config) 318 if len(warnings) > 0 { 319 t.Fatalf("bad: %#v", warnings) 320 } 321 if err == nil { 322 t.Fatal("should have error") 323 } 324 325 }