Skip to content

Commit

Permalink
feat: helm to octoploy converter
Browse files Browse the repository at this point in the history
  • Loading branch information
davidgiga1993 committed Jul 29, 2024
1 parent 991e32a commit 9a5eff1
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
77 changes: 77 additions & 0 deletions octoploy/converter/HelmToOcto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import os.path
import re
from typing import Dict

import yaml

from octoploy.utils.DictUtils import DictUtils


class HelmToOcto:
"""
Converts a rendered helm chart (single yml file) to an octoploy project
"""

MANAGED_BY = 'app.kubernetes.io/managed-by'

def __init__(self, dest: str):
self._filter = []
self._dest = dest
if not os.path.exists(dest):
raise FileNotFoundError(f"Destination directory {dest} does not exist")

def include(self, app_name: str):
self._filter.append(app_name)

def convert(self, source: str):
with open(source) as f:
data = yaml.load_all(f, Loader=yaml.FullLoader)
for doc in data:
if doc is None:
continue
self._convert_doc(doc)

def _convert_doc(self, doc: Dict[str, any]):
app_name = 'misc'
labels = DictUtils.get(doc, 'metadata.labels')
if labels is not None:
app_name = labels.get('app.kubernetes.io/component', app_name)
if self.MANAGED_BY in labels:
del labels[self.MANAGED_BY]

if not self._include_app(app_name):
return
self._add_to_app(doc, app_name)

def _add_to_app(self, doc: Dict[str, any], app_name: str):
app_name = app_name.replace(' ', '-').lower()
dest = os.path.join(self._dest, app_name)
if not os.path.exists(dest):
os.mkdir(dest)
meta_data = {
'name': app_name,
}
with open(os.path.join(dest, '_index.yml'), 'w') as f:
yaml.dump(meta_data, f)

kind = doc.get('kind')
if kind is None:
# Empty object?
return

file_name = re.sub(r'(?<!^)(?=[A-Z])', '-', kind).lower()
file_path = os.path.join(dest, file_name + '.yml')
data = [doc]
if os.path.exists(file_path):
# Append
with open(file_path) as f:
data = list(yaml.load_all(f, Loader=yaml.FullLoader))
data.append(doc)

with open(file_path, 'w') as f:
yaml.dump_all(data, f)

def _include_app(self, app_name: str) -> bool:
if len(self._filter) == 0:
return True
return app_name in self._filter
Empty file added octoploy/converter/__init__.py
Empty file.
17 changes: 17 additions & 0 deletions octoploy/octoploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from octoploy.backup.BackupGenerator import BackupGenerator
from octoploy.config.Config import RootConfig, RunMode
from octoploy.converter.HelmToOcto import HelmToOcto
from octoploy.deploy.AppDeploy import AppDeployment
from octoploy.processing.DecryptionProcessor import DecryptionProcessor
from octoploy.state.StateMover import StateMover
Expand Down Expand Up @@ -84,6 +85,7 @@ def deploy_app(args):
mode.set_override_env(args.env)
_run_app_deploy(args.config_dir, args.name[0], mode)


def delete_app(args):
mode = RunMode()
mode.delete = True
Expand Down Expand Up @@ -112,6 +114,16 @@ def create_backup(args):
BackupGenerator(root_config).create_backup(args.name[0])


def convert_helm(args):
dest = args.config_dir
if dest == '':
dest = '.'
converter = HelmToOcto(dest)
for f in args.filter:
converter.include(f)
converter.convert(args.file)


def encrypt_secrets(args):
files = args.file
for file in files:
Expand Down Expand Up @@ -171,6 +183,11 @@ def main():
'Format: configmapSuffix|namespace/configmapSuffix')
state_mv_parser.set_defaults(func=move_state)

helm_parser = subparsers.add_parser('helm-convert', help='Converts a rendered helm chart yml file to octoploy')
helm_parser.add_argument('file', help='Yml file to be converted')
helm_parser.add_argument('--filter', dest='filter', help='Component names to be converted - optional', nargs='*')
helm_parser.set_defaults(func=convert_helm)

encrypt_parser = subparsers.add_parser('encrypt', help='Encrypts k8s secrets objects')
encrypt_parser.add_argument('file', help='Yml file to be encrypted', nargs=1)
encrypt_parser.set_defaults(func=encrypt_secrets)
Expand Down

0 comments on commit 9a5eff1

Please sign in to comment.