def run(args): active_job_id = str(args.active_job_id) try: rep_handler = ReplicationHandler() rep_handler.kill_job_processes(active_job_id) print("replication job processes has been killed.") sys.exit(0) except: sys.exit(-1)
def run_replication_job(args): job_id = args.job_id replication_handler = ReplicationHandler() try: replication_handler.run_replication_job(job_id) sys.exit(0) except Exception as e: manage_replication_jobs = ManageReplicationJobs() system_date_time = str(datetime.datetime.now()).split('.')[0] text = "{} - Job {} | Error : {}.".format(system_date_time, str(job_id), e.message) manage_replication_jobs.log_replication_job(job_id, text) sys.exit(-1)
def update_replication_info(args): disk_id = args.disk_id try: src_disk_id = args.src_disk_id src_disk_name = args.src_disk_name src_cluster_name = args.src_cluster_name src_cluster_fsid = args.src_cluster_fsid dest_disk_id = args.dest_disk_id dest_disk_name = args.dest_disk_name dest_cluster_name = args.dest_cluster_name dest_cluster_ip = args.dest_cluster_ip dest_cluster_fsid = args.dest_cluster_fsid new_replication_info = { 'src_disk_id': src_disk_id, 'src_disk_name': src_disk_name, 'src_cluster_fsid': src_cluster_fsid, 'src_cluster_name': src_cluster_name, 'dest_disk_id': dest_disk_id, 'dest_disk_name': dest_disk_name, 'dest_cluster_name': dest_cluster_name, 'dest_cluster_ip': dest_cluster_ip, 'dest_cluster_fsid': dest_cluster_fsid } ceph_api = CephAPI() disks_metadata = ceph_api.get_diskmeta(disk_id) replication_handler = ReplicationHandler() confirm = replication_handler.update_replication_info( disks_metadata, new_replication_info) if not confirm: print( "Error : Cannot update replication info on destination disk " + disk_id) sys.exit(-1) sys.exit(0) except Exception as e: print("Error : Cannot update replication info on destination disk " + disk_id + " , Exception , {}".format(e.message)) sys.exit(-1)
def cancel_job(job_id): """ DOCSTRING : this function is called to stop a certain active replication job from completing execution . Args : job_id (string) Returns : redirect to the page : 'admin/replication/job_list.html' """ if request.method == 'POST': try: rep_handler = ReplicationHandler() result = rep_handler.force_cancel_active_job(job_id) if result: session['success'] = "ui_admin_success_deleting_active_job" else: session['err'] = "ui_admin_error_deleting_active_job" except Exception as e: logger.error(e) session['err'] = "ui_admin_error_deleting_active_job" return redirect(url_for('replication_controller.job_list'))
def delete_replication_info(args): disk_id = args.disk_id try: ceph_api = CephAPI() disks_metadata = ceph_api.get_diskmeta(disk_id) replication_handler = ReplicationHandler() confirm = replication_handler.delete_replication_info(disks_metadata) if not confirm: print( "Error : Cannot delete replication info on destination disk " + disk_id) sys.exit(-1) sys.exit(0) except Exception as e: print("Error : Cannot delete replication info on destination disk " + disk_id + " , Exception , {}".format(e.message)) sys.exit(-1)
def edit_job(job_id): """ DOCSTRING : this function is called when submit the Edit replication job form page. Args : None Returns : render to the template page : 'admin/replication/job_list.html' """ if request.method == 'GET' or request.method == 'POST': mesg_err = "" mesg_success = "" mesg_warning = "" try: local_replication = ReplicationHandler() remote_replication = ManageRemoteReplication() manage_replication = ManageReplicationJobs() replication_job = get_selected_Job_info(job_id) old_node = replication_job.node_name job_name = request.form['job_name'] schedule = str((request.form['schedule_object'])) schedule_object = eval(schedule) backup_node = request.form['backup_node'] source_cluster_name = request.form['source_cluster'] dest_cluster_name = request.form['dest_cluster_name'] rep_compression_mode = request.form['rep_compression_mode'] if rep_compression_mode == 'enabled': rep_compression_algorithm = request.form[ 'rep_compression_algorithm'] replication_job.compression_algorithm = rep_compression_algorithm if rep_compression_mode == 'disabled': replication_job.compression_algorithm = "" pre_snap_script = request.form['pre_snap_script'] post_snap_script = request.form['post_snap_script'] post_job_complete = request.form['post_job_complete'] remote_replication.disk_id = replication_job.destination_disk_id remote_replication.cluster_name = dest_cluster_name replication_job.job_name = job_name replication_job.schedule = schedule_object replication_job.node_name = backup_node replication_job.source_cluster_name = source_cluster_name replication_job.destination_cluster_name = dest_cluster_name replication_job.pre_snap_url = pre_snap_script replication_job.post_snap_url = post_snap_script replication_job.post_job_complete = post_job_complete # update src and dest disk meta.replication_info. manage_destination_cluster = ManageDestinationCluster() manage_replication.edit_replication_job(replication_job, old_node) session['success'] = "ui_admin_edit_job_success" return redirect(url_for('replication_controller.job_list')) except ReplicationException as e: logger.error(e) if e.id == ReplicationException.CONNECTION_REFUSED: session['err'] = "ui_admin_add_job_connction_refused_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.CONNECTION_TIMEOUT: session['err'] = "ui_admin_add_job_connction_timeout_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.DUPLICATE_NAME: session['err'] = "ui_admin_add_job_duplicate_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.PERMISSION_DENIED: session['err'] = "Permission Denied." return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.GENERAL_EXCEPTION: session['err'] = "core_consul_exception_cant_edit_rep_job" return redirect(url_for('replication_controller.add_job')) except Exception as e: logger.error(e) session['err'] = "ui_admin_edit_job_error" return redirect(url_for('replication_controller.view_job'))
def save_job(): """ DOCSTRING : this function is called at saving a new replication job , if saving operation is succeeded it renders to the template page : 'admin/replication/job_list.html' with a success message , and if not it redirects to : 'admin/replication/add_replication_job.html' with an error message ... Args : None Returns : in success , it renders to : 'admin/replication/job_list.html' with a success message in failure , it redirects to : 'admin/replication/add_replication_job.html' """ if request.method == 'GET' or request.method == 'POST': mesg_err = "" mesg_success = "" mesg_warning = "" try: replication_job = ReplicationJob() local_replication = ReplicationHandler() remote_replication = ManageRemoteReplication() manage_replication = ManageReplicationJobs() # get replication job from html form. job_name = request.form['job_name'] schedule_object = json.loads(request.form['schedule_object']) backup_node = request.form['backup_node'] source_disk = request.form['source_disk'] source_cluster_name = request.form['source_cluster'] dest_cluster_name = request.form['dest_cluster_name'] destination_disk = request.form['destination_disk'] rep_compression_mode = request.form['rep_compression_mode'] if rep_compression_mode == 'enabled': rep_compression_algorithm = request.form[ 'rep_compression_algorithm'] replication_job.compression_algorithm = rep_compression_algorithm pre_snap_script = request.form['pre_snap_script'] post_snap_script = request.form['post_snap_script'] post_job_complete = request.form['post_job_complete'] src_disk_meta = manage_replication.get_src_disk_meta(source_disk) remote_replication.disk_id = destination_disk remote_replication.cluster_name = dest_cluster_name dest_disk_meta_dict = remote_replication.get_disk_meta() dest_disk_meta_obj = DiskMeta(dest_disk_meta_dict) # check if both source and destination disks have the same size. if src_disk_meta.size != dest_disk_meta_obj.size: session[ 'err'] = "ui_admin_add_job_error_scr_dest_size_mismatch" return redirect(url_for('replication_controller.add_job')) if src_disk_meta.replication_info or dest_disk_meta_obj.replication_info: session[ 'err'] = "ui_admin_add_job_error_scr_dest_have_replication_info" return redirect(url_for('replication_controller.add_job')) # fill replication job entity . replication_job.job_name = job_name replication_job.schedule = schedule_object replication_job.node_name = backup_node replication_job.source_cluster_name = source_cluster_name replication_job.source_disk_id = source_disk replication_job.destination_disk_id = destination_disk replication_job.destination_cluster_name = dest_cluster_name replication_job.pre_snap_url = pre_snap_script replication_job.post_snap_url = post_snap_script replication_job.post_job_complete = post_job_complete # update src and dest disk meta.replication_info. replication_info = { 'src_disk_id': replication_job.source_disk_id, 'src_disk_name': src_disk_meta.disk_name, 'src_cluster_fsid': "", 'src_cluster_name': replication_job.source_cluster_name, 'dest_disk_id': replication_job.destination_disk_id, 'dest_disk_name': dest_disk_meta_obj.disk_name, 'dest_cluster_name': replication_job.destination_cluster_name, 'dest_cluster_ip': "", 'dest_cluster_fsid': "" } src_disk_meta.replication_info = replication_info # send job entity to the backend to be saved in the consul. manage_replication.add_replication_job(replication_job, src_disk_meta) session['success'] = "ui_admin_add_job_success" return redirect(url_for('replication_controller.job_list')) except ReplicationException as e: logger.error(e) if e.id == ReplicationException.CONNECTION_REFUSED: session['err'] = "ui_admin_add_job_connction_refused_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.CONNECTION_TIMEOUT: session['err'] = "ui_admin_add_job_connction_timeout_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.DUPLICATE_NAME: session['err'] = "ui_admin_add_job_duplicate_err" return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.PERMISSION_DENIED: session['err'] = "Permission Denied." return redirect(url_for('replication_controller.add_job')) elif e.id == ReplicationException.GENERAL_EXCEPTION: session['err'] = "core_consul_exception_cant_add_rep_job" return redirect(url_for('replication_controller.add_job')) except Exception as e: logger.error(e) session['err'] = "ui_admin_add_job_error" return redirect(url_for('replication_controller.add_job'))