def delete(zone_number): zone = Zone.query.get(zone_number) clusters = Cluster.query.filter_by(zone=zone).all() form = ActionForm(request.form, zone=zone) if request.method == 'POST' and form.validate(): try: if request.form['action'] == 'Cancel': flash('Delete {} action cancelled'.format(zone.name), category='info') return redirect( url_for('zone_bp.view', zone_number=zone.number)) elif request.form['action'] == 'Confirm': Session.delete(zone) Session.commit() flash('{} has been deleted'.format(zone.name), category='success') return redirect(url_for('zone_bp.list')) except Exception as e: flash('There was an error deleting zone {}'.format(zone.name), category='success') return redirect(url_for('zone_bp.list')) return render_template('zone/delete.html', form=form, zone=zone, clusters=clusters)
def delete(pool_id): pool = None vms_by_id = {} form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) except Exception as e: flash("There was an error fetching pool_id={}: {}".format(pool_id, e), category='danger') if request.method == 'POST' and form.validate(): try: if request.form['action'] == 'cancel': flash('Delete {} action cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.form['action'] == 'confirm': redirect_url = url_for('cluster_bp.view', zone_number=pool.cluster.zone.number, cluster_id=pool.cluster.id) members = pool.get_memberships() for member in members: Session.delete(member) for ticket in pool.get_tickets(): logging.info("deleted ticket {}".format(ticket.ticket_key)) Session.delete(ticket) Session.delete(pool) Session.commit() flash('Deleted pool {} with {} members'.format(pool.name, len(members)), category='success') return redirect(url_for('cluster_bp.view', zone_number=pool.cluster.zone.number, cluster_id=pool.cluster.id)) except Exception as e: # raise e flash('There was an error deleting pool {}: {}'.format(pool.name, e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/delete.html', form=form, pool=pool, vms_by_id=vms_by_id)
def shrink(pool_id): pool = form_shrink_vm_ids = None form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) if request.method == 'POST' and request.form['action'] == 'cancel': flash('Shrink {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'shrink': form_shrink_vm_ids = [ int(id) for id in request.form.getlist('shrink_vm_ids') ] members = pool.get_memberships() shrink_members = pool.get_members_to_shrink(members, form_shrink_vm_ids) if shrink_members is None or len(shrink_members) == 0: raise Exception( "Cannot determine any members to shutdown for shrinking") except Exception as e: flash("There was an error determining memberships for shrinking: {}". format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate( ) and request.form['action'] == 'shrink': title = 'Plan Shrink => Pool {} ({} members to {})'.format( pool.name, len(members), pool.cardinality) description = "Pool shrink triggered that will shutdown {} VM(s): \n\n*{}".format( len(shrink_members), "\n*".join([m.vm.name for m in shrink_members])) task = Task(name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_shrink, pool=pool, shrink_members=shrink_members) task_thread.start() flash( Markup("Started background task {}: {}".format( task.name, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/shrink.html', form=form, pool=pool, shrink_members=shrink_members)
def remove_done(pool_id): form = ActionForm() pool = one_proxy = members = None try: pool = VirtualMachinePool.query.get(pool_id) members = pool.get_memberships() except Exception as e: flash("There was an error finshed VMs: {}".format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate(): try: if request.form['action'] == 'cancel': flash('Cleanup of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.form['action'] == 'confirm': vm_ids_to_delete = [int(id) for id in request.form.getlist('done_vm_ids')] delete_members = [] Session() for m in members: if m.vm.id in vm_ids_to_delete: delete_members.append(m) delete_ticket = jira.instance.create_issue( project=app.config['JIRA_PROJECT'], summary='[auto-{}] Pool Cleanup: {} (deleting {} done VMs)'.format( current_user.username, pool.name, len(vm_ids_to_delete)), description="Pool cleanup triggered that will delete {} VM(s): \n\n*{}".format( len(vm_ids_to_delete), "\n*".join(['ID {}: {} ({})'.format(m.vm.id, m.vm.name, m.vm.ip_address) for m in delete_members])), customfield_13842=jira.get_datetime_now(), issuetype={'name': 'Task'}) one_proxy = OneProxy(pool.cluster.zone.xmlrpc_uri, pool.cluster.zone.session_string, verify_certs=False) for m in delete_members: one_proxy.action_vm(m.remove_cmd(), m.vm.id) Session.delete(m) Session.commit() flash('Deleted {} done VMs to cleanup pool {}'.format(len(delete_members), pool.name)) jira.resolve(delete_ticket) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) except Exception as e: flash("Error performing cleanup of pool {}: {}".format(pool.name, e), category='danger') jira.defect_for_exception("Error during cleanup of pool {}".format(pool.name), e) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/remove_done.html', form=form, pool=pool, members=members)
def expand(pool_id): pool = members = expansion_names = form_expansion_names = None form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) if request.method == 'POST' and request.form['action'] == 'cancel': flash('Expansion of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'expand': form_expansion_names = request.form.getlist('expansion_names') members = pool.get_memberships() expansion_names = pool.get_expansion_names(members, form_expansion_names) except Exception as e: flash( "There was an error determining new names required for expansion: {}" .format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate( ) and request.form['action'] == 'expand': title = 'Plan Change => Pool Expansion: {} ({} members to {})'.format( pool.name, len(members), pool.cardinality) description = "Pool expansion triggered that will instantiate {} new VM(s): \n\n*{}".format( len(expansion_names), "\n*".join(expansion_names)) task = Task(name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_expansion, pool=pool, expansion_names=expansion_names) task_thread.start() flash( Markup("Started background task {}: {}".format( task.name, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/expand.html', form=form, members=members, pool=pool, expansion_names=expansion_names)
def delete(pool_id): pool = None vms_by_id = {} form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) except Exception as e: flash("There was an error fetching pool_id={}: {}".format(pool_id, e), category='danger') if request.method == 'POST' and form.validate(): try: if request.form['action'] == 'cancel': flash('Delete {} action cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.form['action'] == 'confirm': redirect_url = url_for('cluster_bp.view', zone_number=pool.cluster.zone.number, cluster_id=pool.cluster.id) members = pool.get_memberships() for member in members: Session.delete(member) for ticket in pool.get_tickets(): logging.info("deleted ticket {}".format(ticket.ticket_key)) Session.delete(ticket) Session.delete(pool) Session.commit() flash('Deleted pool {} with {} members'.format( pool.name, len(members)), category='success') return redirect( url_for('cluster_bp.view', zone_number=pool.cluster.zone.number, cluster_id=pool.cluster.id)) except Exception as e: # raise e flash('There was an error deleting pool {}: {}'.format( pool.name, e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/delete.html', form=form, pool=pool, vms_by_id=vms_by_id)
def shrink(pool_id): pool = form_shrink_vm_ids = None form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) if request.method == 'POST' and request.form['action'] == 'cancel': flash('Shrink {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'shrink': form_shrink_vm_ids = [int(id) for id in request.form.getlist('shrink_vm_ids')] members = pool.get_memberships() shrink_members = pool.get_members_to_shrink(members, form_shrink_vm_ids) if shrink_members is None or len(shrink_members) == 0: raise Exception("Cannot determine any members to shutdown for shrinking") except Exception as e: flash("There was an error determining memberships for shrinking: {}".format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate() and request.form['action'] == 'shrink': title = 'Plan Shrink => Pool {} ({} members to {})'.format(pool.name, len(members), pool.cardinality) description = "Pool shrink triggered that will shutdown {} VM(s): \n\n*{}".format( len(shrink_members), "\n*".join([m.vm.name for m in shrink_members])) task = Task( name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_shrink, pool=pool, shrink_members=shrink_members) task_thread.start() flash(Markup("Started background task {}: {}".format(task.name, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/shrink.html', form=form, pool=pool, shrink_members=shrink_members)
def update(pool_id): form = ActionForm() pool = VirtualMachinePool.query.get(pool_id) form_update_ids = None if request.method == 'POST' and request.form['action'] == 'cancel': flash('Update of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'update': form_update_ids = request.form.getlist('update_ids') members = pool.get_memberships() update_ids = pool.get_update_ids(members, form_update_ids) if request.method == 'POST' and form.validate( ) and request.form['action'] == 'update': id_to_template = {} for m in members: if m.vm.id in update_ids: id_to_template[m.vm.id] = m.current_template() title = "Plan Change => Update {} member(s) in pool {}".format( len(update_ids), pool.name) description = "The attached templates will replace the VMs identified in their filename (based on VM ID)" task = Task(name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_update, pool=pool, id_to_template=id_to_template) task_thread.start() flash( Markup("Started background task {}: {}".format(title, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/update.html', form=form, pool=pool, members=members, update_ids=update_ids)
def expand(pool_id): pool = members = expansion_names = form_expansion_names = None form = ActionForm() try: pool = VirtualMachinePool.query.get(pool_id) if request.method == 'POST' and request.form['action'] == 'cancel': flash('Expansion of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'expand': form_expansion_names = request.form.getlist('expansion_names') members = pool.get_memberships() expansion_names = pool.get_expansion_names(members, form_expansion_names) except Exception as e: flash("There was an error determining new names required for expansion: {}".format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate() and request.form['action'] == 'expand': title = 'Plan Change => Pool Expansion: {} ({} members to {})'.format(pool.name, len(members), pool.cardinality) description = "Pool expansion triggered that will instantiate {} new VM(s): \n\n*{}".format( len(expansion_names), "\n*".join(expansion_names)) task = Task( name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_expansion, pool=pool, expansion_names=expansion_names) task_thread.start() flash(Markup("Started background task {}: {}".format(task.name, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/expand.html', form=form, members=members, pool=pool, expansion_names=expansion_names)
def update(pool_id): form = ActionForm() pool = VirtualMachinePool.query.get(pool_id) form_update_ids = None if request.method == 'POST' and request.form['action'] == 'cancel': flash('Update of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.method == 'POST' and request.form['action'] == 'update': form_update_ids = request.form.getlist('update_ids') members = pool.get_memberships() update_ids = pool.get_update_ids(members, form_update_ids) if request.method == 'POST' and form.validate() and request.form['action'] == 'update': id_to_template = {} for m in members: if m.vm.id in update_ids: id_to_template[m.vm.id] = m.current_template() title = "Plan Change => Update {} member(s) in pool {}".format(len(update_ids), pool.name) description = "The attached templates will replace the VMs identified in their filename (based on VM ID)" task = Task(name=title, description="{}\n{}".format(title, description), username=current_user.username) Session.add(task) Session.commit() task_thread = TaskThread(task_id=task.id, run_function=plan_update, pool=pool, id_to_template=id_to_template) task_thread.start() flash(Markup("Started background task {}: {}".format(title, task.link()))) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/update.html', form=form, pool=pool, members=members, update_ids=update_ids)
def remove_done(pool_id): form = ActionForm() pool = one_proxy = members = None try: pool = VirtualMachinePool.query.get(pool_id) members = pool.get_memberships() except Exception as e: flash("There was an error finshed VMs: {}".format(e), category='danger') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) if request.method == 'POST' and form.validate(): try: if request.form['action'] == 'cancel': flash('Cleanup of {} cancelled'.format(pool.name), category='info') return redirect(url_for('vpool_bp.view', pool_id=pool.id)) elif request.form['action'] == 'confirm': vm_ids_to_delete = [ int(id) for id in request.form.getlist('done_vm_ids') ] delete_members = [] Session() for m in members: if m.vm.id in vm_ids_to_delete: delete_members.append(m) delete_ticket = jira.instance.create_issue( project=app.config['JIRA_PROJECT'], summary='[auto-{}] Pool Cleanup: {} (deleting {} done VMs)' .format(current_user.username, pool.name, len(vm_ids_to_delete)), description= "Pool cleanup triggered that will delete {} VM(s): \n\n*{}" .format( len(vm_ids_to_delete), "\n*".join([ 'ID {}: {} ({})'.format(m.vm.id, m.vm.name, m.vm.ip_address) for m in delete_members ])), customfield_13842=jira.get_datetime_now(), issuetype={'name': 'Task'}) one_proxy = OneProxy(pool.cluster.zone.xmlrpc_uri, pool.cluster.zone.session_string, verify_certs=False) for m in delete_members: one_proxy.action_vm(m.remove_cmd(), m.vm.id) Session.delete(m) Session.commit() flash('Deleted {} done VMs to cleanup pool {}'.format( len(delete_members), pool.name)) jira.resolve(delete_ticket) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) except Exception as e: flash("Error performing cleanup of pool {}: {}".format( pool.name, e), category='danger') jira.defect_for_exception( "Error during cleanup of pool {}".format(pool.name), e) return redirect(url_for('vpool_bp.view', pool_id=pool.id)) return render_template('vpool/remove_done.html', form=form, pool=pool, members=members)