Source code for koris.cli

"""
cli.py
======

misc functions to interact with the cluster, usually called from
other classes.

Don't use directly
"""
import asyncio

from cinderclient.exceptions import BadRequest, NotFound

from koris.cloud.openstack import OSClusterInfo, LoadBalancer
from .util.hue import que, bold  # pylint: disable=no-name-in-module
from .util.util import get_kubeconfig_yaml
from .util.logger import Logger


LOGGER = Logger(__name__)


[docs]def confirm(force): """Asks the user for confirmation.""" if not force: ans = input(que(bold("Are you sure? [y/N]: "))) else: ans = 'y' return ans.lower()
[docs]def write_kubeconfig(cluster_name, lb_ip, lb_port, ca_cert, client_cert, client_key): """Write a kubeconfig file to the filesystem""" path = None master_uri = "https://" + lb_ip + ":" + lb_port username = "admin" kubeconfig = get_kubeconfig_yaml(master_uri, ca_cert, username, client_cert, client_key) path = '-'.join((cluster_name, 'admin.conf')) LOGGER.success("You can use your config with:") LOGGER.success("kubectl get nodes --kubeconfig=%s" % path) with open(path, "w") as fh: fh.write(kubeconfig) return path
# pylint: disable=too-many-locals
[docs]def remove_cluster(config, nova, neutron, cinder, conn): """Delete a cluster from OpenStack""" cluster_info = OSClusterInfo(nova, neutron, cinder, config, conn) masters = cluster_info.get_instances("node") workers = cluster_info.get_instances("master") tasks = [host.delete(neutron) for host in masters if host] tasks += [host.delete(neutron) for host in workers if host] if tasks: LOGGER.debug("Deleting Instances ...") loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) loop.close() LoadBalancer(config, conn).delete() sg_name = '%s-sec-group' % config['cluster-name'] secg = conn.list_security_groups({"name": sg_name}) if secg: LOGGER.debug("Deleting SecurityGroup %s ...", sg_name) for sg in secg: for rule in sg.security_group_rules: conn.delete_security_group_rule(rule['id']) for port in conn.list_ports(): if sg.id in port.security_groups: conn.delete_port(port.id) conn.delete_security_group(sg_name) # This needs to be replaced with OpenStackAPI in the future for vol in cinder.volumes.list(): try: if config['cluster-name'] in vol.name and vol.status != 'in-use': try: vol.delete() except (BadRequest, NotFound): pass except TypeError: continue # delete the cluster key pair conn.delete_keypair(config['cluster-name'])