stx cleanup: new sub-command

Add new subcommand to stx tool:

  stx cleanup [--force][--dry-run] [docker|minikube]

It runs "docker system prune --volumes" in the builder docker instance,
or in the minikube's docker instance, or both (default).

Partial-Bug: 2020807
Signed-off-by: Davlet Panech <davlet.panech@windriver.com>
Change-Id: I35a7a439e6a52455111e5bc3fff1e9377a407085
This commit is contained in:
Davlet Panech 2023-09-18 14:57:07 -04:00
parent d5c34cee4e
commit 5188f106a0
3 changed files with 144 additions and 1 deletions

View File

@ -64,7 +64,7 @@ class Config:
"""Construct an empty instance; must call "load" explicitly before using"""
self.prjdir = require_env('PRJDIR')
self.config_filename = os.path.join(self.prjdir, 'stx.conf')
self.use_minikube = os.getenv('STX_PLATFORM', 'minikube') == 'minikube'
self._use_minikube = os.getenv('STX_PLATFORM', 'minikube') == 'minikube'
if self.use_minikube:
self.minikube_profile = require_env('MINIKUBENAME')
else:
@ -74,6 +74,7 @@ class Config:
self.docker_tag = require_env('DOCKER_TAG_LOCAL')
self.kubectl_cmd = None
self.helm_cmd = None
self.minikube_docker_cmd = None
reg_list_str = os.getenv('STX_INSECURE_DOCKER_REGISTRIES')
if reg_list_str:
@ -115,6 +116,15 @@ class Config:
def all_container_names(self):
return ALL_CONTAINER_NAMES + []
def require_minikube(self):
if not self.use_minikube:
raise RuntimeError("minikube not in use")
def minikube_docker(self):
"""Returns the command for docker cli connected to minikube's built-in docker demon"""
self.require_minikube()
return self.minikube_docker_cmd
@property
def insecure_docker_reg_list(self):
"""List of insecure docker registries we are allowed to access"""
@ -129,6 +139,10 @@ class Config:
def project_name(self):
return self.get('project', 'name')
@property
def use_minikube(self):
return self._use_minikube
def _init_kubectl_cmd(self):
# helm
if self.use_minikube:
@ -144,3 +158,6 @@ class Config:
if self.k8s_namespace:
self.kubectl_cmd += f' -n {self.k8s_namespace}'
self.helm_cmd += f' -n {self.k8s_namespace}'
# minikube_docker
if self.use_minikube:
self.minikube_docker_cmd = f'eval `minikube -p {self.minikube_profile} docker-env` && docker'

121
stx/lib/stx/stx_cleanup.py Normal file
View File

@ -0,0 +1,121 @@
# Copyright (c) 2021 Wind River Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from stx import k8s
from stx import utils
import subprocess
import traceback
logger = logging.getLogger('STX-Cleanup')
utils.set_logger(logger)
class HandleCleanupTask:
def __init__(self, config, shell):
self.config = config
self.k8s = k8s.KubeHelper(config)
self.shell = shell
self.logger = logger
def cleanup_docker(self, args):
self.logger.info("Cleaning up docker")
cmd = "docker system prune --volumes"
if args.force:
cmd += " --force"
shell_cmd = self.shell.create_shell_command('docker', cmd, no_tty=False)
if not args.dry_run:
self.logger.debug('Running command: %s', shell_cmd)
subprocess.run(shell_cmd, shell=True, check=True)
else:
self.logger.debug('Would run command: %s', shell_cmd)
def cleanup_minikube(self, args):
self.logger.info("Cleaning up minikube docker")
cmd = self.config.minikube_docker() + " system prune --volumes"
if args.force:
cmd += " --force"
shell_cmd = cmd
if not args.dry_run:
self.logger.debug('Running command: %s', shell_cmd)
subprocess.run(shell_cmd, shell=True, check=True)
else:
self.logger.debug('Would run command: %s', shell_cmd)
def cleanup_default(self, args):
failed = False
# cleanup docker pod
try:
if self.__container_is_running('docker'):
self.cleanup_docker(args)
else:
self.logger.info('docker container not running, skipping clean up')
except subprocess.CalledProcessError:
traceback.print_exc()
failed = True
# cleanup minikube's docker
try:
if self.config.use_minikube:
self.cleanup_minikube(args)
else:
self.logger.info('minikube not in use, skipping minikube clean up')
except subprocess.CalledProcessError:
traceback.print_exc()
failed = True
# multiple errors
if failed:
raise RuntimeError("one or more cleanup commands failed")
def __container_is_running(self, name):
return bool(self.k8s.get_pod_name(name))
def __add_common_args(self, p):
p.add_argument(
'-f', '--force', help="Don't prompt for confirmation",
action='store_const', const=True)
p.add_argument(
'-n', '--dry-run', help="Log shell commands without executing them",
action='store_const', const=True)
def add_parser(self, subparsers):
# stx cleanup
cleanup_parser = subparsers.add_parser(
'cleanup',
help='Cleanup various things',
usage='stx cleanup [--force] [--dry-run] [docker|minikube]',
epilog='With no arguments clean everything'
)
self.__add_common_args(cleanup_parser)
cleanup_parser.set_defaults(handle=self.cleanup_default)
cleanup_subparsers = cleanup_parser.add_subparsers()
# stx cleanup docker
cleanup_docker_parser = cleanup_subparsers.add_parser(
'docker',
help='Delete cache & orphans in builder docker demon')
self.__add_common_args(cleanup_docker_parser)
cleanup_docker_parser.set_defaults(handle=self.cleanup_docker)
# stx cleanup minikube
cleanup_minikube_parser = cleanup_subparsers.add_parser(
'minikube',
help='Delete cache & orphans in minikube\'s docker demon')
self.__add_common_args(cleanup_minikube_parser)
cleanup_minikube_parser.set_defaults(handle=self.cleanup_minikube)

View File

@ -17,6 +17,7 @@ import logging
from stx import config
from stx import stx_build # pylint: disable=E0611
from stx import stx_cleanup # pylint: disable=E0611
from stx import stx_configparser # pylint: disable=E0611
from stx import stx_control # pylint: disable=E0611
from stx import stx_repomgr # pylint: disable=E0611
@ -41,6 +42,7 @@ class CommandLine:
self.handlebuild = stx_build.HandleBuildTask(self.config)
self.handlerepomgr = stx_repomgr.HandleRepomgrTask(self.config)
self.handleshell = stx_shell.HandleShellTask(self.config)
self.handlecleanup = stx_cleanup.HandleCleanupTask(self.config, self.handleshell)
self.parser = self.parseCommandLine()
def parseCommandLine(self):
@ -172,6 +174,9 @@ remove_repo|search_pkg|upload_pkg|delete_pkg ]')
help='Container name (default: builder)')
shell_subparser.set_defaults(handle=self.handleshell.cmd_shell)
# stx cleanup
self.handlecleanup.add_parser(subparsers)
# common args
parser.add_argument('-d', '--debug',
help='Enable debug output\n\n',