Skip to content

Commit cf77f5f

Browse files
authored
Merge pull request #53 from jgnagy/feat/add-limitrange-resource
Adding support for LimitRange resource
2 parents 8d86cf1 + b779d47 commit cf77f5f

File tree

7 files changed

+133
-2
lines changed

7 files changed

+133
-2
lines changed

.rubocop.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ Metrics/ClassLength:
3535
Exclude:
3636
- 'spec/**/*_spec.rb'
3737

38+
Metrics/ParameterLists:
39+
Max: 6
40+
3841
Gemspec/RequireMFA:
3942
Enabled: false
4043

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
metatron (0.8.6)
4+
metatron (0.8.7)
55
json (~> 2.6)
66
rack (>= 2.2.8, < 4)
77

lib/metatron.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ConfigError < Error; end
3131
require "metatron/templates/daemon_set"
3232
require "metatron/templates/deployment"
3333
require "metatron/templates/ingress"
34+
require "metatron/templates/limit_range"
3435
require "metatron/templates/namespace"
3536
require "metatron/templates/network_policy"
3637
require "metatron/templates/persistent_volume_claim"

lib/metatron/controller.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require "json" unless defined? JSON # allow for JSON to be loaded elsewhere
4+
35
module Metatron
46
# Base class for API services
57
class Controller
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# frozen_string_literal: true
2+
3+
module Metatron
4+
module Templates
5+
# The LimitRange Kubernetes resource
6+
class LimitRange < Template
7+
# Limit is an internal class used to represent the limits in a LimitRange resource,
8+
# and to provide a consistent interface for rendering them. It is not intended to be
9+
# used outside of this class. Eventually, it may be used to provide validation for
10+
# the limits.
11+
class Limit
12+
attr_accessor :type, :default, :default_request, :max, :max_limit_request_ratio, :min
13+
14+
alias defaultRequest default_request
15+
alias maxLimitRequestRatio max_limit_request_ratio
16+
17+
class << self
18+
def to_limit(limit)
19+
limit.is_a?(Limit) ? limit : new(**limit)
20+
end
21+
end
22+
23+
def initialize(type:, default: nil, default_request: nil, max: nil,
24+
max_limit_request_ratio: nil, min: nil)
25+
@type = type
26+
@default = default
27+
@default_request = default_request
28+
@max = max
29+
@max_limit_request_ratio = max_limit_request_ratio
30+
@min = min
31+
end
32+
33+
def render
34+
{
35+
type:,
36+
default:,
37+
defaultRequest:,
38+
max:,
39+
maxLimitRequestRatio:,
40+
min:
41+
}.compact
42+
end
43+
end
44+
45+
include Concerns::Annotated
46+
include Concerns::Namespaced
47+
48+
attr_accessor :limits
49+
50+
def initialize(name, limits = [])
51+
super(name)
52+
@limits = limits
53+
end
54+
55+
def render
56+
{
57+
apiVersion:,
58+
kind:,
59+
metadata: {
60+
name:,
61+
labels: base_labels.merge(additional_labels)
62+
}.merge(formatted_annotations).merge(formatted_namespace),
63+
spec: formatted_limits
64+
}.compact
65+
end
66+
67+
private
68+
69+
def formatted_limits
70+
return {} if limits.empty?
71+
72+
{ limits: limits.map { Limit.to_limit(_1).render } }
73+
end
74+
end
75+
end
76+
end

lib/metatron/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module Metatron
4-
VERSION = "0.8.6"
4+
VERSION = "0.8.7"
55
end
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe Metatron::Templates::LimitRange do
4+
describe "for simple limit ranges" do
5+
let(:limit_range) do
6+
limit_range = described_class.new("test-limit-range")
7+
limit_range.namespace = "test-namespace"
8+
limit_range.limits << {
9+
type: "Container",
10+
default: { cpu: "500m" },
11+
default_request: { cpu: "500m" },
12+
max: { cpu: "1" },
13+
min: { cpu: "100m" }
14+
}
15+
limit_range
16+
end
17+
18+
let(:rendered_limit_range) do
19+
{
20+
apiVersion: "v1",
21+
kind: "LimitRange",
22+
metadata: {
23+
labels: { "metatron.therubyist.org/name": "test-limit-range" },
24+
name: "test-limit-range",
25+
namespace: "test-namespace"
26+
},
27+
spec: {
28+
limits: [
29+
{
30+
default: { cpu: "500m" },
31+
defaultRequest: { cpu: "500m" },
32+
max: { cpu: "1" },
33+
min: { cpu: "100m" },
34+
type: "Container"
35+
}
36+
]
37+
}
38+
}
39+
end
40+
41+
it "produces a hash" do
42+
expect(limit_range.render).to be_a(Hash)
43+
end
44+
45+
it "renders properly" do
46+
expect(limit_range.render).to eq(rendered_limit_range)
47+
end
48+
end
49+
end

0 commit comments

Comments
 (0)