Call helm upgrade if release already exists
diff --git a/_modules/helm.py b/_modules/helm.py
index b849676..19be742 100644
--- a/_modules/helm.py
+++ b/_modules/helm.py
@@ -28,3 +28,21 @@
cmd['stdin'] = yaml.serialize(values, default_flow_style=False)
LOG.debug('Creating release with args: %s', cmd)
return __salt__['cmd.retcode'](**cmd) == 0
+
+
+def release_upgrade(name, chart_name, version=None, values=None):
+ args = []
+ if version is not None:
+ args += ['--version', version]
+ if values is not None:
+ args += ['--values', '/dev/stdin']
+ cmd = _helm_cmd('upgrade', name, chart_name, *args)
+ if values is not None:
+ cmd['stdin'] = yaml.serialize(values, default_flow_style=False)
+ LOG.debug('Creating release with args: %s', cmd)
+ return __salt__['cmd.retcode'](**cmd) == 0
+
+
+def get_values(name):
+ cmd = _helm_cmd('get', 'values', '--all', name)
+ return yaml.deserialize(__salt__['cmd.run_stdout'](**cmd))
diff --git a/_states/helm_release.py b/_states/helm_release.py
index d5272c0..c3b70a3 100644
--- a/_states/helm_release.py
+++ b/_states/helm_release.py
@@ -1,6 +1,9 @@
+import difflib
import logging
-def present(name, chart_name, version=None, values=None, logLevel=None):
+from salt.serializers import yaml
+
+def present(name, chart_name, version=None, values=None):
exists = __salt__['helm.release_exists'](name)
if not exists:
result = __salt__['helm.release_create'](
@@ -19,9 +22,31 @@
'result': False,
'comment': 'Failed to create release "{}"'.format(name),
}
+ old_values = __salt__['helm.get_values'](name)
+ result = __salt__['helm.release_upgrade'](
+ name, chart_name, version, values)
+ if not result:
+ return {
+ 'name': name,
+ 'changes': {},
+ 'result': False,
+ 'comment': 'Failed to create release "{}"'.format(name),
+ }
+ new_values = __salt__['helm.get_values'](name)
+ if new_values == old_values:
+ return {
+ 'name': name,
+ 'changes': {},
+ 'result': True,
+ 'comment': 'Release "{}" already exists'.format(name),
+ }
+ old_str = yaml.serialize(old_values, default_flow_style=False)
+ new_str = yaml.serialize(new_values, default_flow_style=False)
+ diff = difflib.unified_diff(
+ old_str.split('\n'), new_str.split('\n'), lineterm='')
return {
'name': name,
- 'changes': {},
+ 'changes': {'values': '\n'.join(diff)},
'result': True,
'comment': 'Release "{}" already exists'.format(name),
}