metatron 0.11.2 → 0.11.3
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 +4 -4
- data/.release-please-manifest.json +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +5 -5
- data/lib/metatron/templates/concerns/route_resource.rb +34 -0
- data/lib/metatron/templates/gateway/listener.rb +28 -0
- data/lib/metatron/templates/gateway.rb +45 -0
- data/lib/metatron/templates/grpc_route/filter.rb +45 -0
- data/lib/metatron/templates/grpc_route/rule.rb +33 -0
- data/lib/metatron/templates/grpc_route.rb +53 -0
- data/lib/metatron/templates/http_route/filter.rb +44 -0
- data/lib/metatron/templates/http_route/rule.rb +33 -0
- data/lib/metatron/templates/http_route.rb +53 -0
- data/lib/metatron/templates/tcp_route/rule.rb +20 -0
- data/lib/metatron/templates/tcp_route.rb +43 -0
- data/lib/metatron/templates/tls_route/rule.rb +20 -0
- data/lib/metatron/templates/tls_route.rb +53 -0
- data/lib/metatron/templates/udp_route/rule.rb +20 -0
- data/lib/metatron/templates/udp_route.rb +43 -0
- data/lib/metatron/version.rb +1 -1
- data/lib/metatron.rb +15 -0
- metadata +17 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a46bbee8fe39f8373f5ec65dd4142bd490117024d18190db8092a10f2da64072
|
|
4
|
+
data.tar.gz: 3959470b07cf923a6df1fe5060b86bc8378016a9ce43590d07e3e9c7e691ba38
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 873d6df9d70638d47ccd3564ec8b56da41d7fefe3fdb72e99b806c27645f91321d34840c98c805584f2e257bf4bbedae4ab38d1c28a8c7b022ef09fe89e74768
|
|
7
|
+
data.tar.gz: 42a596702fdf60d0db2514f02b85681ea542fbe5899284e59899954ccce06751501397e4e99b960396697f1f1b1cbeec48f86bf8abeead91d3c77bbfb923feb0
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.11.3](https://github.com/jgnagy/metatron/compare/metatron/v0.11.2...metatron/v0.11.3) (2026-02-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add Gateway API resource templates (closes [#92](https://github.com/jgnagy/metatron/issues/92)) ([9820f78](https://github.com/jgnagy/metatron/commit/9820f786dfeff6148d6e5c81e46c628d8f5ca697))
|
|
9
|
+
|
|
3
10
|
## [0.11.2](https://github.com/jgnagy/metatron/compare/metatron/v0.11.1...metatron/v0.11.2) (2025-06-18)
|
|
4
11
|
|
|
5
12
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
metatron (0.11.
|
|
4
|
+
metatron (0.11.3)
|
|
5
5
|
base64
|
|
6
6
|
json (~> 2.6)
|
|
7
7
|
rack (>= 2.2.8, < 4)
|
|
@@ -25,9 +25,9 @@ GEM
|
|
|
25
25
|
language_server-protocol (3.17.0.4)
|
|
26
26
|
lint_roller (1.1.0)
|
|
27
27
|
logger (1.6.6)
|
|
28
|
-
nokogiri (1.18.
|
|
28
|
+
nokogiri (1.18.9-arm64-darwin)
|
|
29
29
|
racc (~> 1.4)
|
|
30
|
-
nokogiri (1.18.
|
|
30
|
+
nokogiri (1.18.9-x86_64-linux-gnu)
|
|
31
31
|
racc (~> 1.4)
|
|
32
32
|
observer (0.1.2)
|
|
33
33
|
ostruct (0.6.1)
|
|
@@ -36,7 +36,7 @@ GEM
|
|
|
36
36
|
ast (~> 2.4.1)
|
|
37
37
|
racc
|
|
38
38
|
racc (1.8.1)
|
|
39
|
-
rack (3.1.
|
|
39
|
+
rack (3.1.18)
|
|
40
40
|
rack-test (2.2.0)
|
|
41
41
|
rack (>= 1.3)
|
|
42
42
|
rainbow (3.1.1)
|
|
@@ -46,7 +46,7 @@ GEM
|
|
|
46
46
|
regexp_parser (2.10.0)
|
|
47
47
|
reverse_markdown (3.0.0)
|
|
48
48
|
nokogiri
|
|
49
|
-
rexml (3.4.
|
|
49
|
+
rexml (3.4.2)
|
|
50
50
|
rspec (3.13.0)
|
|
51
51
|
rspec-core (~> 3.13.0)
|
|
52
52
|
rspec-expectations (~> 3.13.0)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
module Concerns
|
|
6
|
+
# Provides common parent reference functionality for Gateway API route resources
|
|
7
|
+
module RouteResource
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.class_eval do
|
|
10
|
+
attr_reader :parent_refs
|
|
11
|
+
|
|
12
|
+
initializer :route_resource_initialize
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def route_resource_initialize
|
|
17
|
+
@parent_refs = []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def add_parent_ref(name:, namespace: nil, kind: "Gateway", section_name: nil, port: nil)
|
|
21
|
+
ref = { name:, kind: }
|
|
22
|
+
ref[:namespace] = namespace if namespace
|
|
23
|
+
ref[:sectionName] = section_name if section_name
|
|
24
|
+
ref[:port] = port if port
|
|
25
|
+
@parent_refs << ref
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def formatted_parent_refs
|
|
29
|
+
parent_refs.empty? ? {} : { parentRefs: parent_refs }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class Gateway
|
|
6
|
+
# Internal model for a Gateway listener
|
|
7
|
+
class Listener
|
|
8
|
+
attr_accessor :name, :port, :protocol, :hostname, :tls, :allowed_routes
|
|
9
|
+
|
|
10
|
+
def initialize(name, port:, protocol:, hostname: nil, tls: nil, allowed_routes: nil)
|
|
11
|
+
@name = name
|
|
12
|
+
@port = port
|
|
13
|
+
@protocol = protocol
|
|
14
|
+
@hostname = hostname
|
|
15
|
+
@tls = tls
|
|
16
|
+
@allowed_routes = allowed_routes
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def render
|
|
20
|
+
{ name:, port:, protocol: }
|
|
21
|
+
.merge(hostname ? { hostname: } : {})
|
|
22
|
+
.merge(tls ? { tls: } : {})
|
|
23
|
+
.merge(allowed_routes ? { allowedRoutes: allowed_routes } : {})
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for Gateway k8s resource (Gateway API)
|
|
6
|
+
class Gateway < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
|
|
10
|
+
attr_accessor :gateway_class_name, :additional_labels
|
|
11
|
+
attr_reader :listeners
|
|
12
|
+
|
|
13
|
+
def initialize(name, gateway_class_name:)
|
|
14
|
+
super(name)
|
|
15
|
+
@gateway_class_name = gateway_class_name
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@listeners = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_listener(listener = nil, **attrs)
|
|
22
|
+
@listeners << if listener.is_a?(Listener)
|
|
23
|
+
listener
|
|
24
|
+
else
|
|
25
|
+
Listener.new(attrs.delete(:name), **attrs)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def render
|
|
30
|
+
{
|
|
31
|
+
apiVersion:,
|
|
32
|
+
kind:,
|
|
33
|
+
metadata: {
|
|
34
|
+
name:,
|
|
35
|
+
labels: base_labels.merge(additional_labels)
|
|
36
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
37
|
+
spec: {
|
|
38
|
+
gatewayClassName: gateway_class_name,
|
|
39
|
+
listeners: listeners.map(&:render)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class GRPCRoute
|
|
6
|
+
# Internal model for a GRPCRoute filter.
|
|
7
|
+
# The +type+ must be the canonical CamelCase name (e.g.
|
|
8
|
+
# "RequestHeaderModifier", "ResponseHeaderModifier", "RequestMirror",
|
|
9
|
+
# "ExtensionRef"). All remaining keyword arguments become the type-specific
|
|
10
|
+
# configuration nested under the auto-derived camelCase key.
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
# Filter.new(
|
|
14
|
+
# type: "RequestHeaderModifier",
|
|
15
|
+
# add: [{ name: "X-Custom-Header", value: "custom-value" }]
|
|
16
|
+
# )
|
|
17
|
+
# # => { type: "RequestHeaderModifier",
|
|
18
|
+
# # requestHeaderModifier: { add: [{ ... }] } }
|
|
19
|
+
class Filter
|
|
20
|
+
attr_accessor :type, :config
|
|
21
|
+
|
|
22
|
+
def initialize(type:, **config)
|
|
23
|
+
@type = type
|
|
24
|
+
@config = config
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def render
|
|
28
|
+
{ type: }.merge(config.empty? ? {} : { type_key => config })
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def type_key
|
|
34
|
+
# PascalCase → lowerCamelCase, handling acronym prefixes:
|
|
35
|
+
# "RequestHeaderModifier" → :requestHeaderModifier
|
|
36
|
+
# "ExtensionRef" → :extensionRef
|
|
37
|
+
type
|
|
38
|
+
.sub(/\A([A-Z]+)(?=[A-Z][a-z])/, &:downcase)
|
|
39
|
+
.sub(/\A[A-Z]/, &:downcase)
|
|
40
|
+
.to_sym
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class GRPCRoute
|
|
6
|
+
# Internal model for a GRPCRoute rule
|
|
7
|
+
class Rule
|
|
8
|
+
attr_accessor :backend_refs, :matches
|
|
9
|
+
attr_reader :filters
|
|
10
|
+
|
|
11
|
+
def initialize(backend_refs:, matches: nil)
|
|
12
|
+
@backend_refs = backend_refs
|
|
13
|
+
@matches = matches
|
|
14
|
+
@filters = []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_filter(filter = nil, **attrs)
|
|
18
|
+
@filters << if filter.is_a?(Filter)
|
|
19
|
+
filter
|
|
20
|
+
else
|
|
21
|
+
Filter.new(**attrs)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def render
|
|
26
|
+
{ backendRefs: backend_refs }
|
|
27
|
+
.merge(matches ? { matches: } : {})
|
|
28
|
+
.merge(filters.empty? ? {} : { filters: filters.map(&:render) })
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for GRPCRoute k8s resource (Gateway API)
|
|
6
|
+
class GRPCRoute < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
include Concerns::RouteResource
|
|
10
|
+
|
|
11
|
+
attr_accessor :additional_labels
|
|
12
|
+
attr_reader :hostnames, :rules
|
|
13
|
+
|
|
14
|
+
def initialize(name)
|
|
15
|
+
super
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@hostnames = []
|
|
19
|
+
@rules = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_hostname(hostname)
|
|
23
|
+
@hostnames << hostname
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_rule(rule = nil, **attrs)
|
|
27
|
+
@rules << if rule.is_a?(Rule)
|
|
28
|
+
rule
|
|
29
|
+
else
|
|
30
|
+
Rule.new(**attrs)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def formatted_hostnames
|
|
35
|
+
hostnames.empty? ? {} : { hostnames: }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def render
|
|
39
|
+
{
|
|
40
|
+
apiVersion:,
|
|
41
|
+
kind:,
|
|
42
|
+
metadata: {
|
|
43
|
+
name:,
|
|
44
|
+
labels: base_labels.merge(additional_labels)
|
|
45
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
46
|
+
spec: formatted_parent_refs
|
|
47
|
+
.merge(formatted_hostnames)
|
|
48
|
+
.merge(rules.empty? ? {} : { rules: rules.map(&:render) })
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class HTTPRoute
|
|
6
|
+
# Internal model for an HTTPRoute filter.
|
|
7
|
+
# The +type+ must be the canonical CamelCase name (e.g. "URLRewrite",
|
|
8
|
+
# "RequestHeaderModifier"). All remaining keyword arguments become the
|
|
9
|
+
# type-specific configuration nested under the auto-derived camelCase key.
|
|
10
|
+
#
|
|
11
|
+
# Example:
|
|
12
|
+
# Filter.new(
|
|
13
|
+
# type: "URLRewrite",
|
|
14
|
+
# hostname: "example.net",
|
|
15
|
+
# path: { type: "ReplacePrefixMatch", replacePrefixMatch: "/new-prefix" }
|
|
16
|
+
# )
|
|
17
|
+
# # => { type: "URLRewrite", urlRewrite: { hostname: "example.net", path: { ... } } }
|
|
18
|
+
class Filter
|
|
19
|
+
attr_accessor :type, :config
|
|
20
|
+
|
|
21
|
+
def initialize(type:, **config)
|
|
22
|
+
@type = type
|
|
23
|
+
@config = config
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def render
|
|
27
|
+
{ type: }.merge(config.empty? ? {} : { type_key => config })
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def type_key
|
|
33
|
+
# PascalCase → lowerCamelCase, handling acronym prefixes:
|
|
34
|
+
# "URLRewrite" → :urlRewrite
|
|
35
|
+
# "RequestHeaderModifier" → :requestHeaderModifier
|
|
36
|
+
type
|
|
37
|
+
.sub(/\A([A-Z]+)(?=[A-Z][a-z])/, &:downcase)
|
|
38
|
+
.sub(/\A[A-Z]/, &:downcase)
|
|
39
|
+
.to_sym
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class HTTPRoute
|
|
6
|
+
# Internal model for an HTTPRoute rule
|
|
7
|
+
class Rule
|
|
8
|
+
attr_accessor :backend_refs, :matches
|
|
9
|
+
attr_reader :filters
|
|
10
|
+
|
|
11
|
+
def initialize(backend_refs:, matches: nil)
|
|
12
|
+
@backend_refs = backend_refs
|
|
13
|
+
@matches = matches
|
|
14
|
+
@filters = []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_filter(filter = nil, **attrs)
|
|
18
|
+
@filters << if filter.is_a?(Filter)
|
|
19
|
+
filter
|
|
20
|
+
else
|
|
21
|
+
Filter.new(**attrs)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def render
|
|
26
|
+
{ backendRefs: backend_refs }
|
|
27
|
+
.merge(matches ? { matches: } : {})
|
|
28
|
+
.merge(filters.empty? ? {} : { filters: filters.map(&:render) })
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for HTTPRoute k8s resource (Gateway API)
|
|
6
|
+
class HTTPRoute < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
include Concerns::RouteResource
|
|
10
|
+
|
|
11
|
+
attr_accessor :additional_labels
|
|
12
|
+
attr_reader :hostnames, :rules
|
|
13
|
+
|
|
14
|
+
def initialize(name)
|
|
15
|
+
super
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@hostnames = []
|
|
19
|
+
@rules = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_hostname(hostname)
|
|
23
|
+
@hostnames << hostname
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_rule(rule = nil, **attrs)
|
|
27
|
+
@rules << if rule.is_a?(Rule)
|
|
28
|
+
rule
|
|
29
|
+
else
|
|
30
|
+
Rule.new(**attrs)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def formatted_hostnames
|
|
35
|
+
hostnames.empty? ? {} : { hostnames: }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def render
|
|
39
|
+
{
|
|
40
|
+
apiVersion:,
|
|
41
|
+
kind:,
|
|
42
|
+
metadata: {
|
|
43
|
+
name:,
|
|
44
|
+
labels: base_labels.merge(additional_labels)
|
|
45
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
46
|
+
spec: formatted_parent_refs
|
|
47
|
+
.merge(formatted_hostnames)
|
|
48
|
+
.merge(rules.empty? ? {} : { rules: rules.map(&:render) })
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class TCPRoute
|
|
6
|
+
# Internal model for a TCPRoute rule
|
|
7
|
+
class Rule
|
|
8
|
+
attr_accessor :backend_refs
|
|
9
|
+
|
|
10
|
+
def initialize(backend_refs:)
|
|
11
|
+
@backend_refs = backend_refs
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
{ backendRefs: backend_refs }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for TCPRoute k8s resource (Gateway API)
|
|
6
|
+
class TCPRoute < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
include Concerns::RouteResource
|
|
10
|
+
|
|
11
|
+
attr_accessor :additional_labels
|
|
12
|
+
attr_reader :rules
|
|
13
|
+
|
|
14
|
+
def initialize(name)
|
|
15
|
+
super
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1alpha2"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@rules = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_rule(rule = nil, **attrs)
|
|
22
|
+
@rules << if rule.is_a?(Rule)
|
|
23
|
+
rule
|
|
24
|
+
else
|
|
25
|
+
Rule.new(**attrs)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def render
|
|
30
|
+
{
|
|
31
|
+
apiVersion:,
|
|
32
|
+
kind:,
|
|
33
|
+
metadata: {
|
|
34
|
+
name:,
|
|
35
|
+
labels: base_labels.merge(additional_labels)
|
|
36
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
37
|
+
spec: formatted_parent_refs
|
|
38
|
+
.merge(rules.empty? ? {} : { rules: rules.map(&:render) })
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class TLSRoute
|
|
6
|
+
# Internal model for a TLSRoute rule
|
|
7
|
+
class Rule
|
|
8
|
+
attr_accessor :backend_refs
|
|
9
|
+
|
|
10
|
+
def initialize(backend_refs:)
|
|
11
|
+
@backend_refs = backend_refs
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
{ backendRefs: backend_refs }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for TLSRoute k8s resource (Gateway API)
|
|
6
|
+
class TLSRoute < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
include Concerns::RouteResource
|
|
10
|
+
|
|
11
|
+
attr_accessor :additional_labels
|
|
12
|
+
attr_reader :hostnames, :rules
|
|
13
|
+
|
|
14
|
+
def initialize(name)
|
|
15
|
+
super
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@hostnames = []
|
|
19
|
+
@rules = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_hostname(hostname)
|
|
23
|
+
@hostnames << hostname
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_rule(rule = nil, **attrs)
|
|
27
|
+
@rules << if rule.is_a?(Rule)
|
|
28
|
+
rule
|
|
29
|
+
else
|
|
30
|
+
Rule.new(**attrs)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def formatted_hostnames
|
|
35
|
+
hostnames.empty? ? {} : { hostnames: }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def render
|
|
39
|
+
{
|
|
40
|
+
apiVersion:,
|
|
41
|
+
kind:,
|
|
42
|
+
metadata: {
|
|
43
|
+
name:,
|
|
44
|
+
labels: base_labels.merge(additional_labels)
|
|
45
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
46
|
+
spec: formatted_parent_refs
|
|
47
|
+
.merge(formatted_hostnames)
|
|
48
|
+
.merge(rules.empty? ? {} : { rules: rules.map(&:render) })
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
class UDPRoute
|
|
6
|
+
# Internal model for a UDPRoute rule
|
|
7
|
+
class Rule
|
|
8
|
+
attr_accessor :backend_refs
|
|
9
|
+
|
|
10
|
+
def initialize(backend_refs:)
|
|
11
|
+
@backend_refs = backend_refs
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
{ backendRefs: backend_refs }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Metatron
|
|
4
|
+
module Templates
|
|
5
|
+
# Template for UDPRoute k8s resource (Gateway API)
|
|
6
|
+
class UDPRoute < Template
|
|
7
|
+
include Concerns::Annotated
|
|
8
|
+
include Concerns::Namespaced
|
|
9
|
+
include Concerns::RouteResource
|
|
10
|
+
|
|
11
|
+
attr_accessor :additional_labels
|
|
12
|
+
attr_reader :rules
|
|
13
|
+
|
|
14
|
+
def initialize(name)
|
|
15
|
+
super
|
|
16
|
+
@api_version = "gateway.networking.k8s.io/v1alpha2"
|
|
17
|
+
@additional_labels = {}
|
|
18
|
+
@rules = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_rule(rule = nil, **attrs)
|
|
22
|
+
@rules << if rule.is_a?(Rule)
|
|
23
|
+
rule
|
|
24
|
+
else
|
|
25
|
+
Rule.new(**attrs)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def render
|
|
30
|
+
{
|
|
31
|
+
apiVersion:,
|
|
32
|
+
kind:,
|
|
33
|
+
metadata: {
|
|
34
|
+
name:,
|
|
35
|
+
labels: base_labels.merge(additional_labels)
|
|
36
|
+
}.merge(formatted_annotations).merge(formatted_namespace),
|
|
37
|
+
spec: formatted_parent_refs
|
|
38
|
+
.merge(rules.empty? ? {} : { rules: rules.map(&:render) })
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/metatron/version.rb
CHANGED
data/lib/metatron.rb
CHANGED
|
@@ -24,6 +24,7 @@ require "metatron/template"
|
|
|
24
24
|
require "metatron/templates/concerns/annotated"
|
|
25
25
|
require "metatron/templates/concerns/namespaced"
|
|
26
26
|
require "metatron/templates/concerns/pod_producer"
|
|
27
|
+
require "metatron/templates/concerns/route_resource"
|
|
27
28
|
require "metatron/templates/container"
|
|
28
29
|
require "metatron/templates/pod"
|
|
29
30
|
require "metatron/templates/job"
|
|
@@ -33,7 +34,21 @@ require "metatron/templates/cluster_role_binding"
|
|
|
33
34
|
require "metatron/templates/cron_job"
|
|
34
35
|
require "metatron/templates/daemon_set"
|
|
35
36
|
require "metatron/templates/deployment"
|
|
37
|
+
require "metatron/templates/gateway"
|
|
38
|
+
require "metatron/templates/gateway/listener"
|
|
39
|
+
require "metatron/templates/grpc_route"
|
|
40
|
+
require "metatron/templates/grpc_route/rule"
|
|
41
|
+
require "metatron/templates/grpc_route/filter"
|
|
42
|
+
require "metatron/templates/http_route"
|
|
43
|
+
require "metatron/templates/http_route/rule"
|
|
44
|
+
require "metatron/templates/http_route/filter"
|
|
36
45
|
require "metatron/templates/ingress"
|
|
46
|
+
require "metatron/templates/tcp_route"
|
|
47
|
+
require "metatron/templates/tcp_route/rule"
|
|
48
|
+
require "metatron/templates/tls_route"
|
|
49
|
+
require "metatron/templates/tls_route/rule"
|
|
50
|
+
require "metatron/templates/udp_route"
|
|
51
|
+
require "metatron/templates/udp_route/rule"
|
|
37
52
|
require "metatron/templates/limit_range"
|
|
38
53
|
require "metatron/templates/namespace"
|
|
39
54
|
require "metatron/templates/network_policy"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: metatron
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.11.
|
|
4
|
+
version: 0.11.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jonathan Gnagy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-02-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: base64
|
|
@@ -260,11 +260,20 @@ files:
|
|
|
260
260
|
- lib/metatron/templates/concerns/annotated.rb
|
|
261
261
|
- lib/metatron/templates/concerns/namespaced.rb
|
|
262
262
|
- lib/metatron/templates/concerns/pod_producer.rb
|
|
263
|
+
- lib/metatron/templates/concerns/route_resource.rb
|
|
263
264
|
- lib/metatron/templates/config_map.rb
|
|
264
265
|
- lib/metatron/templates/container.rb
|
|
265
266
|
- lib/metatron/templates/cron_job.rb
|
|
266
267
|
- lib/metatron/templates/daemon_set.rb
|
|
267
268
|
- lib/metatron/templates/deployment.rb
|
|
269
|
+
- lib/metatron/templates/gateway.rb
|
|
270
|
+
- lib/metatron/templates/gateway/listener.rb
|
|
271
|
+
- lib/metatron/templates/grpc_route.rb
|
|
272
|
+
- lib/metatron/templates/grpc_route/filter.rb
|
|
273
|
+
- lib/metatron/templates/grpc_route/rule.rb
|
|
274
|
+
- lib/metatron/templates/http_route.rb
|
|
275
|
+
- lib/metatron/templates/http_route/filter.rb
|
|
276
|
+
- lib/metatron/templates/http_route/rule.rb
|
|
268
277
|
- lib/metatron/templates/ingress.rb
|
|
269
278
|
- lib/metatron/templates/job.rb
|
|
270
279
|
- lib/metatron/templates/limit_range.rb
|
|
@@ -281,6 +290,12 @@ files:
|
|
|
281
290
|
- lib/metatron/templates/service.rb
|
|
282
291
|
- lib/metatron/templates/service_account.rb
|
|
283
292
|
- lib/metatron/templates/stateful_set.rb
|
|
293
|
+
- lib/metatron/templates/tcp_route.rb
|
|
294
|
+
- lib/metatron/templates/tcp_route/rule.rb
|
|
295
|
+
- lib/metatron/templates/tls_route.rb
|
|
296
|
+
- lib/metatron/templates/tls_route/rule.rb
|
|
297
|
+
- lib/metatron/templates/udp_route.rb
|
|
298
|
+
- lib/metatron/templates/udp_route/rule.rb
|
|
284
299
|
- lib/metatron/templates/volume_snapshot.rb
|
|
285
300
|
- lib/metatron/templates/volume_snapshot_content.rb
|
|
286
301
|
- lib/metatron/version.rb
|