40 lines
1.9 KiB
Python
40 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Remove only temporary smoke-test resources labeled by this workflow attempt."""
|
|
|
|
import argparse
|
|
import subprocess
|
|
|
|
|
|
def cleanup(label, client=None, image=None):
|
|
if not label.startswith('io.rawmark.ci.run=') or not label.removeprefix('io.rawmark.ci.run='):
|
|
raise ValueError('Expected a nonempty RawMark CI run label')
|
|
def docker(*args):
|
|
return subprocess.check_output(['docker', *args], text=True).split()
|
|
for identifier in docker('ps', '-aq', '--filter', 'label=' + label):
|
|
docker('rm', '--force', '--volumes', identifier)
|
|
for identifier in docker('network', 'ls', '-q', '--filter', 'label=' + label):
|
|
if client:
|
|
# The client may already have been detached by normal test cleanup.
|
|
attached = subprocess.check_output(['docker', 'network', 'inspect', identifier,
|
|
'--format', '{{range .Containers}}{{.Name}} {{end}}'], text=True).split()
|
|
client_name = subprocess.check_output(['docker', 'inspect', client, '--format', '{{.Name}}'], text=True).strip().lstrip('/')
|
|
if client_name in attached:
|
|
docker('network', 'disconnect', identifier, client)
|
|
docker('network', 'rm', identifier)
|
|
for identifier in docker('volume', 'ls', '-q', '--filter', 'label=' + label):
|
|
docker('volume', 'rm', identifier)
|
|
if image:
|
|
if not image.startswith('rawmark-ci:'):
|
|
raise ValueError('Refusing to remove a deployment image tag')
|
|
if docker('image', 'ls', '-q', image):
|
|
docker('image', 'rm', image)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument('label')
|
|
parser.add_argument('--client-container')
|
|
parser.add_argument('--image')
|
|
args = parser.parse_args()
|
|
cleanup(args.label, args.client_container, args.image)
|