kennel 1.127.0 → 1.128.0

Sign up to get free protection for your applications and to get access to all the features.
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