Source code for backend.vm_manage.terminate
# coding: utf-8
import json
import os
import time
from backend.ans_utils import ans_extra_vars_encode, run_ansible_playbook_cli
from backend.exceptions import CoprSpawnFailError
from backend.helpers import get_redis_connection
from backend.vm_manage import EventTopics, PUBSUB_MB
from backend.vm_manage.executor import Executor
from ..helpers import get_redis_logger
[docs]def terminate_vm(opts, terminate_playbook, group, vm_name, vm_ip):
"""
Call the terminate playbook to destroy the instance
"""
log = get_redis_logger(opts, "terminator.detached", "terminator")
term_args = {"ip": vm_ip, "vm_name": vm_name}
args = "-c ssh {} {}".format(
# self.vm_ip,
terminate_playbook,
ans_extra_vars_encode(term_args, "copr_task"))
result = {
"vm_ip": vm_ip,
"vm_name": vm_name,
"group": group,
"topic": EventTopics.VM_TERMINATED,
"result": "OK"
}
start_time = time.time()
try:
log.info("starting terminate vm with args: {}".format(term_args))
run_ansible_playbook_cli(args, "terminate instance", log)
result["result"] = "OK"
except Exception as error:
result["result"] = "failed"
msg = "Failed to terminate an instance: vm_name={}, vm_ip={}, error: {}".format(vm_name, vm_ip, error)
result["msg"] = msg
log.exception(msg)
try:
log.info("VM terminated {}, time elapsed: {} ".format(term_args, time.time() - start_time))
rc = get_redis_connection(opts)
rc.publish(PUBSUB_MB, json.dumps(result))
except Exception as error:
log.exception("Failed to publish msg about new VM: {} with error: {}".format(result, error))
[docs]class Terminator(Executor):
__name_for_log__ = "terminator"
__who_for_log__ = "terminator"
[docs] def terminate_vm(self, vm_ip, vm_name, group):
self.recycle()
try:
terminate_playbook = self.opts.build_groups[int(group)]["terminate_playbook"]
except KeyError:
msg = "Config missing termination playbook for group: {}".format(group)
raise CoprSpawnFailError(msg)
if terminate_playbook is None:
msg = "Missing terminate playbook for group: {} for unknown reason".format(group)
raise CoprSpawnFailError(msg)
if not os.path.exists(terminate_playbook):
msg = "Termination playbook {} is missing".format(terminate_playbook)
raise CoprSpawnFailError(msg)
self.log.info("received VM ip: {}, name: {} for termination".format(vm_ip, vm_name))
self.run_detached(terminate_vm, args=(self.opts, terminate_playbook, group, vm_name, vm_ip))