示例#1
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)
示例#2
0
 def get_all(zone):
     return Session().query(PoolMembership).join(
         PoolMembership.pool, aliased=True).filter_by(zone=zone)
示例#3
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)