better handling for default networks (#42)

* better handling for default networks

* fix for issues/43

* check for none explictly rather than allowing truthy/falsy conversion

* update to read volume data from mounts, rather than host config binds

Co-authored-by: Adam Doussan <acdoussan@Adams-MacBook-Pro.local>
This commit is contained in:
acdoussan
2022-08-14 16:54:43 -05:00
committed by GitHub
parent 0c4ff4fb25
commit 357fef9782

View File

@@ -27,8 +27,16 @@ def main():
cfile, c_networks, c_volumes = generate(cname) cfile, c_networks, c_volumes = generate(cname)
struct.update(cfile) struct.update(cfile)
networks.update(c_networks)
volumes.update(c_volumes) if c_networks is None:
networks = None
else:
networks.update(c_networks)
if c_volumes is None:
volumes = None
else:
volumes.update(c_volumes)
render(struct, args, networks, volumes) render(struct, args, networks, volumes)
@@ -38,7 +46,15 @@ def render(struct, args, networks, volumes):
if args.version == 1: if args.version == 1:
pyaml.p(OrderedDict(struct)) pyaml.p(OrderedDict(struct))
else: else:
pyaml.p(OrderedDict({'version': '"3"', 'services': struct, 'networks': networks, 'volumes': volumes})) ans = {'version': '"3"', 'services': struct}
if networks is not None:
ans['networks'] = networks
if volumes is not None:
ans['volumes'] = volumes
pyaml.p(OrderedDict(ans))
def is_date_or_time(s: str): def is_date_or_time(s: str):
@@ -73,6 +89,8 @@ def generate(cname):
cfile[cattrs['Name'][1:]] = {} cfile[cattrs['Name'][1:]] = {}
ct = cfile[cattrs['Name'][1:]] ct = cfile[cattrs['Name'][1:]]
default_networks = ['bridge', 'host', 'none']
values = { values = {
'cap_add': cattrs['HostConfig']['CapAdd'], 'cap_add': cattrs['HostConfig']['CapAdd'],
'cap_drop': cattrs['HostConfig']['CapDrop'], 'cap_drop': cattrs['HostConfig']['CapDrop'],
@@ -89,10 +107,10 @@ def generate(cname):
#'log_driver': cattrs['HostConfig']['LogConfig']['Type'], #'log_driver': cattrs['HostConfig']['LogConfig']['Type'],
#'log_opt': cattrs['HostConfig']['LogConfig']['Config'], #'log_opt': cattrs['HostConfig']['LogConfig']['Config'],
'logging': {'driver': cattrs['HostConfig']['LogConfig']['Type'], 'options': cattrs['HostConfig']['LogConfig']['Config']}, 'logging': {'driver': cattrs['HostConfig']['LogConfig']['Type'], 'options': cattrs['HostConfig']['LogConfig']['Config']},
'networks': {x for x in cattrs['NetworkSettings']['Networks'].keys() if x != 'bridge'}, 'networks': {x for x in cattrs['NetworkSettings']['Networks'].keys() if x not in default_networks},
'security_opt': cattrs['HostConfig']['SecurityOpt'], 'security_opt': cattrs['HostConfig']['SecurityOpt'],
'ulimits': cattrs['HostConfig']['Ulimits'], 'ulimits': cattrs['HostConfig']['Ulimits'],
'volumes': cattrs['HostConfig']['Binds'], 'volumes': [f'{m["Name"]}:{m["Destination"]}' for m in cattrs['Mounts'] if m['Type'] == 'volume'],
'volume_driver': cattrs['HostConfig']['VolumeDriver'], 'volume_driver': cattrs['HostConfig']['VolumeDriver'],
'volumes_from': cattrs['HostConfig']['VolumesFrom'], 'volumes_from': cattrs['HostConfig']['VolumesFrom'],
'entrypoint': cattrs['Config']['Entrypoint'], 'entrypoint': cattrs['Config']['Entrypoint'],
@@ -112,10 +130,13 @@ def generate(cname):
# Populate devices key if device values are present # Populate devices key if device values are present
if cattrs['HostConfig']['Devices']: if cattrs['HostConfig']['Devices']:
values['devices'] = [x['PathOnHost']+':'+x['PathInContainer'] for x in cattrs['HostConfig']['Devices']] values['devices'] = [x['PathOnHost']+':'+x['PathInContainer'] for x in cattrs['HostConfig']['Devices']]
networks = {} networks = {}
if values['networks'] == set(): if values['networks'] == set():
del values['networks'] del values['networks']
assumed_default_network = list(cattrs['NetworkSettings']['Networks'].keys())[0]
values['network_mode'] = assumed_default_network
networks = None
else: else:
networklist = c.networks.list() networklist = c.networks.list()
for network in networklist: for network in networklist:
@@ -124,9 +145,12 @@ def generate(cname):
'name': network.attrs['Name']} 'name': network.attrs['Name']}
volumes = {} volumes = {}
for volume in values['volumes']: if values['volumes'] is not None:
volume_name = volume.split(':')[0] for volume in values['volumes']:
volumes[volume_name] = {'external': True} volume_name = volume.split(':')[0]
volumes[volume_name] = {'external': True}
else:
volumes = None
# Check for command and add it if present. # Check for command and add it if present.
if cattrs['Config']['Cmd'] is not None: if cattrs['Config']['Cmd'] is not None: