Ejemplo n.º 1
0
 def retire(self):
   one_proxy = OneProxy(self.pool.cluster.zone.xmlrpc_uri, self.pool.cluster.zone.session_string, verify_certs=False)
   vm = one_proxy.get_vm(self.vm_id)
   ip = vm.ip_address
   self.pool.cluster.zone.get_ddns_api().delete_ip_from_pool_record(self.pool, ip)
   one_proxy.kill_vm(self.vm_id)
   logging.info("removed ip address {} member of pool {}".format(ip, self.pool.name))
Ejemplo n.º 2
0
def expand(self, pool, pool_ticket, issue, cowboy_mode=False):
  new_vm_ids = []
  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)
      for a in t2.fields.attachment:
        pool_id, vm_name = a.filename.split('.', 2)[:2]
        template = a.get().decode(encoding="utf-8", errors="strict")
        vm_id = one_proxy.create_vm(template=template)
        new_vm_ids.append(vm_id)
        m = PoolMembership(pool=pool, vm_name=vm_name, vm_id=vm_id, template=a.get(), date_added=datetime.utcnow())
        Session.merge(m)
        Session.commit()
        self.log.msg("created new vm: {}".format(vm_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()
Ejemplo n.º 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()
Ejemplo n.º 4
0
 def retire(self):
     one_proxy = OneProxy(self.pool.cluster.zone.xmlrpc_uri,
                          self.pool.cluster.zone.session_string,
                          verify_certs=False)
     vm = one_proxy.get_vm(self.vm_id)
     ip = vm.ip_address
     self.pool.cluster.zone.get_ddns_api().delete_ip_from_pool_record(
         self.pool, ip)
     one_proxy.kill_vm(self.vm_id)
     logging.info("removed ip address {} member of pool {}".format(
         ip, self.pool.name))
Ejemplo n.º 5
0
 def get_memberships(self, fetch_vms=True, vm_cache=None):
   """
   Get the PoolMembership objects that are associated with the pool
   :param fetch_vms: If true, the vm attribute will be populated (incurs potentially
   timely call to the ONE api
   :return:
   """
   memberships =  PoolMembership.query.filter_by(pool=self).all()
   if fetch_vms:
     one_proxy = OneProxy(self.cluster.zone.xmlrpc_uri, self.cluster.zone.session_string, verify_certs=False)
     if vm_cache is None:
       vm_cache = {vm.id: vm for vm in one_proxy.get_vms(INCLUDING_DONE)}
     for m in memberships:
       m.vm = vm_cache[m.vm_id]
   return memberships
Ejemplo n.º 6
0
def all_pools_and_members():
  """
  Gets all pools efficiently by caching VMs per zone
  :return: A array of pool, member_array tuples
  """
  a = []
  zone_vm_cache = {}
  for pool in Session.query(VirtualMachinePool).all():
    if not pool.cluster.zone.name in zone_vm_cache:
      logging.info("VM cache for zone {} doesn't exist...".format(pool.cluster.zone.name))
      one_proxy = OneProxy(pool.cluster.zone.xmlrpc_uri, pool.cluster.zone.session_string, verify_certs=False)
      zone_vm_cache[pool.cluster.zone.name] = {vm.id: vm for vm in one_proxy.get_vms(INCLUDING_DONE)}
      logging.info("VM cache for zone {} populated with {} entries".format(
        pool.cluster.zone.name, len(zone_vm_cache[pool.cluster.zone.name])))
    a.append((pool, pool.get_memberships(vm_cache=zone_vm_cache[pool.cluster.zone.name])))
  return a
Ejemplo n.º 7
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)
Ejemplo n.º 8
0
def vm_create(zone_number, cluster_id):
    zone = Zone.query.get(zone_number)
    cluster = Cluster.query.filter_by(zone=zone, id=cluster_id).first()
    pools = VirtualMachinePool.query.filter_by(cluster=cluster).all()
    vm_vars = {'hostname': None}
    vm_template = None
    form = CreateVmForm(request.form)
    if form.validate_on_submit():
        if request.form['action'] == 'cancel':
            flash('Cancelled creating VM in {}'.format(cluster.name),
                  category="info")
            return redirect(
                url_for('cluster_bp.view',
                        zone_number=zone.number,
                        cluster_id=cluster.id))
        try:
            for k, v in vm_vars.items():
                if request.form[k] is None or request.form[k] == '':
                    raise Exception('expected parameter {} is {}'.format(k, v))
                vm_vars[k] = request.form[k]
            vars = VarParser.parse_kv_strings_to_dict(zone.vars, cluster.vars,
                                                      vm_vars)
            one_proxy = OneProxy(zone.xmlrpc_uri,
                                 zone.session_string,
                                 verify_certs=False)
            env = Environment(loader=ObjectLoader())
            vm_template = env.from_string(cluster.template).render(
                cluster=cluster, vars=vars)
            issue = jira.instance.create_issue(
                project=app.config['JIRA_PROJECT'],
                summary='[auto] VM instantiated: {}'.format(vars['hostname']),
                description='Template: {}'.format(vm_template),
                customfield_13842=jira.get_datetime_now(),
                issuetype={'name': 'Task'})
            jira.resolve(issue)
            one_proxy.create_vm(template=vm_template)
            flash('Created VM: {}'.format(vars['hostname']))
        except Exception as e:
            flash("Error parsing GET parameters: {}".format(e),
                  category='danger')
    return render_template('cluster/vm_create.html',
                           form=form,
                           cluster=cluster,
                           pools=pools,
                           zone=zone,
                           vm_template=vm_template)
Ejemplo n.º 9
0
 def get_memberships(self, fetch_vms=True, vm_cache=None):
     """
 Get the PoolMembership objects that are associated with the pool
 :param fetch_vms: If true, the vm attribute will be populated (incurs potentially
 timely call to the ONE api
 :return:
 """
     memberships = PoolMembership.query.filter_by(pool=self).all()
     if fetch_vms:
         one_proxy = OneProxy(self.cluster.zone.xmlrpc_uri,
                              self.cluster.zone.session_string,
                              verify_certs=False)
         if vm_cache is None:
             vm_cache = {
                 vm.id: vm
                 for vm in one_proxy.get_vms(INCLUDING_DONE)
             }
         for m in memberships:
             m.vm = vm_cache[m.vm_id]
     return memberships
Ejemplo n.º 10
0
 def getOneProxy(self, zone):
     zone_override = 'zone-config-{}'.format(zone)
     ss_file = self.config['one']['default_ss_file']
     session_string = None
     if zone_override in self.config:
         if 'ss_file' in self.config[zone_override]:
             ss_file = self.config[zone_override]['ss_file']
     with open(ss_file) as fh:
         session_string = fh.read().strip()
     return OneProxy(self.config['zone-all'][zone], session_string,
                     self.verifyOneCerts())
Ejemplo n.º 11
0
def vm_create(zone_number, cluster_id):
  zone = Zone.query.get(zone_number)
  cluster = Cluster.query.filter_by(zone=zone, id=cluster_id).first()
  pools = VirtualMachinePool.query.filter_by(cluster=cluster).all()
  vm_vars = {'hostname': None}
  vm_template = None
  form = CreateVmForm(request.form)
  if form.validate_on_submit():
    if request.form['action'] == 'cancel':
      flash('Cancelled creating VM in {}'.format(cluster.name), category="info")
      return redirect(url_for('cluster_bp.view', zone_number=zone.number, cluster_id=cluster.id))
    try:
      for k, v in vm_vars.items():
        if request.form[k] is None or request.form[k] == '':
          raise Exception('expected parameter {} is {}'.format(k, v))
        vm_vars[k] = request.form[k]
      vars =  VarParser.parse_kv_strings_to_dict(
        zone.vars,
        cluster.vars,
        vm_vars)
      one_proxy = OneProxy(zone.xmlrpc_uri, zone.session_string, verify_certs=False)
      env = Environment(loader=ObjectLoader())
      vm_template = env.from_string(cluster.template).render(cluster=cluster, vars=vars)
      issue = jira.instance.create_issue(
        project=app.config['JIRA_PROJECT'],
        summary='[auto] VM instantiated: {}'.format(vars['hostname']),
        description='Template: {}'.format(vm_template),
        customfield_13842=jira.get_datetime_now(),
        issuetype={'name': 'Task'})
      jira.resolve(issue)
      one_proxy.create_vm(template=vm_template)
      flash('Created VM: {}'.format(vars['hostname']))
    except Exception as e:
      flash("Error parsing GET parameters: {}".format(e), category='danger')
  return render_template('cluster/vm_create.html',
                         form=form,
                         cluster=cluster,
                         pools=pools,
                         zone=zone,
                         vm_template=vm_template)
Ejemplo n.º 12
0
def discover(zone_number):
    zone = Zone.query.get(zone_number)
    clusters = Cluster.query.filter_by(zone=zone).all()
    one_proxy = OneProxy(zone.xmlrpc_uri,
                         zone.session_string,
                         verify_certs=False)
    one_clusters = one_proxy.get_clusters()
    for one_cluster in one_clusters:
        existing_cluster = Cluster.query.filter_by(zone_number=zone.number,
                                                   id=one_cluster.id).first()
        if existing_cluster is None:
            discovered_cluster = Cluster(id=one_cluster.id,
                                         zone=zone,
                                         name=one_cluster.name)
            Session.add(discovered_cluster)
            Session.commit()
            flash('Newly discovered ONE cluster: {} (ID={}) in zone {}'.format(
                one_cluster.id, one_cluster.name, zone.name),
                  category='success')
    return render_template('zone/discover.html',
                           zone=zone,
                           one_clusters=one_clusters,
                           clusters=clusters)
Ejemplo n.º 13
0
def assign_to_pool(zone_number, cluster_id):
  vms = []
  id_to_vm = {}
  selected_vm_ids = {}
  pools = None
  zone = None
  cluster = None
  memberships = {}
  try:
    Session()
    zone = Zone.query.get(zone_number)
    cluster = Cluster.query.filter_by(zone=zone, id=cluster_id).first()
    one_proxy = OneProxy(zone.xmlrpc_uri, zone.session_string, verify_certs=False)
    for membership in PoolMembership.query.join(VirtualMachinePool).filter_by(cluster=cluster).all():
      memberships[membership.vm_id] = membership
    for vm in one_proxy.get_vms():
      if vm.disk_cluster.id == cluster.id:
        vms.append(vm)
        id_to_vm[vm.id] = vm
    pools = VirtualMachinePool.get_all(cluster)
  except Exception as e:
    # raise e
    flash("Error fetching VMs in zone number {}: {}"
          .format(zone.number, e), category='danger')
  form = ActionForm()
  active_tab = 'create_new_pool'
  # Form submission handling begins
  if form.validate_on_submit():
    # Determine which tab needs to be active based on the action
    if request.form['action'] is not None:
      print('something')
      active_tab = {
        'create new pool': 'create_new_pool',
        'add to pool': 'add_to_existing_pool'}[request.form['action']]
    # Get a list of clusters of all selected VMs--pools cannot span clusters
    selected_clusters = {}
    for id in request.form.getlist('chk_vm_id'):
      selected_vm_ids[int(id)] = id
      selected_clusters[id_to_vm[int(id)].disk_cluster.id] = True
    # Error checking begins
    proceed = True
    if len(selected_vm_ids) == 0:
      flash("No virtual machines were selected!", category='danger')
      proceed = False
    elif len(selected_clusters) != 1:
      flash("Selected VMs must all be in the same cluster", category='danger')
      proceed = False
    # Handle the appropriate action if able to proceed
    if proceed and request.form['action'] == 'add to pool':
      if (request.form['pool_id']) is None or request.form['pool_id'] == '':
        flash('No pool selected', category='danger')
      else:
        pool = VirtualMachinePool.query.get(request.form['pool_id'])
        for vm_id in selected_vm_ids.keys():
          Session.add(PoolMembership(pool=pool, vm_name=id_to_vm[vm_id].name, vm_id=vm_id, date_added=datetime.utcnow()))
          Session.commit()
        flash(Markup('Successfully added {} members to pool <a href="{}">{}</a>'.format(
          len(selected_vm_ids),
          url_for('vpool_bp.view', pool_id=pool.id),
          pool.name, )), category='success')
        return redirect(url_for('vpool_bp.assign_to_pool', zone_number=zone.number, cluster_id=cluster.id))
    if proceed and request.form['action'] == 'create new pool':
      try:
        if request.form['new_pool_name'] is None or request.form['new_pool_name'] == '':
          raise Exception('Pool name cannot be blank')
        pool = VirtualMachinePool(
          name=request.form['new_pool_name'],
          cluster=cluster,
          zone_number=zone.number,
          cardinality=len(selected_vm_ids))
        Session.add(pool)
        Session.flush()
        for vm_id in selected_vm_ids.keys():
          membership = PoolMembership(pool=pool, vm_name=id_to_vm[vm_id].name, vm_id=vm_id, date_added=datetime.utcnow())
          memberships[vm_id] = membership
          Session.add(membership)
        Session.flush()
        Session.commit()
        flash(Markup('Successfully created <a href="{}">{}</a> with {} pool members'.format(
          url_for('vpool_bp.view', pool_id=pool.id),
          pool.name, len(selected_vm_ids))), category='success')
      except Exception as e:
        Session.rollback()
        flash('Error creating your new pool: {}'.format(e), category='danger')
  return render_template(
    'vpool/assign_to_pool.html',
    form=form,
    zone=zone,
    cluster=cluster,
    vms=vms,
    memberships=memberships,
    selected_vm_ids=selected_vm_ids,
    pools=pools,
    active_tab_name=active_tab
  )
Ejemplo n.º 14
0
def assign_to_pool(zone_number, cluster_id):
    vms = []
    id_to_vm = {}
    selected_vm_ids = {}
    pools = None
    zone = None
    cluster = None
    memberships = {}
    try:
        Session()
        zone = Zone.query.get(zone_number)
        cluster = Cluster.query.filter_by(zone=zone, id=cluster_id).first()
        one_proxy = OneProxy(zone.xmlrpc_uri,
                             zone.session_string,
                             verify_certs=False)
        for membership in PoolMembership.query.join(
                VirtualMachinePool).filter_by(cluster=cluster).all():
            memberships[membership.vm_id] = membership
        for vm in one_proxy.get_vms():
            if vm.disk_cluster.id == cluster.id:
                vms.append(vm)
                id_to_vm[vm.id] = vm
        pools = VirtualMachinePool.get_all(cluster)
    except Exception as e:
        # raise e
        flash("Error fetching VMs in zone number {}: {}".format(
            zone.number, e),
              category='danger')
    form = ActionForm()
    active_tab = 'create_new_pool'
    # Form submission handling begins
    if form.validate_on_submit():
        # Determine which tab needs to be active based on the action
        if request.form['action'] is not None:
            print('something')
            active_tab = {
                'create new pool': 'create_new_pool',
                'add to pool': 'add_to_existing_pool'
            }[request.form['action']]
        # Get a list of clusters of all selected VMs--pools cannot span clusters
        selected_clusters = {}
        for id in request.form.getlist('chk_vm_id'):
            selected_vm_ids[int(id)] = id
            selected_clusters[id_to_vm[int(id)].disk_cluster.id] = True
        # Error checking begins
        proceed = True
        if len(selected_vm_ids) == 0:
            flash("No virtual machines were selected!", category='danger')
            proceed = False
        elif len(selected_clusters) != 1:
            flash("Selected VMs must all be in the same cluster",
                  category='danger')
            proceed = False
        # Handle the appropriate action if able to proceed
        if proceed and request.form['action'] == 'add to pool':
            if (request.form['pool_id']
                ) is None or request.form['pool_id'] == '':
                flash('No pool selected', category='danger')
            else:
                pool = VirtualMachinePool.query.get(request.form['pool_id'])
                for vm_id in selected_vm_ids.keys():
                    Session.add(
                        PoolMembership(pool=pool,
                                       vm_name=id_to_vm[vm_id].name,
                                       vm_id=vm_id,
                                       date_added=datetime.utcnow()))
                    Session.commit()
                flash(Markup(
                    'Successfully added {} members to pool <a href="{}">{}</a>'
                    .format(
                        len(selected_vm_ids),
                        url_for('vpool_bp.view', pool_id=pool.id),
                        pool.name,
                    )),
                      category='success')
                return redirect(
                    url_for('vpool_bp.assign_to_pool',
                            zone_number=zone.number,
                            cluster_id=cluster.id))
        if proceed and request.form['action'] == 'create new pool':
            try:
                if request.form['new_pool_name'] is None or request.form[
                        'new_pool_name'] == '':
                    raise Exception('Pool name cannot be blank')
                pool = VirtualMachinePool(name=request.form['new_pool_name'],
                                          cluster=cluster,
                                          zone_number=zone.number,
                                          cardinality=len(selected_vm_ids))
                Session.add(pool)
                Session.flush()
                for vm_id in selected_vm_ids.keys():
                    membership = PoolMembership(pool=pool,
                                                vm_name=id_to_vm[vm_id].name,
                                                vm_id=vm_id,
                                                date_added=datetime.utcnow())
                    memberships[vm_id] = membership
                    Session.add(membership)
                Session.flush()
                Session.commit()
                flash(Markup(
                    'Successfully created <a href="{}">{}</a> with {} pool members'
                    .format(url_for('vpool_bp.view', pool_id=pool.id),
                            pool.name, len(selected_vm_ids))),
                      category='success')
            except Exception as e:
                Session.rollback()
                flash('Error creating your new pool: {}'.format(e),
                      category='danger')
    return render_template('vpool/assign_to_pool.html',
                           form=form,
                           zone=zone,
                           cluster=cluster,
                           vms=vms,
                           memberships=memberships,
                           selected_vm_ids=selected_vm_ids,
                           pools=pools,
                           active_tab_name=active_tab)
Ejemplo n.º 15
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)