diff --git a/packer/config_template.go b/packer/config_template.go index a1c7b1e4e..b93226d93 100644 --- a/packer/config_template.go +++ b/packer/config_template.go @@ -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) { diff --git a/packer/config_template_test.go b/packer/config_template_test.go index 7501f2249..69b991edd 100644 --- a/packer/config_template_test.go +++ b/packer/config_template_test.go @@ -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 { diff --git a/website/source/docs/templates/configuration-templates.html.markdown b/website/source/docs/templates/configuration-templates.html.markdown index 83add9a71..c88644ded 100644 --- a/website/source/docs/templates/configuration-templates.html.markdown +++ b/website/source/docs/templates/configuration-templates.html.markdown @@ -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: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Day of WeekMonthDateHourMinuteSecondYearTimezone
Numeric-010203 (15)040506-0700
TextualMonday (Mon)January (Jan)-----MST
+ + _The values in parentheses are the abbreviated, or 24-hour clock values_ + + Here are some example formated time, using the above format options: + +
+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
+
+ ## Amazon Specific Functions Specific to Amazon builders: