Merge branch 'template-timefmt' of github.com:njones/packer into njones-template-timefmt

Conflicts:
	packer/config_template.go
	website/source/docs/templates/configuration-templates.html.markdown
This commit is contained in:
Mitchell Hashimoto 2014-09-05 16:21:30 -07:00
commit 9a0f92c5ad
3 changed files with 94 additions and 3 deletions

View File

@ -113,8 +113,16 @@ func templateEnv(n string) string {
return os.Getenv(n)
}
func templateISOTime() string {
return InitTime.Format(time.RFC3339)
func templateISOTime(timeFormat ...string) (string, error) {
if len(timeFormat) == 0 {
return time.Now().UTC().Format(time.RFC3339), nil
}
if len(timeFormat) > 1 {
return "", fmt.Errorf("too many values, 1 needed: %v", timeFormat)
}
return time.Now().UTC().Format(timeFormat[0]), nil
}
func templatePwd() (string, error) {

View File

@ -1,6 +1,7 @@
package packer
import (
"fmt"
"math"
"os"
"strconv"
@ -42,6 +43,33 @@ func TestConfigTemplateProcess_isotime(t *testing.T) {
}
}
// Note must format with the magic Date: Mon Jan 2 15:04:05 -0700 MST 2006
func TestConfigTemplateProcess_isotime_withFormat(t *testing.T) {
tpl, err := NewConfigTemplate()
if err != nil {
t.Fatalf("err: %s", err)
}
// Checking for a too-many arguments error
// Because of the variadic function, compile time checking won't work
_, err = tpl.Process(`{{isotime "20060102" "huh"}}`, nil)
if err == nil {
t.Fatalf("err: cannot have more than 1 input")
}
result, err := tpl.Process(`{{isotime "20060102"}}`, nil)
if err != nil {
t.Fatalf("err: %s", err)
}
ti := time.Now().UTC()
val := fmt.Sprintf("%04d%02d%02d", ti.Year(), ti.Month(), ti.Day())
if result != val {
t.Fatalf("val: %s (formated: %s)", val, result)
}
}
func TestConfigTemplateProcess_pwd(t *testing.T) {
tpl, err := NewConfigTemplate()
if err != nil {

View File

@ -53,13 +53,68 @@ While some configuration settings have local variables specific to only that
configuration, a set of functions are available globally for use in _any string_
in Packer templates. These are listed below for reference.
* `isotime` - UTC time in RFC-3339 format.
* `lower` - Lowercases the string.
* `pwd` - The working directory while executing Packer.
* `isotime [FORMAT]` - UTC time, which can be [formatted](http://golang.org/pkg/time/#example_Time_Format).
See more examples below.
* `timestamp` - The current Unix timestamp in UTC.
* `uuid` - Returns a random UUID.
* `upper` - Uppercases the string.
### isotime Format
Formatting for the function `isotime` uses the magic reference date
**Mon Jan 2 15:04:05 -0700 MST 2006**, which breaks down to the following:
<table border="1" cellpadding="5" width="100%">
<tr bgcolor="lightgray">
<td></td>
<td align="center"><strong>Day of Week</strong></td>
<td align="center"><strong>Month</strong></td>
<td align="center"><strong>Date</strong></td>
<td align="center"><strong>Hour</strong></td>
<td align="center"><strong>Minute</strong></td>
<td align="center"><strong>Second</strong></td>
<td align="center"><strong>Year</strong></td>
<td align="center"><strong>Timezone</strong></td>
</tr>
<tr>
<td><strong>Numeric</strong></td>
<td align="center">-</td>
<td align="center">01</td>
<td align="center">02</td>
<td align="center">03 (15)</td>
<td align="center">04</td>
<td align="center">05</td>
<td align="center">06</td>
<td align="center">-0700</td>
</tr>
<tr>
<td><strong>Textual</strong></td>
<td align="center">Monday (Mon)</td>
<td align="center">January (Jan)</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">MST</td>
</tr>
</table>
_The values in parentheses are the abbreviated, or 24-hour clock values_
Here are some example formated time, using the above format options:
<pre>
isotime = June 7, 7:22:43pm 2014
{{isotime "2006-01-02"}} = 2014-06-07
{{isotime "Mon 1506"}} = Sat 1914
{{isotime "01-Jan-06 03\_04\_05"}} = 07-Jun-2014 07\_22\_43
{{isotime "Hour15Year200603"}} = Hour19Year201407
</pre>
## Amazon Specific Functions
Specific to Amazon builders: