pfab 0.52.0 → 0.54.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: e19f6543864483d014f040e4d0ba5c2e8322bb20ca5604f351c13a36f53b20cd
4
- data.tar.gz: 1d1afb9c39e0e6d69f5849bd171e2a659174ec747c601239c6e9cc051da92d6f
3
+ metadata.gz: f6db80ed30cdab582adbf60a44b1cb80ffb32420898d07117b5e0fe81f0012ac
4
+ data.tar.gz: 818d93a741088cee1a7988273e6eb3389c013fee43227193d086f9cdaa8c01ba
5
5
  SHA512:
6
- metadata.gz: c402604e6fd169342b2aff975ecb79b15b59cf67399c91a57c15597df3b7629d0a0eb84c5df14e784c09ca4612fafdad60e620bae52a76f1da269030c05d9fa4
7
- data.tar.gz: 569c405d1a4be90a456ef7dbb8f5e3cadf842b475644dbb79e85fc6d2765dc557e75b147dba2c58ae88c67ef37d0cab5f45bf9c000983ccb69535597c1a42d40
6
+ metadata.gz: f53b2f212245784bd4d518c7058aa7a2bdad7c2bba7b4a1c956f86356e037ff429ec704c1f7210969ac05e2bfbc05e2273e7961cee9028941e0361d85aaaa618
7
+ data.tar.gz: 2d1e0b3cd52341158feea24b3f184b5ccd53c1dd1951b37b4cdcbed9d54d5e023c7bd772e27a7f86828f56ad86ccf1187c7ed7596a79acc5efc6457d525199cd
data/Gemfile.lock CHANGED
@@ -18,11 +18,12 @@ GIT
18
18
  GEM
19
19
  remote: https://rubygems.org/
20
20
  specs:
21
- activesupport (5.2.4.3)
21
+ activesupport (6.1.7.5)
22
22
  concurrent-ruby (~> 1.0, >= 1.0.2)
23
- i18n (>= 0.7, < 2)
24
- minitest (~> 5.1)
25
- tzinfo (~> 1.1)
23
+ i18n (>= 1.6, < 2)
24
+ minitest (>= 5.1)
25
+ tzinfo (~> 2.0)
26
+ zeitwerk (~> 2.3)
26
27
  addressable (2.8.0)
27
28
  public_suffix (>= 2.0.2, < 5.0)
28
29
  builder (3.2.4)
@@ -30,7 +31,7 @@ GEM
30
31
  coderay (1.1.3)
31
32
  commander (4.4.6)
32
33
  highline (~> 1.7.2)
33
- concurrent-ruby (1.1.9)
34
+ concurrent-ruby (1.2.3)
34
35
  descendants_tracker (0.0.4)
35
36
  thread_safe (~> 0.3, >= 0.3.1)
36
37
  docile (1.3.1)
@@ -64,27 +65,27 @@ GEM
64
65
  oauth2 (~> 1.0)
65
66
  hashie (3.6.0)
66
67
  highline (1.7.10)
67
- i18n (1.8.11)
68
+ i18n (1.14.5)
68
69
  concurrent-ruby (~> 1.0)
69
70
  json (1.8.6)
70
71
  jwt (2.3.0)
71
72
  kamelcase (0.0.2)
72
73
  semver2 (~> 3)
73
74
  method_source (1.0.0)
74
- mini_portile2 (2.8.0)
75
- minitest (5.15.0)
75
+ mini_portile2 (2.8.6)
76
+ minitest (5.22.3)
76
77
  multi_json (1.15.0)
77
78
  multi_xml (0.6.0)
78
79
  multipart-post (2.1.1)
79
- nokogiri (1.13.6)
80
- mini_portile2 (~> 2.8.0)
80
+ nokogiri (1.16.5)
81
+ mini_portile2 (~> 2.8.2)
81
82
  racc (~> 1.4)
82
- oauth2 (1.4.7)
83
- faraday (>= 0.8, < 2.0)
83
+ oauth2 (1.4.11)
84
+ faraday (>= 0.17.3, < 3.0)
84
85
  jwt (>= 1.0, < 3.0)
85
86
  multi_json (~> 1.3)
86
87
  multi_xml (~> 0.5)
87
- rack (>= 1.2, < 3)
88
+ rack (>= 1.2, < 4)
88
89
  power_assert (1.1.3)
89
90
  pry (0.14.2)
90
91
  coderay (~> 1.1)
@@ -94,8 +95,8 @@ GEM
94
95
  pry (>= 0.13, < 0.15)
95
96
  psych (4.0.2)
96
97
  public_suffix (4.0.6)
97
- racc (1.6.0)
98
- rack (2.2.3)
98
+ racc (1.7.3)
99
+ rack (3.0.11)
99
100
  rake (13.0.6)
100
101
  rchardet (1.8.0)
101
102
  rdoc (3.12.2)
@@ -111,8 +112,9 @@ GEM
111
112
  test-unit (3.2.9)
112
113
  power_assert
113
114
  thread_safe (0.3.6)
114
- tzinfo (1.2.9)
115
- thread_safe (~> 0.1)
115
+ tzinfo (2.0.6)
116
+ concurrent-ruby (~> 1.0)
117
+ zeitwerk (2.6.14)
116
118
 
117
119
  PLATFORMS
118
120
  ruby
data/lib/pfab/cli.rb CHANGED
@@ -4,6 +4,7 @@ require "yaml"
4
4
  require "json"
5
5
  require 'active_support/core_ext/hash/indifferent_access'
6
6
  require 'styled_yaml'
7
+ require 'digest'
7
8
 
8
9
  module Pfab
9
10
  class CLI
@@ -16,6 +17,7 @@ module Pfab
16
17
 
17
18
  if File.exist? "application.yaml"
18
19
  @application_yaml = YAML.load(File.read("application.yaml")).with_indifferent_access
20
+ @application_yaml_hash = Digest::SHA256.hexdigest(@application_yaml.to_json)
19
21
  else
20
22
  raise "I need to be run in a directory with a application.yaml"
21
23
  end
@@ -291,6 +293,7 @@ module Pfab
291
293
  def yy
292
294
  Pfab::Yamls.new(apps: all_runnables,
293
295
  application_yaml: @application_yaml,
296
+ application_yaml_hash: @application_yaml_hash,
294
297
  env: $env,
295
298
  sha: get_current_sha,
296
299
  image_name: image_name,
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Pfab
2
4
  module Templates
3
5
  class Base
@@ -63,6 +65,10 @@ module Pfab
63
65
  "#{@data['application']}.#{application_type}.#{@data['deployed_name']}"
64
66
  end
65
67
 
68
+ def deploy_unique_id
69
+ @data['sha'] + "-" + @data['application_yaml_hash'][0,8]
70
+ end
71
+
66
72
  def env_from
67
73
  env_from = []
68
74
  env_from << @data.dig("application_yaml", :env_from)
@@ -14,7 +14,9 @@ module Pfab
14
14
  puts "skipping ingress because ingress_disabled = #{@data['generateIngressEnabled']}"
15
15
  end
16
16
  f << StyledYAML.dump(deployment.deep_stringify_keys)
17
- f << StyledYAML.dump(pod_disruption_budget.deep_stringify_keys)
17
+ if get("replicas") || 1 > 1
18
+ f << StyledYAML.dump(pod_disruption_budget.deep_stringify_keys)
19
+ end
18
20
  end
19
21
  end
20
22
 
@@ -185,13 +187,7 @@ module Pfab
185
187
 
186
188
 
187
189
  def anti_affinity
188
- p = host_anti_affinity
189
- z = zone_anti_affinity
190
- printf("host anti affinity: %s\n", p)
191
- printf("zone anti affinity: %s\n", z)
192
- m = merge_anti_affinity(p, z)
193
- printf("merged anti affinity: %s\n", m)
194
- return m
190
+ return host_anti_affinity
195
191
  end
196
192
 
197
193
 
@@ -199,50 +195,57 @@ module Pfab
199
195
  anti_affinity_builder(ANTI_AFFINITY_MODE, ANTI_AFFINITY_PREFERRED_MODE_WEIGHT, "kubernetes.io/hostname")
200
196
  end
201
197
 
202
- def zone_anti_affinity
203
- anti_affinity_builder(ZONE_ANTI_AFFINITY_MODE, ZONE_ANTI_AFFINITY_PREFERRED_MODE_WEIGHT, "topology.kubernetes.io/zone")
204
- end
205
198
 
206
- def merge_anti_affinity(pod_anti_affinity, zone_anti_affinity)
207
- merged = {}
199
+ def topology_spread_constraints
200
+ waiveTopologySpreadConstraints = get("waiveTopologySpreadConstraints") || false
208
201
 
209
- if pod_anti_affinity.empty? && zone_anti_affinity.empty?
210
- merged = {}
211
- elsif pod_anti_affinity.empty?
212
- merged = zone_anti_affinity
213
- elsif zone_anti_affinity.empty?
214
- merged = pod_anti_affinity
215
- else
216
- merged[:podAntiAffinity] = {}
217
-
218
- required_key = :requiredDuringSchedulingIgnoredDuringExecution
219
- preferred_key = :preferredDuringSchedulingIgnoredDuringExecution
220
-
221
- [required_key, preferred_key].each do |key|
222
- if pod_anti_affinity.dig(:podAntiAffinity, key) && zone_anti_affinity.dig(:podAntiAffinity, key)
223
- merged[:podAntiAffinity][key] = pod_anti_affinity[:podAntiAffinity][key] + zone_anti_affinity[:podAntiAffinity][key]
224
- elsif pod_anti_affinity.dig(:podAntiAffinity, key)
225
- merged[:podAntiAffinity][key] = pod_anti_affinity[:podAntiAffinity][key]
226
- elsif zone_anti_affinity.dig(:podAntiAffinity, key)
227
- merged[:podAntiAffinity][key] = zone_anti_affinity[:podAntiAffinity][key]
228
- end
229
- end
230
- end
202
+ schedulingRule = waiveTopologySpreadConstraints ? "ScheduleAnyway" : "DoNotSchedule"
203
+
204
+ zone_constraint = {
205
+ maxSkew: 1,
206
+ topologyKey: "topology.kubernetes.io/zone",
207
+ whenUnsatisfiable: schedulingRule,
208
+ labelSelector: labelSelector
209
+ }
210
+ host_constraint = {
211
+ maxSkew: 1,
212
+ topologyKey: "kubernetes.io/hostname",
213
+ whenUnsatisfiable: schedulingRule,
214
+ labelSelector: labelSelector
231
215
 
232
- merged
216
+ }
217
+ [zone_constraint, host_constraint]
233
218
  end
234
219
 
235
220
 
221
+
222
+ def labelSelector
223
+ {
224
+ matchExpressions: [
225
+ {
226
+ key: "deployed-name",
227
+ operator: "In",
228
+ values: [
229
+ @data['deployed_name']
230
+ ]
231
+ },
232
+ {
233
+ key: "deployment-unique-id",
234
+ operator: "In",
235
+ values: [
236
+ StyledYAML.double_quoted(deploy_unique_id)
237
+ ]
238
+ }
239
+ ]
240
+ }
241
+ end
242
+
236
243
  def anti_affinity_builder(key, weight_key, topology_key)
237
244
  antiAffinityMode = get(key) || "disabled"
238
245
  if antiAffinityMode
239
246
  affinitySelector = {
240
247
  topologyKey: topology_key,
241
- labelSelector: {
242
- matchLabels: {
243
- "deployed-name" => @data['deployed_name'],
244
- },
245
- },
248
+ labelSelector: labelSelector,
246
249
  }
247
250
 
248
251
  return case antiAffinityMode
@@ -316,6 +319,7 @@ module Pfab
316
319
  "deployed-name" => @data['deployed_name'],
317
320
  "application-type" => application_type,
318
321
  "deploy-id" => deploy_id,
322
+ "deploy-unique-id" => StyledYAML.double_quoted(deploy_unique_id),
319
323
  "tags.datadoghq.com/env": @data['env'],
320
324
  "tags.datadoghq.com/service": @data['deployed_name'],
321
325
  "tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
@@ -343,6 +347,7 @@ module Pfab
343
347
  application: @data['application'],
344
348
  "deployed-name" => @data['deployed_name'],
345
349
  "application-type" => "web",
350
+ "deploy-unique-id" => StyledYAML.double_quoted(deploy_unique_id),
346
351
  "tags.datadoghq.com/env": @data['env'],
347
352
  "tags.datadoghq.com/service": @data['deployed_name'],
348
353
  "tags.datadoghq.com/version": StyledYAML.double_quoted(@data['sha'])
@@ -367,7 +372,7 @@ module Pfab
367
372
  volumeMounts: volume_mounts
368
373
  }.compact
369
374
  ],
370
- affinity: anti_affinity,
375
+ topologySpreadConstraints: topology_spread_constraints,
371
376
  volumes: volumes
372
377
  }.compact,
373
378
  },
data/lib/pfab/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Pfab
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 52
4
+ MINOR = 54
5
5
  PATCH = 0
6
6
  BUILD = nil
7
7
 
data/lib/pfab/yamls.rb CHANGED
@@ -2,7 +2,7 @@ require 'pry'
2
2
  module Pfab
3
3
  class Yamls
4
4
 
5
- def initialize(apps:, application_yaml:, image_name:, env:, sha:, config:)
5
+ def initialize(apps:, application_yaml:, image_name:, env:, sha:, config:, application_yaml_hash:)
6
6
  @apps = apps
7
7
  namespace = application_yaml.dig(env.to_s, "namespace") || application_yaml["namespace"]
8
8
  raise "No namespace founds" unless namespace
@@ -15,6 +15,7 @@ module Pfab
15
15
  'application' => application_yaml["name"],
16
16
  'application_yaml' => application_yaml,
17
17
  'namespace' => namespace,
18
+ 'application_yaml_hash' => application_yaml_hash
18
19
  }
19
20
  end
20
21
 
data/pfab.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: pfab 0.52.0 ruby lib
5
+ # stub: pfab 0.54.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "pfab".freeze
9
- s.version = "0.52.0"
9
+ s.version = "0.54.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2024-05-13"
14
+ s.date = "2024-05-15"
15
15
  s.description = "k8s helper".freeze
16
16
  s.email = "jdwyer@prefab.cloud".freeze
17
17
  s.executables = ["pfab".freeze]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pfab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.52.0
4
+ version: 0.54.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dwyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-13 00:00:00.000000000 Z
11
+ date: 2024-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander