Class: Kennel::Syncer::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/kennel/syncer.rb

Instance Method Summary collapse

Constructor Details

#initialize(expected:, project_filter:, tracking_id_filter:) ⇒ Resolver

Returns a new instance of Resolver.



197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/kennel/syncer.rb', line 197

def initialize(expected:, project_filter:, tracking_id_filter:)
  @id_map = IdMap.new
  @project_filter = project_filter
  @tracking_id_filter = tracking_id_filter

  # mark everything as new
  expected.each do |e|
    id_map.set(e.class.api_resource, e.tracking_id, IdMap::NEW)
    if e.class.api_resource == "synthetics/tests"
      id_map.set(Kennel::Models::Monitor.api_resource, e.tracking_id, IdMap::NEW)
    end
  end
end

Instance Method Details

#add_actual(actual) ⇒ Object



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/kennel/syncer.rb', line 211

def add_actual(actual)
  # override resources that exist with their id
  project_prefixes = project_filter&.map { |p| "#{p}:" }

  actual.each do |a|
    # ignore when not managed by kennel
    next unless tracking_id = a.fetch(:tracking_id)

    # ignore when deleted from the codebase
    # (when running with filters we cannot see the other resources in the codebase)
    api_resource = a.fetch(:klass).api_resource
    next if
      !id_map.get(api_resource, tracking_id) &&
      (!project_prefixes || tracking_id.start_with?(*project_prefixes)) &&
      (!tracking_id_filter || tracking_id_filter.include?(tracking_id))

    id_map.set(api_resource, tracking_id, a.fetch(:id))
    if a.fetch(:klass).api_resource == "synthetics/tests"
      id_map.set(Kennel::Models::Monitor.api_resource, tracking_id, a.fetch(:monitor_id))
    end
  end
end

#each_resolved(list) ⇒ Object

loop over items until everything is resolved or crash when we get stuck this solves cases like composite monitors depending on each other or monitor->monitor slo->slo monitor chains



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/kennel/syncer.rb', line 242

def each_resolved(list)
  list = list.dup
  loop do
    return if list.empty?
    list.reject! do |item|
      if resolved?(item.expected)
        yield item
        true
      else
        false
      end
    end ||
      assert_resolved(list[0].expected) # resolve something or show a circular dependency error
  end
end

#resolve_as_much_as_possible(expected) ⇒ Object



234
235
236
237
238
# File 'lib/kennel/syncer.rb', line 234

def resolve_as_much_as_possible(expected)
  expected.each do |e|
    e.resolve_linked_tracking_ids!(id_map, force: false)
  end
end