kennel 1.127.0 → 1.128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec72f834db1c82d19ba21eabd482e5f46a540b0c9a3e0e51ecc20a80c192a6d7
4
- data.tar.gz: c5b549fb934ce3e274d88149df509b4dcf16e1adc6be3271e94b3101dbee1ad7
3
+ metadata.gz: d27f0b47987630640f1d58181bc98360714dc4b39827ea7282d1445496e3d315
4
+ data.tar.gz: a2dbe1c762943b8859134772f39e3f0af0f4e7e2c5c1a60c2de980574de84714
5
5
  SHA512:
6
- metadata.gz: e0bff1a22428c19da30025f79e8e7904675ea27d79eb2cfdf1a6cf0638a33efbdee44c10f898480b9e7d91d73296368e3bab58ce495282beb43cb13c975c9153
7
- data.tar.gz: 445cf62d6e525c42808a42ba80e941829cab5c679ef74f71590799ec46e93f3d41ff8162bed775342510c042249a2acfaf10dea06507a2b5f7a7b0c8a450fb3c
6
+ metadata.gz: 6c16b16c0914e6c436424c431eec9b5b0ff5dcb92195096973e1807c75375e34f16094c4935c28de6a0797ebb8d5cc5a8e86a9c38f4a778df65598ede58ad348
7
+ data.tar.gz: d885678eb185f3fa404d8c42c64f3c7f22250da1537ecec556d5f9728fe9a6aa7d7fb889f9c8d637c4f29787864f05ec5a51c5abb90023fde1c71a0110a24dd5
@@ -4,8 +4,8 @@ require "benchmark"
4
4
  module Kennel
5
5
  class Progress
6
6
  # print what we are doing and a spinner until it is done ... then show how long it took
7
- def self.progress(name, interval: 0.2, &block)
8
- return progress_no_tty(name, &block) unless Kennel.err.tty?
7
+ def self.progress(name, interval: 0.2, plain: false, &block)
8
+ return progress_no_tty(name, &block) if plain || !Kennel.err.tty?
9
9
 
10
10
  Kennel.err.print "#{name} ... "
11
11
 
data/lib/kennel/syncer.rb CHANGED
@@ -10,12 +10,13 @@ module Kennel
10
10
  Plan = Struct.new(:changes, keyword_init: true)
11
11
  Change = Struct.new(:type, :api_resource, :tracking_id, :id)
12
12
 
13
- def initialize(api, expected, kennel:, project_filter: nil, tracking_id_filter: nil)
13
+ def initialize(api, expected, actual, kennel:, project_filter: nil, tracking_id_filter: nil)
14
14
  @api = api
15
15
  @kennel = kennel
16
16
  @project_filter = project_filter
17
17
  @tracking_id_filter = tracking_id_filter
18
18
  @expected = Set.new expected # need set to speed up deletion
19
+ @actual = actual
19
20
  calculate_diff
20
21
  validate_plan
21
22
  prevent_irreversible_partial_updates
@@ -53,7 +54,7 @@ module Kennel
53
54
  message = "#{e.class.api_resource} #{e.tracking_id}"
54
55
  Kennel.out.puts "Creating #{message}"
55
56
  reply = @api.create e.class.api_resource, e.as_json
56
- cache_metadata reply, e.class
57
+ Utils.inline_resource_metadata reply, e.class
57
58
  id = reply.fetch(:id)
58
59
  changes << Change.new(:create, e.class.api_resource, e.tracking_id, id)
59
60
  populate_id_map [], [reply] # allow resolving ids we could previously no resolve
@@ -125,17 +126,15 @@ module Kennel
125
126
  @delete = []
126
127
  @id_map = IdMap.new
127
128
 
128
- actual = Progress.progress("Downloading definitions") { download_definitions }
129
-
130
129
  Progress.progress "Diffing" do
131
- populate_id_map @expected, actual
132
- filter_actual! actual
130
+ populate_id_map @expected, @actual
131
+ filter_actual! @actual
133
132
  resolve_linked_tracking_ids! @expected # resolve dependencies to avoid diff
134
133
 
135
134
  @expected.each(&:add_tracking_id) # avoid diff with actual
136
135
 
137
136
  lookup_map = matching_expected_lookup_map
138
- items = actual.map do |a|
137
+ items = @actual.map do |a|
139
138
  e = matching_expected(a, lookup_map)
140
139
  if e && @expected.delete?(e)
141
140
  [e, a]
@@ -168,19 +167,6 @@ module Kennel
168
167
  end
169
168
  end
170
169
 
171
- def download_definitions
172
- Utils.parallel(Models::Record.subclasses) do |klass|
173
- results = @api.list(klass.api_resource, with_downtimes: false) # lookup monitors without adding unnecessary downtime information
174
- results = results[results.keys.first] if results.is_a?(Hash) # dashboards are nested in {dashboards: []}
175
- results.each { |a| cache_metadata(a, klass) }
176
- end.flatten(1)
177
- end
178
-
179
- def cache_metadata(a, klass)
180
- a[:klass] = klass
181
- a[:tracking_id] = a.fetch(:klass).parse_tracking_id(a)
182
- end
183
-
184
170
  def ensure_all_ids_found
185
171
  @expected.each do |e|
186
172
  next unless id = e.id
data/lib/kennel/tasks.rb CHANGED
@@ -101,8 +101,11 @@ namespace :kennel do
101
101
  end
102
102
 
103
103
  # also generate parts so users see and commit updated generated automatically
104
+ # (generate must run after plan to enable parallel .download+.generate inside of .plan)
104
105
  desc "show planned datadog changes (scope with PROJECT=name)"
105
- task plan: :generate do
106
+ task plan: :environment do
107
+ Kennel::Tasks.kennel.preload
108
+ Kennel::Tasks.kennel.generate
106
109
  Kennel::Tasks.kennel.plan
107
110
  end
108
111
 
data/lib/kennel/utils.rb CHANGED
@@ -160,6 +160,11 @@ module Kennel
160
160
  end
161
161
  string
162
162
  end
163
+
164
+ def inline_resource_metadata(resource, klass)
165
+ resource[:klass] = klass
166
+ resource[:tracking_id] = klass.parse_tracking_id(resource)
167
+ end
163
168
  end
164
169
  end
165
170
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
- VERSION = "1.127.0"
3
+ VERSION = "1.128.0"
4
4
  end
data/lib/kennel.rb CHANGED
@@ -58,6 +58,11 @@ module Kennel
58
58
 
59
59
  attr_accessor :strict_imports
60
60
 
61
+ # start generation and download in parallel to make planning faster
62
+ def preload
63
+ Utils.parallel([:generated, :definitions]) { |m| send m, plain: true }
64
+ end
65
+
61
66
  def generate
62
67
  parts = generated
63
68
  parts_serializer.write(parts) if ENV["STORE"] != "false" # quicker when debugging
@@ -80,7 +85,10 @@ module Kennel
80
85
  end
81
86
 
82
87
  def syncer
83
- @syncer ||= Syncer.new(api, generated, kennel: self, project_filter: filter.project_filter, tracking_id_filter: filter.tracking_id_filter)
88
+ @syncer ||= begin
89
+ preload
90
+ Syncer.new(api, generated, definitions, kennel: self, project_filter: filter.project_filter, tracking_id_filter: filter.tracking_id_filter)
91
+ end
84
92
  end
85
93
 
86
94
  def api
@@ -95,9 +103,9 @@ module Kennel
95
103
  @parts_serializer ||= PartsSerializer.new(filter: filter)
96
104
  end
97
105
 
98
- def generated
106
+ def generated(**kwargs)
99
107
  @generated ||= begin
100
- parts = Progress.progress "Finding parts" do
108
+ parts = Progress.progress "Finding parts", **kwargs do
101
109
  projects = projects_provider.projects
102
110
  projects = filter.filter_projects projects
103
111
 
@@ -123,5 +131,14 @@ module Kennel
123
131
  parts
124
132
  end
125
133
  end
134
+
135
+ def definitions(**kwargs)
136
+ @definitions ||= Progress.progress("Downloading definitions", **kwargs) do
137
+ Utils.parallel(Models::Record.subclasses) do |klass|
138
+ results = api.list(klass.api_resource, with_downtimes: false) # lookup monitors without adding unnecessary downtime information
139
+ results.each { |a| Utils.inline_resource_metadata(a, klass) }
140
+ end.flatten(1)
141
+ end
142
+ end
126
143
  end
127
144
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kennel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.127.0
4
+ version: 1.128.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-05 00:00:00.000000000 Z
11
+ date: 2022-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs