コード例 #1
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #2
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #3
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #4
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #5
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #6
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #7
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #8
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #9
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #10
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)
コード例 #11
0
ファイル: __init__.py プロジェクト: ariens/lifeguard
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)