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()
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)
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()
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)
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()
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)
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()
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)
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)