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)
def get_all(zone): return Session().query(PoolMembership).join( PoolMembership.pool, aliased=True).filter_by(zone=zone)
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)