class AzkabanScheduler::Session
Attributes
id[RW]
Public Class Methods
new(client, id)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 23 def initialize(client, id) @client = client @id = id end
start(client, username, password)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 8 def self.start(client, username, password) params = {'action' => 'login', 'username' => username, 'password' => password} response = client.post('/', params) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) unless result["status"] == "success" error_message = result["error"] if error_message == "Incorrect Login. Username\/Password not found." raise AuthenticationError, error_message end raise AzkabanError, error_message end new(client, result['session.id']) end
Public Instance Methods
create_project(project)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 28 def create_project(project) response = @client.post('/manager', { 'session.id' => @id, 'action' => 'create', 'name' => project.name, 'description' => project.description, }) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) if result['status'] != 'success' error_message = result['message'] if error_message == "Active project with name #{project.name} already exists in db." raise ProjectExistsError, error_message elsif error_message == "Project names must start with a letter, followed by any number of letters, digits, '-' or '_'." raise InvalidProjectNameError, error_message elsif error_message == "Description cannot be empty." raise ProjectDescriptionEmptyError, error_message end raise AzkabanError, error_message end result end
delete_project(project_name)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 71 def delete_project(project_name) response = @client.get('/manager', { 'session.id' => @id, 'project' => project_name, 'delete' => 'true', }) response.error! unless response.kind_of?(Net::HTTPSuccess) || response.kind_of?(Net::HTTPRedirection) cookies = response_cookies(response) unless cookies['azkaban.success.message'] error_message = cookies['azkaban.failure.message'] if error_message == "Project #{project_name} doesn't exist." return false end raise AzkabanError, error_message end true end
fetch_flow_executions(project_name, flow_id, offset=0, limit=10)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 109 def fetch_flow_executions(project_name, flow_id, offset=0, limit=10) response = @client.get('/manager', { 'session.id' => @id, 'ajax' => 'fetchFlowExecutions', 'project' => project_name, 'flow' => flow_id, 'start' => offset, 'length' => limit, }) response.error! unless response.kind_of?(Net::HTTPSuccess) JSON.parse(response.body) end
fetch_project_flows(project_name)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 99 def fetch_project_flows(project_name) response = @client.get('/manager', { 'session.id' => @id, 'ajax' => 'fetchprojectflows', 'project' => project_name, }) response.error! unless response.kind_of?(Net::HTTPSuccess) JSON.parse(response.body) end
get_project_id(project_name)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 89 def get_project_id(project_name) result = fetch_project_flows(project_name) result['projectId'] end
list_flow_ids(project_name)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 94 def list_flow_ids(project_name) result = fetch_project_flows(project_name) result['flows'].map{ |flow| flow['flowId'] } end
list_schedules()
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 122 def list_schedules response = @client.post('/schedule', { 'ajax' => 'loadFlow' }, session_id_cookie) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) result['items'] || [] end
post_schedule(project_id, project_name, flow, start_time, options={})
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 152 def post_schedule(project_id, project_name, flow, start_time, options={}) response = @client.post('/schedule', { 'ajax' => 'scheduleFlow', 'project' => project_name, 'projectName' => project_name, 'projectId' => project_id, 'flow' => flow, 'disabled' => options[:disabled] || '[]', 'period' => options[:period] || "1d", 'scheduleTime' => start_time.utc.strftime("%I,%M,%p,UTC"), 'scheduleDate' => start_time.utc.strftime("%m/%d/%Y"), 'is_recurring' => options[:period] ? 'on' : 'off', 'concurrentOption' => options[:concurrent_option] || 'skip', 'failureEmailsOverride' => (!!options[:failure_emails_override]).to_s, 'successEmailsOverride' => (!!options[:success_emails_override]).to_s, 'failureAction' => options[:failure_action] || 'finishCurrent', 'failureEmails' => Array(options[:failure_emails]).join(', '), 'successEmails' => Array(options[:success_emails]).join(', '), 'notifyFailureFirst' => (!!options[:notify_failure_first]).to_s, 'notifyFailureLast' => (!!options[:notify_failure_last]).to_s, }, session_id_cookie) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) unless result['status'] == 'success' raise AzkabanError, result['message'] end nil end
remove_all_schedules(project_name)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 144 def remove_all_schedules(project_name) list_schedules.each do |schedule| next unless schedule['projectname'] == project_name schedule_id = schedule['scheduleid'] remove_schedule(schedule_id) end end
remove_schedule(schedule_id)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 129 def remove_schedule(schedule_id) response = @client.post('/schedule', { 'action' => 'removeSched', 'scheduleId' => schedule_id, }, session_id_cookie) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) unless result['status'] == 'success' error_message = result['message'] return false if error_message == "Schedule with ID #{schedule_id} does not exist" raise AzkabanError, error_message end true end
upload_project(project)
click to toggle source
# File lib/azkaban_scheduler/session.rb, line 51 def upload_project(project) response = @client.multipart_post('/manager', { 'session.id' => @id, 'ajax' => 'upload', 'project' => project.name, 'file' => UploadIO.new(project.build, 'application/zip', 'file.zip'), }) response.error! unless response.kind_of?(Net::HTTPSuccess) result = JSON.parse(response.body) if error_message = result['error'] if error_message == "Installation Failed. Project '#{project.name}' doesn't exist." raise ProjectNotFoundError, error_message end raise AzkabanError, error_message end project.id = result['projectId'] project.version = result['version'] result end