Commit graph

162 commits

Author SHA1 Message Date
Paul Brousseau
3192408415 Fixing typo in engine comments
Signed-off-by: Paul Brousseau <object88@gmail.com>
2020-09-13 21:31:38 -07:00
Matt Farina
dbd001e532
Removing tiller language
Since Tiller is no longer part of Helm v3, internal documentation
language about Tiller can be removed

Signed-off-by: Matt Farina <matt@mattfarina.com>
2020-05-21 15:26:16 -04:00
Matt Butcher
bb47286f09
fix linting error with lookup function (#7969)
Signed-off-by: Matt Butcher <matt.butcher@microsoft.com>
2020-04-22 10:09:34 -06:00
Andre Sencioles
d0726e07ab
Parse reference templates in predictable order (#7702)
* Parse reference templates in predictable order

Fix issue #7701

Signed-off-by: Andre Sencioles <asenci@gmail.com>

* Add test case for issue #7701 regression

Signed-off-by: Andre Sencioles <asenci@gmail.com>

* gofmt

Signed-off-by: Andre Sencioles <asenci@gmail.com>
2020-04-21 13:16:55 -06:00
Matt Farina
3b8521c1f0
Updating sprig and semver to newer versions
Note, there is an issue with a dependency of sprig changing
behavior. A test has been added with a description to catch if a
behavior breaking change of mergo is used.

See https://github.com/imdario/mergo/issues/139 for the mergo
issue and sprig for further details on handling this in the
future.

Closes  #7533

Signed-off-by: Matt Farina <matt@mattfarina.com>
2020-04-16 14:12:30 -04:00
Adam Reese
c2da4fd53d
ref(*): kubernetes v1.18 (#7831)
Upgrade Kubernetes libraries to v0.18.0

Add new lazy load KubernetesClientSet to avoid missing kubeconfig error

In kubernetes v1.18 kubeconfig validation was added.  Minikube and Kind
both remove kubeconfig when stopping clusters.  This causes and error
when running any helm commands because we initialize the client before
executing the command.

Signed-off-by: Adam Reese <adam@reese.io>
2020-04-13 08:40:38 -07:00
Tuan
97c68adc4d
Add fromYamlArray and fromJsonArray template helpers (#7712)
Signed-off-by: Tuan Nguyen <nmtuan.dev@gmail.com>
2020-03-27 19:39:41 -06:00
Daniel Cheng
206d4a9053 add test for template recursion
Signed-off-by: Daniel Cheng <dcheng@us.ibm.com>
2020-02-10 12:25:41 -05:00
Daniel Cheng
8528548441 fix recursion count in templates
Signed-off-by: Daniel Cheng <dcheng@us.ibm.com>
2020-02-07 18:35:21 -05:00
Jon Huhn
43e6285995
Fix engine.newFiles doc comment
Signed-off-by: Jon Huhn <huhnjon@gmail.com>
2020-02-06 11:13:20 -06:00
Matthew Fisher
1b1d6bba9c
fix(lookup_func): do not return error when object is not found
Signed-off-by: Matthew Fisher <matt.fisher@microsoft.com>
2020-01-30 10:55:33 -08:00
Matthew Fisher
9c680e604b
Merge pull request #7443 from zwwhdls/fix7439
allow limited recursion in templates
2020-01-27 09:51:29 -08:00
zwwhdls
16a85f7570 fix test-style
Signed-off-by: zwwhdls <zwwhdls@hotmail.com>
2020-01-21 22:04:13 +08:00
zwwhdls
4eda4fa06d allow limited recursion in templates
Signed-off-by: zwwhdls <zwwhdls@hotmail.com>
2020-01-21 21:46:34 +08:00
Matthew Fisher
e84b61b2db
Merge pull request #6752 from raffaelespazzoli/lookup
Lookup template function
2020-01-14 11:01:45 -08:00
Josh Soref
02ad2b1187 Spelling (#7258)
* spelling: constraint

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: cryptographic

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: dependency

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: doesnot

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: don't

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: unexpected

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: dreadnought

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: default

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: envvars

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: evaluates

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: execute

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: extractor

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: frobnitz

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: generated

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: implementation

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: jabba

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: keywords

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: kubernetes

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: override

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: package

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: parsable

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: progress

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: recursively

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: release

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: cache

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: representing

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: serializer

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: subchart

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: utilities

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>
2019-12-18 12:04:08 +00:00
raffaelespazzoli
fa643cfa31 fixed golint
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:37:17 -05:00
raffaelespazzoli
a62ba04962 additional fixes based on @thomastaylor312 comment
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
0bb4eaace7 addressing some feedback from @thomastaylor312
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
e98cd621f0 added rest client passed with action configuration
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
b3495c7353 added license header
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
02ce01b241 fixed circle ci issues
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
30d245a0e3 added check on namespaced resource
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
raffaelespazzoli
d564d4bf2d first lookup template function implementation
Signed-off-by: raffaelespazzoli <raffaele.spazzoli@gmail.com>
2019-12-17 08:31:47 -05:00
海的澜色
750b870aed fix stack overflow error (#7114)
* fixed #7111

Signed-off-by: zwwhdls <zwwhdls@hotmail.com>

* update error message

Signed-off-by: zwwhdls <zwwhdls@hotmail.com>

* add test case

Signed-off-by: zwwhdls <zwwhdls@hotmail.com>

* fix lint error

Signed-off-by: zwwhdls <zwwhdls@hotmail.com>
2019-12-02 14:57:51 +00:00
KUOKA Yusuke
4c351c7248 fix(v3): fix type error while merging map loaded with fromYaml template func (#6630)
Fixes #6626

Signed-off-by: Yusuke Kuoka <ykuoka@gmail.com>
2019-10-10 16:37:54 +01:00
Matt Farina
9bc7934f35
Updating the module for v3 as the major version
Signed-off-by: Matt Farina <matt@mattfarina.com>
2019-10-03 14:27:05 -04:00
Matt Farina
967f4fed42
Update dependencies
* Kubernetes updated to 1.16.1
* SemVer and Sprig updated to latest releases that leverage go
  modules
* Tests and checks updated. These already landed in v2 via PR 6457

Signed-off-by: Matt Farina <matt@mattfarina.com>
2019-10-03 13:49:07 -04:00
Adam Reese
4fcc876786
ref(pkg/engine): cleanup of development hack
This was left in from some of the chart builder work.  I forgot to
remove it.

Signed-off-by: Adam Reese <adam@reese.io>
2019-09-03 15:31:58 -07:00
Martin Hickey
5906b9dfee Fix style conformance issue
Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com>
2019-07-30 16:00:18 +01:00
Ian Howell
c92e3351f7 Switch to a more unique delimiter for template execution errors
Signed-off-by: Ian Howell <ian.howell0@gmail.com>
2019-07-29 15:39:44 -05:00
Ian Howell
31b940a61d fix(engine): Fix eating too many colons during template execution
This fixes #6044, in which error parsing is greedily eating too many
colons, preventing users from using colons in their warning messages to
the `required` function

Signed-off-by: Ian Howell <ian.howell0@gmail.com>
2019-07-23 11:33:03 -05:00
Thomas O'Donnell
213f714604 Stop Lint from breaking when using required
Have updated the required filter so that it doesn't break when linting a
chart. This work is based off #4221 and #4748 which didn't make it into
the v3 branch.

Signed-off-by: Thomas O'Donnell <andy.tom@gmail.com>
2019-06-13 20:32:37 +02:00
Adam Reese
b49db9e6e6
ref(pkg/chartutil): break up chartutil into logical files
Signed-off-by: Adam Reese <adam@reese.io>
2019-05-22 19:38:11 +02:00
Matthew Fisher
757eb88d6c
Merge pull request #5441 from hickeyma/update-lib-charts
feat(*): Add capability for application charts to be used as library charts
2019-05-14 13:58:44 -07:00
Josh Dolitsky
a12a396aab
Helm 3: registry login/logout (#5597)
* login/logout placeholders

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* use latest oras

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* use docker auth system

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* working login+push

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* working on tests

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* fix typo in htpasswd

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* rename credsfile to config.json

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* add flags for username/password

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* disable logout test broken on linux

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* upgrade to oras 0.4.0

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* re-enable logout test

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* panic for uncaught errors

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>

* move login/logout to new registry subcommand

Signed-off-by: Josh Dolitsky <jdolitsky@gmail.com>
2019-05-06 16:15:34 -05:00
Martin Hickey
0b809dd078 Validate library chart files after chart loaded
Validate the library chart files after the chart and
its depoendencies have been loaded. This is an update
following review comment:
- https://github.com/helm/helm/pull/5441#pullrequestreview-231339425

Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com>
2019-05-01 14:56:32 +01:00
Ian Howell
278594fb0f fix(pkg/engine): Style changes on template errors
Signed-off-by: Ian Howell <ian.howell0@gmail.com>
2019-04-09 12:34:13 -05:00
Ian Howell
92b86f6e74 fix(pkg/engine): Catch non-templating errors when rendering templates
Signed-off-by: Ian Howell <ian.howell0@gmail.com>
2019-04-09 10:54:01 -05:00
Ian Howell
33b1ede570 fix(pkg/engine): Clean up template error messages
Signed-off-by: Ian Howell <ian.howell0@gmail.com>
2019-04-08 16:48:21 -05:00
Adam Reese
295092cd7d
ref(pkg/action): refactoring dup code and linter fixes
Signed-off-by: Adam Reese <adam@reese.io>
2019-03-26 11:11:27 -07:00
Adam Reese
895e9192d4
feat(*): use vanity import helm.sh/helm
Signed-off-by: Adam Reese <adam@reese.io>
2019-03-13 13:43:47 -07:00
Adam Reese
849f27d11f
ref(pkg/engine): make template specific functions private
Make template specific functions private to ensure they not misused and
make unit tests simpler.  We may export the template helpers later if
needed.

This lays the foundation for the new chart pipeline.

Signed-off-by: Adam Reese <adam@reese.io>
2019-03-06 15:45:52 -08:00
Adam Reese
d841a1b1d9
fix(engine): make template rendering thread safe
See https://github.com/helm/helm/pull/4828

Signed-off-by: Adam Reese <adam@reese.io>
2019-03-05 12:56:39 -08:00
Adam Reese
2b81eea1e2
ref(*): replace byte array with map for Release config
Signed-off-by: Adam Reese <adam@reese.io>
2018-12-04 15:57:24 -08:00
Adam Reese
516c53dae6
ref(chart): use map for chart.Values
Signed-off-by: Adam Reese <adam@reese.io>
2018-08-29 09:56:19 -07:00
Adam Reese
4f26b658d8
change copyright to "Copyright The Helm Authors" 2018-08-24 12:03:55 -07:00
Adam Reese
f012940d9c
ref(*): refactor chart/chartutil
ref(chartutil): move chart loading out of chartutil into new package
    add chart loader interface to allow lazy loading
feat(chart): create chart accessors
ref(*): cleanup requirements
ref(tiller): remove optional template engines
ref(tiller): simplify sorting releases and hooks
ref(*): code simplification
ref(hapi): move chart package out of hapi
ref(chart): add requirements and lock to Chart struct
2018-08-24 11:28:29 -07:00
Adam Reese
726e3c41be
feat(*): print stacktrace on error with debug enabled 2018-05-10 09:34:41 -07:00
Adam Reese
4c95185164
ref(*): replace chart.config with []byte 2018-04-20 00:13:19 -07:00
Adam Reese
36536d77ba
ref(*): remove protobuf any type 2018-04-18 16:28:50 -07:00
Adam Reese
6345f04190
ref(hapi): convert protobuf to go types 2018-04-18 14:53:38 -07:00
scriptonist
5311bf40a8 Now returning error and stopping installation 2018-03-13 16:33:10 +05:30
scriptonist
6cfaa4ebf2 Added code to recover from a tiller pod crash in an event of template render failure 2018-03-09 18:30:01 +05:30
Lukas Eichler
8bc7dede18
fix(helm): Apply PR comments for tpl template name fix
Modified existing unit test to verify the changed behavior.
Removed debug print.
2017-12-03 17:39:51 +01:00
Lukas Eichler
1cebc760a0
Fixed warning for missing formating parameter inside error message. 2017-12-03 17:39:51 +01:00
Lukas Eichler
2c338db1bd
fix(helm): Set template context inside tpl function to outer function.
docs(helm): Added documentation about tpl function
2017-12-03 17:39:51 +01:00
Lukas Eichler
39db9ec6e8 Merge branch 'master' into master 2017-06-08 18:40:34 +02:00
Lukas Eichler
9cd9fc47df removed debug file 2017-05-28 11:43:13 +02:00
Lukas Eichler
439f1b31d1 Added unit test for include in tpl function 2017-05-28 10:55:15 +02:00
Lukas Eichler
ce8e8d6778 Added storage of parsed templates in engine 2017-05-28 08:35:18 +02:00
Matt Butcher
8937c775a9
fix(2452): sort templates before parse
This sorts templates by depth before sending them to the template
parser. Deepest templates are parsed first, with umbrella templates
parsed last. Since template definition names are LIFO, that means that
the highest level templates will claim the namespace.

Or, to put it simply, you can predictably override a child's defined
template by re-defining it in a parent chart.

Closes #2452
2017-05-26 18:01:49 -06:00
Matt Butcher
5c227bffbb Merge pull request #2361 from databus23/dont_render_partials
Skip rendering partials
2017-05-05 16:44:30 -06:00
Lukas Eichler
2521c526d9 - Changed error behaviour to returning an error instead of writing the error in the template
- Added tests for using a function inside a template that is evaluated using the "tpl" function
2017-05-02 09:44:26 +02:00
Lukas Eichler
d01f7978d2 Added implementation for a tpl function that evaluates a string as a template.
Implementation for #1978
2017-05-02 09:44:26 +02:00
Fabian Ruff
b94eb82d12 Skip rendering partials
The output of a rendered partial is not used and rendering it might fail if it expects different values
2017-05-01 02:00:09 +02:00
Fabian Ruff
124235ffed Fail template execution if included template fails 2017-04-30 01:00:31 +02:00
Steve Wilkerson
79a3db0a63 feat(helm): add support for required properties
Adds the `required` function in enginge.go to support required
properties in values.yml. When a chart developer wishes to specify
intent in requiring a value, they can use this function to declare
an error message that gets returned when chart rendering fails
when a required value is not present in values.yml.

Closes #1580
2017-03-08 12:49:23 -06:00
Fabian Ruff
43a6bcff40 Add .Template.BasePath to template system 2017-03-06 23:19:49 +01:00
Jack Zampolin
fc60d51be9 Add toToml function 2017-03-01 10:19:21 -08:00
YuviPanda
5c52fe6ad6 Add ToJson and FromJson template functions 2017-02-21 00:34:17 -08:00
Matt Butcher
cb0a6c7e07
feat(tiller): add {{.Capabilities}} object
This adds the {{.Capabilities}} object to the template variables so that
chart authors can write charts that are aware of teh Kubernetes
capabilities of the current cluster.

Closes #1608
2017-01-09 18:09:20 -07:00
Matt Butcher
d8540d78f1
feat(tiller): add fromYaml to template functions
This adds a fromYaml template function.

Closes #1604
2016-12-14 16:47:25 -07:00
Andrew Stuart
6760aa1588
Add Lines method, remove path utils (Sprig pr) 2016-12-12 17:19:47 -07:00
Andrew Stuart
5d58b7792c
Fix erroneous import 2016-12-09 14:06:56 -07:00
Andrew Stuart
9771973888
Add AsSecrets, AsConfig methods for Files object. Move ToYaml to chartutil 2016-12-09 12:53:53 -07:00
Adnan Abdulhussein
f97dbe33da fix(tests): prefix template names with "templates/" 2016-10-21 16:12:41 -07:00
Matt Butcher
36f7eb0b2a fix(linter): add engine.FuncMap so linter can use real function list
This adds a function engine.FuncMap that returns a function mapping that
better represents the functions passed to a template. The linting logic
is reconfigured to use this function instead of the sprig.FuncMap
function.

Closes #1366
2016-10-14 16:28:43 -06:00
Matt Butcher
431cc46cad feat(tiller): add toYaml template function
This adds the function toYaml to the Engine template functions.

Closes #1225
2016-09-26 14:33:54 -06:00
joe2far
72e7b22999 minor engine unit test fix 2016-08-30 17:13:34 +01:00
vaikas-google
492dbb3791 Add support for NOTES.txt file 2016-08-29 13:11:16 -07:00
Matt Butcher
84761a559a fix(helm): remove extra linter output
Closes #1076
2016-08-23 11:01:18 -06:00
Matt Butcher
b7945d05c4 ref(templates): change GetString to Get
This changes "pkg/chartutil".Files.Get to return a string, removes
"pkg/chartutil".Files.GetString, and adds
"pkg/chartutil".Files.GetBytes.

Closes #1020
2016-08-03 13:01:13 -06:00
Matt Butcher
9718c9e7c8 feat(engine): add 'partial' function
This adds a context-aware template function called 'partial' that will
allow rendering other templates in a chart into a string value, which
can then be piped to other functions. Usage is something like
'{{partial 'path/to/template.yaml' | indent 2}}'

This might be a bad idea.

Closes #1005
2016-08-01 16:30:34 -06:00
Matt Butcher
033dbfe75e feat(tiller): add Files map to templates
Templates can now access the non-template files in a chart by using
the '{{.Files}}' map inside of a template.

Relates to #950
2016-07-29 16:04:48 -06:00
Matt Butcher
95eeba3805 fix(tiller): merge -f values correctly
This fixes a bug in which passed-in values files were not correctly
merged into the chart's default values YAML data. I believe it also
fixes some other prioritization bugs in values merging.

The existing unit test was wrong (see TestCoalesceValues). It is
fixed now. Also added more tests to simulate issue #971.

In the course of writing this, I removed some vestigial code as
mentioned in #920.

Closes #971
Closes #920
2016-07-21 16:00:57 -06:00
Adam Reese
a14e76a65c chore(*): add canonical import path annotation
https://golang.org/doc/go1.4#canonicalimports
2016-07-11 22:59:55 -06:00
Matt Butcher
73a2890277 fix(engine): change template naming
Template paths were relative to the chart that contained them, which
meant that all templates were named 'template/SOMETHING'. This made it
trivially easy to hit namespace collisions as in #933.

Template path names are essentially opaque strings so this patch simply
changes them to be qualified by parent chart.
2016-07-07 11:39:47 -06:00
Matt Butcher
532f03ec78 feat(tiller): add .Template object in templates
This allows templates to access information about the template file.
Right now, the template can only access the .Template.Name, which is the
chart-relative path to the current template.

Closes #894
2016-06-28 16:18:08 -06:00
Matt Butcher
ab4e20c278 Merge pull request #888 from technosophos/fix/887-no-value-fix
fix(tiller): stop printing <no value> when var is missing
2016-06-27 14:07:45 -06:00
Matt Butcher
96ac6ebc6c fix(tiller): stop printing <no value> when var is missing
Instead of printing "no value", this prints an empty string by
default, but adds a Strict flag on the engine, which (if true)
will cause a template render to error out if a value is not supplied.

Strict is set to false so that developers can instead use `default` to
set default values.
2016-06-24 16:25:43 -06:00
Miguel Martinez
2eff17cb6d Removing debugging line 2016-06-24 12:11:12 -07:00
Matt Butcher
225d3a8adc test(engine): add test case for deep release passing 2016-06-24 12:06:52 -06:00
Matt Butcher
e00f774a5d fix(engine): remove debugging output 2016-06-24 12:06:52 -06:00
Matt Butcher
22ac61469f feat(*): add Values namespace to templates
This adds the .Values namespace qualifier to all values
2016-06-24 12:06:52 -06:00
Matt Butcher
e757b24aed fix(*): add license header 2016-06-22 12:28:45 -06:00
Matt Butcher
60f5341b91 feat(chartutil): support global variables
This provides support for "global" variables. It does this by
declaring "global" to be a special namespace. It then copies this
namespace into every subchart, coalescing it into any "global"
namespace found there.

The net result is that if "global.foo" is set in the YAML file, it
will be available to every chart/subchart as ".global.foo" regardless of
where that chart is in the subchart tree.
2016-06-14 11:24:09 -06:00
Matt Butcher
490cef784c fix(tiller): refactor template render to use chartutil. 2016-06-13 13:11:39 -06:00
Matt Butcher
e8109048a9 fix(chartutil): move values coalescing into chartutil 2016-06-09 14:10:12 -06:00
Adam Reese
d95a144563 fix(chartutil): fix nil error on values
Fixes: https://github.com/kubernetes/helm/issues/803
2016-06-09 11:09:00 -07:00