diff --git a/go.mod b/go.mod index f6fb13583..327a88162 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( github.com/hetznercloud/hcloud-go v1.15.1 github.com/hyperonecom/h1-client-go v0.0.0-20190122232013-cf38e8387775 github.com/jdcloud-api/jdcloud-sdk-go v1.9.1-0.20190605102154-3d81a50ca961 + github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 github.com/joyent/triton-go v0.0.0-20180116165742-545edbe0d564 github.com/json-iterator/go v1.1.6 // indirect github.com/jtolds/gls v4.2.1+incompatible // indirect @@ -97,7 +98,6 @@ require ( github.com/mitchellh/go-fs v0.0.0-20180402234041-7b48fa161ea7 github.com/mitchellh/go-homedir v1.0.0 github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed - github.com/mitchellh/gox v1.0.1 // indirect github.com/mitchellh/iochan v1.0.0 github.com/mitchellh/mapstructure v0.0.0-20180111000720-b4575eea38cc github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 diff --git a/go.sum b/go.sum index 227d12cb6..6735fbbb6 100644 --- a/go.sum +++ b/go.sum @@ -57,8 +57,6 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= github.com/aws/aws-sdk-go v1.16.22/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.22.2 h1:uYP58k2Cd9y1qBy8CxTe5ADmdi4kANm8Ul8ch3kkIcQ= -github.com/aws/aws-sdk-go v1.22.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.24.1 h1:B2NRyTV1/+h+Dg8Bh7vnuvW6QZz/NBL+uzgC2uILDMI= github.com/aws/aws-sdk-go v1.24.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/azr/flock v0.0.0-20190823144736-958d66434653 h1:2H3Cu0cbG8iszfcgnANwC/cm0YkPJIQvaJ9/tSpwh9o= @@ -208,7 +206,6 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= @@ -238,6 +235,8 @@ github.com/hyperonecom/h1-client-go v0.0.0-20190122232013-cf38e8387775 h1:MIteIo github.com/hyperonecom/h1-client-go v0.0.0-20190122232013-cf38e8387775/go.mod h1:R9rU87RxxmcD3DkspW9JqGBXiJyg5MA+WNCtJrBtnXs= github.com/jdcloud-api/jdcloud-sdk-go v1.9.1-0.20190605102154-3d81a50ca961 h1:a2/K4HRhg31A5vafiz5yYiGMjaCxwRpyjJStfVquKds= github.com/jdcloud-api/jdcloud-sdk-go v1.9.1-0.20190605102154-3d81a50ca961/go.mod h1:UrKjuULIWLjHFlG6aSPunArE5QX57LftMmStAZJBEX8= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -304,8 +303,6 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed h1:FI2NIv6fpef6BQl2u3IZX/Cj20tfypRF4yd+uaHOMtI= github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/gox v1.0.1 h1:x0jD3dcHk9a9xPSDN6YEL4xL6Qz0dvNYm8yZqui5chI= -github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= diff --git a/template/interpolate/funcs.go b/template/interpolate/funcs.go index eaf2f8e39..609d35f4a 100644 --- a/template/interpolate/funcs.go +++ b/template/interpolate/funcs.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/packer/common/uuid" "github.com/hashicorp/packer/version" vaultapi "github.com/hashicorp/vault/api" + strftime "github.com/jehiah/go-strftime" ) // InitTime is the UTC time when this package was initialized. It is @@ -31,6 +32,7 @@ var FuncGens = map[string]interface{}{ "build_type": funcGenBuildType, "env": funcGenEnv, "isotime": funcGenIsotime, + "strftime": funcGenStrftime, "pwd": funcGenPwd, "split": funcGenSplitter, "template_dir": funcGenTemplateDir, @@ -133,6 +135,12 @@ func funcGenIsotime(ctx *Context) interface{} { } } +func funcGenStrftime(ctx *Context) interface{} { + return func(format string) string { + return strftime.Format(format, InitTime) + } +} + func funcGenPwd(ctx *Context) interface{} { return func() (string, error) { return os.Getwd() diff --git a/template/interpolate/funcs_test.go b/template/interpolate/funcs_test.go index 6be19af69..f02e5678e 100644 --- a/template/interpolate/funcs_test.go +++ b/template/interpolate/funcs_test.go @@ -141,6 +141,25 @@ func TestFuncIsotime(t *testing.T) { } } +func TestFuncStrftime(t *testing.T) { + ctx := &Context{} + i := &I{Value: "{{strftime \"%Y-%m-%dT%H:%M:%S%z\"}}"} + result, err := i.Render(ctx) + if err != nil { + t.Fatalf("err: %s", err) + } + + val, err := time.Parse("2006-01-02T15:04:05-0700", result) + if err != nil { + t.Fatalf("err: %s", err) + } + + currentTime := time.Now().UTC() + if currentTime.Sub(val) > 2*time.Second { + t.Fatalf("val: %v (current: %v)", val, currentTime) + } +} + func TestFuncPwd(t *testing.T) { wd, err := os.Getwd() if err != nil { diff --git a/vendor/github.com/jehiah/go-strftime/.gitignore b/vendor/github.com/jehiah/go-strftime/.gitignore new file mode 100644 index 000000000..00268614f --- /dev/null +++ b/vendor/github.com/jehiah/go-strftime/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/jehiah/go-strftime/LICENSE b/vendor/github.com/jehiah/go-strftime/LICENSE new file mode 100644 index 000000000..a49216f13 --- /dev/null +++ b/vendor/github.com/jehiah/go-strftime/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Jehiah Czebotar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/jehiah/go-strftime/README.md b/vendor/github.com/jehiah/go-strftime/README.md new file mode 100644 index 000000000..10b06f4af --- /dev/null +++ b/vendor/github.com/jehiah/go-strftime/README.md @@ -0,0 +1,26 @@ +go-strftime +=========== + +go implementation of strftime + +## Example + +``` +package main + +import ( + "fmt" + "time" + + strftime "github.com/jehiah/go-strftime" +) + +func main() { + t := time.Unix(1340244776, 0) + utc, _ := time.LoadLocation("UTC") + t = t.In(utc) + fmt.Println(strftime.Format("%Y-%m-%d %H:%M:%S", t)) + // Output: + // 2012-06-21 02:12:56 +} +``` diff --git a/vendor/github.com/jehiah/go-strftime/strftime.go b/vendor/github.com/jehiah/go-strftime/strftime.go new file mode 100644 index 000000000..bf2eeab48 --- /dev/null +++ b/vendor/github.com/jehiah/go-strftime/strftime.go @@ -0,0 +1,72 @@ +// go implementation of strftime +package strftime + +import ( + "strings" + "time" +) + +// taken from time/format.go +var conversion = map[rune]string{ + /*stdLongMonth */ 'B': "January", + /*stdMonth */ 'b': "Jan", + // stdNumMonth */ 'm': "1", + /*stdZeroMonth */ 'm': "01", + /*stdLongWeekDay */ 'A': "Monday", + /*stdWeekDay */ 'a': "Mon", + // stdDay */ 'd': "2", + // stdUnderDay */ 'd': "_2", + /*stdZeroDay */ 'd': "02", + /*stdHour */ 'H': "15", + // stdHour12 */ 'I': "3", + /*stdZeroHour12 */ 'I': "03", + // stdMinute */ 'M': "4", + /*stdZeroMinute */ 'M': "04", + // stdSecond */ 'S': "5", + /*stdZeroSecond */ 'S': "05", + /*stdLongYear */ 'Y': "2006", + /*stdYear */ 'y': "06", + /*stdPM */ 'p': "PM", + // stdpm */ 'p': "pm", + /*stdTZ */ 'Z': "MST", + // stdISO8601TZ */ 'z': "Z0700", // prints Z for UTC + // stdISO8601ColonTZ */ 'z': "Z07:00", // prints Z for UTC + /*stdNumTZ */ 'z': "-0700", // always numeric + // stdNumShortTZ */ 'b': "-07", // always numeric + // stdNumColonTZ */ 'b': "-07:00", // always numeric + /* nonStdMilli */ 'L': ".000", +} + +// This is an alternative to time.Format because no one knows +// what date 040305 is supposed to create when used as a 'layout' string +// this takes standard strftime format options. For a complete list +// of format options see http://strftime.org/ +func Format(format string, t time.Time) string { + retval := make([]byte, 0, len(format)) + for i, ni := 0, 0; i < len(format); i = ni + 2 { + ni = strings.IndexByte(format[i:], '%') + if ni < 0 { + ni = len(format) + } else { + ni += i + } + retval = append(retval, []byte(format[i:ni])...) + if ni+1 < len(format) { + c := format[ni+1] + if c == '%' { + retval = append(retval, '%') + } else { + if layoutCmd, ok := conversion[rune(c)]; ok { + retval = append(retval, []byte(t.Format(layoutCmd))...) + } else { + retval = append(retval, '%', c) + } + } + } else { + if ni < len(format) { + retval = append(retval, '%') + } + } + } + return string(retval) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 70d7a6c98..9446197b2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -345,6 +345,8 @@ github.com/jdcloud-api/jdcloud-sdk-go/services/vm/models github.com/jdcloud-api/jdcloud-sdk-go/services/vpc/apis github.com/jdcloud-api/jdcloud-sdk-go/services/vpc/client github.com/jdcloud-api/jdcloud-sdk-go/services/vpc/models +# github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 +github.com/jehiah/go-strftime # github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af github.com/jmespath/go-jmespath # github.com/joyent/triton-go v0.0.0-20180116165742-545edbe0d564 diff --git a/website/source/docs/templates/engine.html.md b/website/source/docs/templates/engine.html.md index 06681e921..4c7883c88 100644 --- a/website/source/docs/templates/engine.html.md +++ b/website/source/docs/templates/engine.html.md @@ -66,6 +66,10 @@ Here is a full list of the available functions for reference. [formatted](https://golang.org/pkg/time/#example_Time_Format). See more examples below in [the `isotime` format reference](/docs/templates/engine.html#isotime-function-format-reference). + `strftime FORMAT` - UTC time, formated using the ISO C standard format + `FORMAT`. See + [jehiah/go-strftime](https://github.com/jehiah/go-strftime) for a list + of available format specifier. - `lower` - Lowercases the string. - `packer_version` - Returns Packer version. - `pwd` - The working directory while executing Packer.