Class: Hodor::Oozie::Session

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/hodor/api/oozie/session.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSession



21
22
23
24
# File 'lib/hodor/api/oozie/session.rb', line 21

def initialize
  @len = env.prefs[:default_list_length] || 30
  @offset = 0
end

Instance Attribute Details

#filterObject

Returns the value of attribute filter.



10
11
12
# File 'lib/hodor/api/oozie/session.rb', line 10

def filter
  @filter
end

#last_queryObject (readonly)

Returns the value of attribute last_query.



11
12
13
# File 'lib/hodor/api/oozie/session.rb', line 11

def last_query
  @last_query
end

#lenObject

Returns the value of attribute len.



10
11
12
# File 'lib/hodor/api/oozie/session.rb', line 10

def len
  @len
end

#modeObject

Returns the value of attribute mode.



10
11
12
# File 'lib/hodor/api/oozie/session.rb', line 10

def mode
  @mode
end

#offsetObject

Returns the value of attribute offset.



10
11
12
# File 'lib/hodor/api/oozie/session.rb', line 10

def offset
  @offset
end

#verboseObject

Returns the value of attribute verbose.



10
11
12
# File 'lib/hodor/api/oozie/session.rb', line 10

def verbose
  @verbose
end

Instance Method Details

#cache_fileObject



112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/hodor/api/oozie/session.rb', line 112

def cache_file
  if @cache_file.nil?
    if env[:display_job_query_mode]
      default_id = 'default'
    else
      default_id = `ps -p #{Process.pid} -o ppid=`.strip
    end
    index_id = ENV['HODOR_INDEX_ID'] || default_id
    @cache_file = "/tmp/hodor-#{index_id}.index"
  end
  @cache_file
end

#child_id(child_index) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/hodor/api/oozie/session.rb', line 87

def child_id(child_index)
  children = index[:children]
  if children
    index_size = index[:children].length
    if child_index < index_size
      cid = index[:children][child_index]
      cid
    else
      raise "No child with index '#{child_index}' was found"
    end
  end
end

#current_idObject



100
101
102
# File 'lib/hodor/api/oozie/session.rb', line 100

def current_id
  index[:current_id]
end

#envObject



13
14
15
# File 'lib/hodor/api/oozie/session.rb', line 13

def env
  Hodor::Environment.instance
end

#get_job_state(job_id, *args) ⇒ Object



59
60
61
# File 'lib/hodor/api/oozie/session.rb', line 59

def get_job_state(job_id, *args)
  rest_call("/v1/job/#{job_id}?#{args.map { |v| v.nil? || v.size == 0 ? nil : v }.compact.join('&')}")
end

#indexObject



80
81
82
83
84
85
# File 'lib/hodor/api/oozie/session.rb', line 80

def index
  if @index.nil?
    @index = load_index
  end
  @index
end

#job_relative(movement, request = nil) ⇒ Object



150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/hodor/api/oozie/session.rb', line 150

def job_relative(movement, request = nil)
  case movement
  when :root;
    nil
  when :up; 
    parent_id
  when :down; 
    child_id(request.to_i)
  when :none; 
    current_id
  when :jump;
    request
  end
end

#load_indexObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/hodor/api/oozie/session.rb', line 125

def load_index
  index_read = {}
  if File.exists? cache_file
    File.open(cache_file, 'rb') {|f| index_read = ::Marshal.load(f) } 
    @root_query ||= index_read[:root_query] if index_read.has_key?(:root_query)
  else
    index_read = { children: nil,
            current_id: nil,
            parent_id: nil,
            root_query: nil }
  end
  index_read || { children: nil,
                  current_id: nil,
                  parent_id: nil,
                  root_query: nil }
rescue => ex
  raise "Failed to load Hodor cache file. #{ex.message}"
end

#loggerObject



17
18
19
# File 'lib/hodor/api/oozie/session.rb', line 17

def logger
  env.logger
end

#make_current(job) ⇒ Object



165
166
167
168
# File 'lib/hodor/api/oozie/session.rb', line 165

def make_current(job)
  refresh_index(job.children, job.id, job.parent_id) if job
  job
end

#parent_idObject



104
105
106
# File 'lib/hodor/api/oozie/session.rb', line 104

def parent_id
  index[:parent_id]
end

#pwjObject



144
145
146
147
148
# File 'lib/hodor/api/oozie/session.rb', line 144

def pwj
  { current_id: session.current_id,
    parent_id: session.parent_id,
    root_query: session.root_query }
end

#refresh_index(children, current_id, parent_id) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/hodor/api/oozie/session.rb', line 63

def refresh_index(children, current_id, parent_id)
  if children
    children.each_with_index { |c, i|
      c.set_index(i)
    }
    child_ids = children.map { |c| c.skip_to || c.id }
  else
    child_ids = nil
  end
  index_overwrite = { children: child_ids,
            current_id: current_id,
            parent_id: parent_id,
            root_query: @root_query }
  File.open(cache_file, 'wb') {|f| f.write(::Marshal.dump(index_overwrite)) }
  children
end

#rest_call(api) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/hodor/api/oozie/session.rb', line 26

def rest_call(api)
  num_retries = 0
  begin
    url = "#{env[:oozie_url]}#{api}".gsub(/oozie\/\//,'oozie/')
    @last_query = url
    #puts "REST CALL: #{url}"
    uri = URI.parse(url)

    http = Net::HTTP.new(uri.host, uri.port)

    http.read_timeout = 10
    http.open_timeout = 10

    data = http.start() {|http|
      http.get(uri.request_uri).body
    }
  rescue Net::OpenTimeout => ex
    logger.error "Network connection timed out! Make sure you are connected to the Internet or VPN. Retrying..."
    if num_retries <= 4
      num_retries += 1
      retry
    else
      nil
    end
  end
end

#root_queryObject



108
109
110
# File 'lib/hodor/api/oozie/session.rb', line 108

def root_query
  @root_query || index[:root_query]
end

#search_jobs(*args) ⇒ Object



53
54
55
56
57
# File 'lib/hodor/api/oozie/session.rb', line 53

def search_jobs(*args)
  json = rest_call("/v2/jobs?#{args.map { |v| v.nil? || v.size == 0 ? nil : v }.compact.join('&')}")
  @root_query = @last_query
  json
end