config/sysinv/cgts-client/cgts-client/cgtsclient/v1/helm_shell.py

124 lines
4.3 KiB
Python
Executable File

#!/usr/bin/env python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (c) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from collections import OrderedDict
import yaml
from cgtsclient.common import utils
from cgtsclient import exc
def _print_helm_chart(chart):
# We only want to print the fields that are in the response, that way
# we can reuse this function for printing the override update output
# where the system overrides aren't included.
ordereddata = OrderedDict(sorted(chart.to_dict().items(),
key=lambda t: t[0]))
utils.print_dict(ordereddata)
def do_helm_override_list(cc, args):
"""List system helm charts."""
charts = cc.helm.list_charts()
utils.print_list(charts, ['name', 'namespaces'], ['chart name', 'overrides namespaces'], sortby=0)
@utils.arg('chart', metavar='<chart name>',
help="Name of chart")
@utils.arg('namespace',
metavar='<namespace>',
help="namespace of chart overrides")
def do_helm_override_show(cc, args):
"""Show overrides for chart."""
try:
chart = cc.helm.get_overrides(args.chart, args.namespace)
_print_helm_chart(chart)
except exc.HTTPNotFound:
raise exc.CommandError('chart overrides not found: %s:%s' % (
args.chart, args.namespace))
@utils.arg('chart',
metavar='<chart name>',
help="Name of chart")
@utils.arg('namespace',
metavar='<namespace>',
help="namespace of chart overrides")
def do_helm_override_delete(cc, args):
"""Delete overrides for a chart."""
try:
cc.helm.delete_overrides(args.chart, args.namespace)
print('Deleted chart overrides for %s:%s' % (
args.chart, args.namespace))
except exc.HTTPNotFound:
raise exc.CommandError('chart overrides not found: %s:%s' % (
args.chart, args.namespace))
@utils.arg('chart',
metavar='<chart name>',
help="Name of chart")
@utils.arg('namespace',
metavar='<namespace>',
help="namespace of chart overrides")
@utils.arg('--reuse-values', action='store_true', default=False,
help='Should we reuse existing helm chart user override values. '
'If --reset-values is set this is ignored')
@utils.arg('--reset-values', action='store_true', default=False,
help='Replace any existing helm chart overrides with the ones '
'specified.')
@utils.arg('--values', metavar='<file_name>', action='append', dest='files',
default=[],
help='Specify a YAML file containing helm chart override values. '
'Can specify multiple times.')
@utils.arg('--set', metavar='<commandline_overrides>', action='append',
default=[],
help='Set helm chart override values on the command line (can '
'specify multiple times or separate values with commas: '
'key1=val1,key2=val2). These are processed after "--values" '
'files.')
def do_helm_override_update(cc, args):
"""Update helm chart user overrides."""
# This logic results in similar behaviour to "helm upgrade".
flag = 'reset'
if args.reuse_values and not args.reset_values:
flag = 'reuse'
# Overrides can be specified three different ways. To preserve helm's
# behaviour we will process all "--values" files first, then all "--set"
# values, then finally all "--set-string" values.
override_files = []
# need to handle missing files
if args.files:
try:
for filename in args.files:
with open(filename, 'r') as input_file:
overrides = yaml.load(input_file)
override_files.append(yaml.dump(overrides))
except IOError as ex:
raise exc.CommandError('error opening values file: %s' % ex)
override_set = []
for override in args.set:
override_set.append(override)
overrides = {
'files': override_files,
'set': override_set,
}
try:
chart = cc.helm.update_overrides(args.chart, args.namespace,
flag, overrides)
except exc.HTTPNotFound:
raise exc.CommandError('helm chart not found: %s:%s' % (
args.chart, args.namespace))
_print_helm_chart(chart)