Beispiel #1
0
def shrink(self, pool, pool_ticket, issue, cowboy_mode=False):
  pool = Session.merge(pool)
  pool_ticket = Session.merge(pool_ticket)
  self.task = Session.merge(self.task)
  try:
    c_start = JiraApi.get_now()
    jira.start_crq(issue, log=self.log, cowboy_mode=cowboy_mode)
    for t in issue.fields.subtasks:
      t_start = JiraApi.get_now()
      t2 = jira.instance.issue(t.key)
      jira.start_task(t2, log=self.log, cowboy_mode=cowboy_mode)
      for a in t2.fields.attachment:
        pool_id, vm_id = a.filename.split('.', 2)[:2]
        member = PoolMembership.query.filter_by(pool=pool, vm_id=vm_id).first()
        member.retire()
        Session.delete(member)
        Session.commit()
        self.log.msg("Retired VM {} and removed it as member of pool {}".format(member.vm_id, pool.name))
      jira.complete_task(t, start_time=t_start, log=self.log, cowboy_mode=cowboy_mode)
    self.log.msg("waiting for 120 seconds before running post task diagnostics")
    time.sleep(120)
    run_diagnostics_on_pool(pool, self.log)
    jira.complete_crq(issue, start_time=c_start, log=self.log, cowboy_mode=cowboy_mode)
  except Exception as e:
    self.log.err("Error occured: {}".format(e))
    jira.cancel_crq_and_tasks(issue, comment="an exception occured running this change: {}".format(e))
    raise e
  finally:
    pool_ticket.done = True
    Session.merge(pool_ticket)
    Session.commit()
Beispiel #2
0
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)
Beispiel #3
0
def update(self, pool, pool_ticket, issue, cowboy_mode=False):
    pool = Session.merge(pool)
    pool_ticket = Session.merge(pool_ticket)
    self.task = Session.merge(self.task)
    one_proxy = OneProxy(pool.cluster.zone.xmlrpc_uri,
                         pool.cluster.zone.session_string,
                         verify_certs=False)
    try:
        c_start = JiraApi.get_now()
        jira.start_crq(issue, log=self.log, cowboy_mode=cowboy_mode)
        for t in issue.fields.subtasks:
            t_start = JiraApi.get_now()
            t2 = jira.instance.issue(t.key)
            jira.start_task(t2, log=self.log, cowboy_mode=cowboy_mode)
            updated_members = []
            for a in t2.fields.attachment:
                pool_id, vm_id = a.filename.split('.', 2)[:2]
                template = a.get().decode(encoding="utf-8", errors="strict")
                member = PoolMembership.query.filter_by(pool=pool,
                                                        vm_id=vm_id).first()
                vm_name = member.vm_name
                member.retire()
                Session.delete(member)
                Session.commit()
                new_id = one_proxy.create_vm(template=template)
                new_member = PoolMembership(pool=pool,
                                            vm_name=vm_name,
                                            vm_id=new_id,
                                            template=template,
                                            date_added=datetime.utcnow())
                Session.add(new_member)
                Session.commit()
                self.log.msg(
                    "Instantiated new VM ID {} and added as member of pool {}".
                    format(new_member.vm_id, pool.name))
                updated_members.append(new_member)
            self.log.msg(
                "waiting for 120 seconds before running post change diagnostics"
            )
            time.sleep(120)
            run_diagnostics_on_pool(pool, self.log)
            jira.complete_task(t,
                               start_time=t_start,
                               log=self.log,
                               cowboy_mode=cowboy_mode)
        jira.complete_crq(issue,
                          start_time=c_start,
                          log=self.log,
                          cowboy_mode=cowboy_mode)
    except Exception as e:
        self.log.err("Error occured: {}".format(e))
        jira.cancel_crq_and_tasks(
            issue,
            comment="an exception occured running this change: {}".format(e))
        raise e
    finally:
        pool_ticket.done = True
        Session.merge(pool_ticket)
        Session.commit()
Beispiel #4
0
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)
Beispiel #5
0
def shrink(self, pool, pool_ticket, issue, cowboy_mode=False):
    pool = Session.merge(pool)
    pool_ticket = Session.merge(pool_ticket)
    self.task = Session.merge(self.task)
    try:
        c_start = JiraApi.get_now()
        jira.start_crq(issue, log=self.log, cowboy_mode=cowboy_mode)
        for t in issue.fields.subtasks:
            t_start = JiraApi.get_now()
            t2 = jira.instance.issue(t.key)
            jira.start_task(t2, log=self.log, cowboy_mode=cowboy_mode)
            for a in t2.fields.attachment:
                pool_id, vm_id = a.filename.split('.', 2)[:2]
                member = PoolMembership.query.filter_by(pool=pool,
                                                        vm_id=vm_id).first()
                member.retire()
                Session.delete(member)
                Session.commit()
                self.log.msg(
                    "Retired VM {} and removed it as member of pool {}".format(
                        member.vm_id, pool.name))
            jira.complete_task(t,
                               start_time=t_start,
                               log=self.log,
                               cowboy_mode=cowboy_mode)
        self.log.msg(
            "waiting for 120 seconds before running post task diagnostics")
        time.sleep(120)
        run_diagnostics_on_pool(pool, self.log)
        jira.complete_crq(issue,
                          start_time=c_start,
                          log=self.log,
                          cowboy_mode=cowboy_mode)
    except Exception as e:
        self.log.err("Error occured: {}".format(e))
        jira.cancel_crq_and_tasks(
            issue,
            comment="an exception occured running this change: {}".format(e))
        raise e
    finally:
        pool_ticket.done = True
        Session.merge(pool_ticket)
        Session.commit()
Beispiel #6
0
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)
Beispiel #7
0
def update(self, pool, pool_ticket, issue, cowboy_mode=False):
  pool = Session.merge(pool)
  pool_ticket = Session.merge(pool_ticket)
  self.task = Session.merge(self.task)
  one_proxy = OneProxy(pool.cluster.zone.xmlrpc_uri, pool.cluster.zone.session_string, verify_certs=False)
  try:
    c_start = JiraApi.get_now()
    jira.start_crq(issue, log=self.log, cowboy_mode=cowboy_mode)
    for t in issue.fields.subtasks:
      t_start = JiraApi.get_now()
      t2 = jira.instance.issue(t.key)
      jira.start_task(t2, log=self.log, cowboy_mode=cowboy_mode)
      updated_members = []
      for a in t2.fields.attachment:
        pool_id, vm_id = a.filename.split('.', 2)[:2]
        template = a.get().decode(encoding="utf-8", errors="strict")
        member = PoolMembership.query.filter_by(pool=pool, vm_id=vm_id).first()
        vm_name = member.vm_name
        member.retire()
        Session.delete(member)
        Session.commit()
        new_id = one_proxy.create_vm(template=template)
        new_member = PoolMembership(pool=pool, vm_name=vm_name, vm_id=new_id, template=template, date_added=datetime.utcnow())
        Session.add(new_member)
        Session.commit()
        self.log.msg("Instantiated new VM ID {} and added as member of pool {}".format(new_member.vm_id, pool.name))
        updated_members.append(new_member)
      self.log.msg("waiting for 120 seconds before running post change diagnostics")
      time.sleep(120)
      run_diagnostics_on_pool(pool, self.log)
      jira.complete_task(t, start_time=t_start, log=self.log, cowboy_mode=cowboy_mode)
    jira.complete_crq(issue, start_time=c_start, log=self.log, cowboy_mode=cowboy_mode)
  except Exception as e:
    self.log.err("Error occured: {}".format(e))
    jira.cancel_crq_and_tasks(issue, comment="an exception occured running this change: {}".format(e))
    raise e
  finally:
    pool_ticket.done = True
    Session.merge(pool_ticket)
    Session.commit()
Beispiel #8
0
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)
Beispiel #9
0
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)