rollbar-notification-rules-generator 0.2.0 → 0.2.2

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: 7741d04c00243c59a3451ae2626619c1950012aae49833d0354e65a378312eb9
4
- data.tar.gz: 2295ce6a7e025b9f51b9080bc3e39e87fbcdafdbe1798f5a7621a1078be85a96
3
+ metadata.gz: b69971ea33eb831637b2fbc7170b01dd6cce53e45f02d6f0b2c45c019900ed5a
4
+ data.tar.gz: 43b362b542727d83795bbc5efd0f9f219a224e0f2030d3579be755e97477f111
5
5
  SHA512:
6
- metadata.gz: 7b43b62215e964fbe5e3790ba57573c1a93ed56745ee1eb6adabc2add13cfde0a23decb78d0289e78fb92f97b30a47623839780cbe8ac330153f047bcb2d999d
7
- data.tar.gz: d2ee76d26ae45c3be12dcd972cc7d69b6fcd8c72d6dd96a922b364b601be90fa958609d8971cf6056bafc23ceca8cdec51611ec24bf2255a0a262c5d623fd46e
6
+ metadata.gz: f61baf0e620d426b92f9bcd5ea00709969d1b183febcbfe0f4cc8b9f288f2f23e33d4aea71d8e4a0357eb441b4a111ebbdfd40b45e54d37df971ff475df061ec
7
+ data.tar.gz: 0baee819bff11502752157d296a978a5a50e48f2e9efcaac4593a9820e192fe3801c2cafa1566857f12dc2b2df98fcd8e570fd17c8b760548a1c893effd48bc4
data/README.md CHANGED
@@ -88,10 +88,12 @@ Usage: rollbar-notification-rules-generator [options] <input>
88
88
  --format FORMAT terraform|text (default: terraform)
89
89
  ```
90
90
 
91
- The input file is in YAML format like the following:
91
+ The input file is in YAML format like the following:
92
92
 
93
93
  ```yaml
94
94
  channel: "slack" # slack or pagerduty
95
+ # This optional value is used as the namespace of Terraform resources.
96
+ terraform_provider: foo_
95
97
  # This optional value is used as provider meta-argument of Terraform.
96
98
  terraform_provider: rollbar.alias_value
97
99
  # You can define variables, and they are expanded with the syntax "${{ var.variable_name }}".
@@ -4,16 +4,20 @@ require "rollbar/notification/trigger"
4
4
  module Rollbar
5
5
  class Notification
6
6
  class Channel
7
- SUPPORTED_CHANNELS = %w[slack pagerduty]
7
+ CHANNEL_TO_TEXT = {
8
+ "slack" => "Slack",
9
+ "pagerduty" => "PagerDuty",
10
+ }
8
11
 
9
12
  # @param channel [String]
10
13
  # @param triggers [Hash{String => Array<Hash>}]
11
14
  # @param variables [Hash{String => String}]
12
15
  def initialize(channel, triggers, variables)
13
- unless SUPPORTED_CHANNELS.include?(channel)
16
+ unless CHANNEL_TO_TEXT.include?(channel)
14
17
  raise ArgumentError, "Unsupported channel: #{channel}"
15
18
  end
16
19
 
20
+ @channel = channel
17
21
  @triggers = triggers.map do |trigger, rules|
18
22
  Rollbar::Notification::Trigger.new(channel, trigger, rules, variables)
19
23
  end
@@ -21,12 +25,12 @@ module Rollbar
21
25
 
22
26
  # @return [String]
23
27
  def to_s
24
- @triggers.map(&:to_s).join.chomp
28
+ "# #{CHANNEL_TO_TEXT.fetch(@channel)}\n#{@triggers.map(&:to_s).join.chomp}"
25
29
  end
26
30
 
27
31
  # @param provider [String]
28
- def to_tf(provider)
29
- @triggers.map { |t| t.to_tf(provider) }.join("\n")
32
+ def to_tf(provider, namespace)
33
+ @triggers.map { |t| t.to_tf(provider, namespace) }.join("\n")
30
34
  end
31
35
  end
32
36
  end
@@ -17,6 +17,20 @@ module Rollbar
17
17
  @value = value
18
18
  end
19
19
 
20
+ # @param other [Object]
21
+ # @return [Boolean]
22
+ def ==(other)
23
+ self.class == other.class &&
24
+ type == other.type &&
25
+ operation == other.operation &&
26
+ value == other.value
27
+ end
28
+ alias :eql? :==
29
+
30
+ def hash
31
+ [self.class, type, operation, value].hash
32
+ end
33
+
20
34
  def to_tf
21
35
  <<~TF
22
36
  filters {
@@ -28,6 +28,18 @@ module Rollbar
28
28
  @path = path
29
29
  end
30
30
 
31
+ # @param other [Object]
32
+ # @return [Boolean]
33
+ def ==(other)
34
+ super && path == other.path
35
+ end
36
+ alias :eql? :==
37
+
38
+ def hash
39
+ [self.class, type, operation, value, path].hash
40
+ end
41
+
42
+
31
43
  def to_tf
32
44
  <<~TF
33
45
  filters {
@@ -40,14 +40,32 @@ module Rollbar
40
40
  super
41
41
  end
42
42
 
43
+ # @param other [Object]
44
+ # @return [Boolean]
45
+ def ==(other)
46
+ self.class == other.class &&
47
+ conditions == other.conditions &&
48
+ configs == other.configs
49
+ end
50
+
43
51
  # @return [Rule]
44
52
  def remove_redundant_conditions!
53
+ @conditions.uniq!
45
54
  @conditions.delete_if do |condition|
46
55
  @conditions.any? { |other| condition.redundant_to?(other) }
47
56
  end
48
57
  self
49
58
  end
50
59
 
60
+ def never_met?
61
+ @conditions.each.with_index.any? do |condition, i|
62
+ @conditions[i + 1 ..].any? do |other|
63
+ next false unless condition.respond_to?(:build_complement_condition)
64
+ other == condition.build_complement_condition
65
+ end
66
+ end
67
+ end
68
+
51
69
  # @param old_condition [Condition::Base]
52
70
  # @param new_condition [Condition::Base]
53
71
  # @return [Rule]
@@ -101,37 +119,33 @@ module Rollbar
101
119
  # @param new_conditions [Condition::Base, Array<Condition::Base>]
102
120
  # @return [Rule]
103
121
  def add_conditions!(new_conditions)
104
- Array(new_conditions).each do |new_condition|
105
- @conditions << new_condition
106
- end
122
+ @conditions.concat(Array(new_conditions))
107
123
  self
108
124
  end
109
125
 
110
- # @return [Hash{String => Array<Condition::Base>}]
126
+ # @return [Hash{String => Array<Array<Condition::Base>>}]
111
127
  def build_additional_conditions_set_for_subsequent_rules
112
128
  target_levels = level_condition&.target_level_values || Rollbar::Notification::Condition::Level::SUPPORTED_VALUES
113
129
 
114
130
  conditions_with_complement = @conditions.select { |c| c.respond_to?(:build_complement_condition) }
115
131
  return {} if conditions_with_complement.empty?
116
132
 
117
- if conditions_with_complement.size == 1
118
- additional_conditions = [[conditions_with_complement.first.build_complement_condition]]
119
- else
120
- # [cond1, cond2, cond3]
121
- # => [
122
- # [cond1, cond2, not-cond3],
123
- # [cond1, not-cond2, cond3],
124
- # [cond1, not-cond2, not-cond3],
125
- # [not-cond1, cond2, cond3],
126
- # [not-cond1, cond2, not-cond3],
127
- # [not-cond1, not-cond2, cond3],
128
- # [not-cond1, not-cond2, not-cond3],
129
- # ]
130
- additional_conditions = conditions_with_complement.map do |condition|
131
- [condition, condition.build_complement_condition]
132
- end.reduce(&:product).map(&:flatten) - [conditions_with_complement]
133
+ # [cond1, cond2, cond3]
134
+ # => [
135
+ # [cond1, cond2, not-cond3],
136
+ # [cond1, not-cond2, cond3],
137
+ # [cond1, not-cond2, not-cond3],
138
+ # [not-cond1, cond2, cond3],
139
+ # [not-cond1, cond2, not-cond3],
140
+ # [not-cond1, not-cond2, cond3],
141
+ # [not-cond1, not-cond2, not-cond3],
142
+ # ]
143
+ first_cond, *other_conds = conditions_with_complement.map do |condition|
144
+ [condition, condition.build_complement_condition]
133
145
  end
134
- target_levels.zip([additional_conditions].cycle).to_h
146
+ additional_conditions_set = first_cond.product(*other_conds) - [conditions_with_complement]
147
+
148
+ target_levels.zip([additional_conditions_set].cycle).to_h
135
149
  end
136
150
 
137
151
  private
@@ -71,13 +71,13 @@ module Rollbar
71
71
  str
72
72
  end
73
73
 
74
- def to_tf(provider)
74
+ def to_tf(provider, namespace)
75
75
  i = -1
76
76
  build_mutually_exclusive_rules.flat_map do |rule|
77
77
  rule.configs.map do |config|
78
78
  i += 1
79
79
  TF_TEMPLATE.result_with_hash({
80
- resource_name: "#{@channel}_#{@name}_#{i}",
80
+ resource_name: "#{namespace}#{@channel}_#{@name}_#{i}",
81
81
  provider: provider,
82
82
  channel: @channel,
83
83
  trigger: @name,
@@ -102,9 +102,12 @@ module Rollbar
102
102
  new_rules << new_rule
103
103
  else
104
104
  additional_conditions_set.each do |additional_conditions|
105
- new_rules << new_rule.dup
106
- .add_conditions!(additional_conditions)
107
- .remove_redundant_conditions!
105
+ new_rule_with_additional_conds = new_rule.dup
106
+ .add_conditions!(additional_conditions)
107
+ .remove_redundant_conditions!
108
+ unless new_rule_with_additional_conds.never_met?
109
+ new_rules << new_rule_with_additional_conds
110
+ end
108
111
  end
109
112
  end
110
113
  end
@@ -114,7 +117,15 @@ module Rollbar
114
117
  highest_lowest_target_level = lowest_target_level
115
118
  end
116
119
  level_value_to_additional_conditions_set.merge!(rule.build_additional_conditions_set_for_subsequent_rules) do |_, v1, v2|
117
- v1.product(v2).map(&:flatten)
120
+ additional_conditions_set = v1.product(v2).map(&:flatten)
121
+
122
+ additional_conditions_set.reject! do |conditions|
123
+ conditions.each.with_index.any? do |condition, i|
124
+ conditions[i + 1 ..].any? { |other| other == condition.build_complement_condition }
125
+ end
126
+ end
127
+
128
+ additional_conditions_set
118
129
  end
119
130
  end
120
131
 
@@ -5,11 +5,6 @@ require "rollbar/notification/channel"
5
5
 
6
6
  module Rollbar
7
7
  class Notification
8
- CHANNEL_TO_TEXT = {
9
- "slack" => "Slack",
10
- "pagerduty" => "PagerDuty",
11
- }
12
-
13
8
  # @param config_file [String]
14
9
  def initialize(config_file)
15
10
  @config = YAML.load_file(config_file)
@@ -22,12 +17,12 @@ module Rollbar
22
17
 
23
18
  # @return [String]
24
19
  def to_s
25
- "# #{CHANNEL_TO_TEXT.fetch(@config.fetch("channel"))}\n#{@channel.to_s}"
20
+ @channel.to_s
26
21
  end
27
22
 
28
23
  # @return [String]
29
24
  def to_tf
30
- @channel.to_tf(@config["terraform_provider"])
25
+ @channel.to_tf(@config["terraform_provider"], @config["terraform_namespace"])
31
26
  end
32
27
  end
33
28
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "rollbar-notification-rules-generator"
5
- spec.version = "0.2.0"
5
+ spec.version = "0.2.2"
6
6
  spec.authors = ["abicky"]
7
7
  spec.email = ["takeshi.arabiki@gmail.com"]
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollbar-notification-rules-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - abicky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-14 00:00:00.000000000 Z
11
+ date: 2022-12-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This tool generates Rollbar notification rules that are mutually exclusive
14
14
  from a simple YAML file.