Class: Dwf::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/dwf/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config = Dwf.configuration) ⇒ Client

Returns a new instance of Client.



7
8
9
# File 'lib/dwf/client.rb', line 7

def initialize(config = Dwf.configuration)
  @config = config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



5
6
7
# File 'lib/dwf/client.rb', line 5

def config
  @config
end

Instance Method Details

#build_job_id(workflow_id, job_klass) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/dwf/client.rb', line 87

def build_job_id(workflow_id, job_klass)
  jid = nil

  loop do
    jid = SecureRandom.uuid
    available = !redis.hexists(
      "dwf.jobs.#{workflow_id}.#{job_klass}",
      jid
    )

    break if available
  end

  jid
end

#build_workflow_idObject



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/dwf/client.rb', line 103

def build_workflow_id
  wid = nil
  loop do
    wid = SecureRandom.uuid
    available = !redis.exists?("dwf.workflow.#{wid}")

    break if available
  end

  wid
end

#check_or_lock(workflow_id, job_name) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/dwf/client.rb', line 66

def check_or_lock(workflow_id, job_name)
  key = "wf_enqueue_outgoing_jobs_#{workflow_id}-#{job_name}"

  if key_exists?(key)
    sleep 2
  else
    set(key, 'running')
  end
end

#delete(key) ⇒ Object



123
124
125
# File 'lib/dwf/client.rb', line 123

def delete(key)
  redis.del(key)
end

#find_job(workflow_id, job_name) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/dwf/client.rb', line 11

def find_job(workflow_id, job_name)
  job_name_match = /(?<klass>\w*[^-])-(?<identifier>.*)/.match(job_name)
  data = if job_name_match
           find_job_by_klass_and_id(workflow_id, job_name)
         else
           find_job_by_klass(workflow_id, job_name)
         end

  return nil if data.nil?

  data = JSON.parse(data)
  Dwf::Item.from_hash(Dwf::Utils.symbolize_keys(data))
end

#find_node(name, workflow_id) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/dwf/client.rb', line 25

def find_node(name, workflow_id)
  if Utils.workflow_name?(name)
    if name.include?('|')
      _, id = name.split('|')
    else
      id = workflow_id(name, workflow_id)
    end
    find_workflow(id)
  else
    find_job(workflow_id, name)
  end
end

#find_sub_workflow(name, parent_id) ⇒ Object



49
50
51
# File 'lib/dwf/client.rb', line 49

def find_sub_workflow(name, parent_id)
  find_workflow(workflow_id(name, parent_id))
end

#find_workflow(id) ⇒ Object

Raises:



38
39
40
41
42
43
44
45
46
47
# File 'lib/dwf/client.rb', line 38

def find_workflow(id)
  key = redis.keys("dwf.workflows.#{id}*").first
  data = redis.get(key)
  raise WorkflowNotFound, "Workflow with given id doesn't exist" if data.nil?

  hash = JSON.parse(data)
  hash = Dwf::Utils.symbolize_keys(hash)
  nodes = parse_nodes(id)
  workflow_from_hash(hash, nodes)
end

#key_exists?(key) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/dwf/client.rb', line 115

def key_exists?(key)
  redis.exists?(key)
end

#persist_job(job) ⇒ Object



62
63
64
# File 'lib/dwf/client.rb', line 62

def persist_job(job)
  redis.hset("dwf.jobs.#{job.workflow_id}.#{job.klass}", job.id, job.as_json)
end

#persist_workflow(workflow) ⇒ Object



80
81
82
83
84
85
# File 'lib/dwf/client.rb', line 80

def persist_workflow(workflow)
  key = [
    'dwf', 'workflows', workflow.id, workflow.class.name, workflow.parent_id
  ].compact.join('.')
  redis.set(key, workflow.as_json)
end

#release_lock(workflow_id, job_name) ⇒ Object



76
77
78
# File 'lib/dwf/client.rb', line 76

def release_lock(workflow_id, job_name)
  delete("dwf_enqueue_outgoing_jobs_#{workflow_id}-#{job_name}")
end

#set(key, value) ⇒ Object



119
120
121
# File 'lib/dwf/client.rb', line 119

def set(key, value)
  redis.set(key, value)
end

#sub_workflows(id) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/dwf/client.rb', line 53

def sub_workflows(id)
  keys = redis.keys("dwf.workflows.*.*.#{id}")
  keys.map do |key|
    id = key.split('.')[2]

    find_workflow(id)
  end
end