Class: Kube::Cluster::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/kube/cluster/middleware.rb,
lib/kube/cluster/middleware/stack.rb,
lib/kube/cluster/middleware/labels.rb,
lib/kube/cluster/middleware/namespace.rb,
lib/kube/cluster/middleware/annotations.rb,
lib/kube/cluster/middleware/resource_preset.rb,
lib/kube/cluster/middleware/security_context.rb,
lib/kube/cluster/middleware/pod_anti_affinity.rb,
lib/kube/cluster/middleware/hpa_for_deployment.rb,
lib/kube/cluster/middleware/ingress_for_service.rb,
lib/kube/cluster/middleware/service_for_deployment.rb

Overview

Base class for manifest middleware.

Middleware receives the full manifest and mutates it in place. Each middleware is responsible for iterating resources as needed.

Transform example:

class AddTeamLabel < Middleware
  def call(manifest)
    manifest.resources.map! do |resource|
      h = resource.to_h
      h[:metadata][:labels][:"app.kubernetes.io/team"] = "platform"
      resource.rebuild(h)
    end
  end
end

Generative example:

class ServiceForDeployment < Middleware
  def call(manifest)
    generated = []
    manifest.resources.each do |resource|
      next unless resource.pod_bearing?
      generated << build_service_from(resource)
    end
    manifest.resources.concat(generated)
  end
end

Defined Under Namespace

Classes: Annotations, HPAForDeployment, IngressForService, Labels, Namespace, PodAntiAffinity, ResourcePreset, SecurityContext, ServiceForDeployment, Stack

Constant Summary collapse

DEFAULT_FILTER =
-> (x) {true}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filter: DEFAULT_FILTER, **opts) ⇒ Middleware

Returns a new instance of Middleware.



53
54
55
56
# File 'lib/kube/cluster/middleware.rb', line 53

def initialize(filter: DEFAULT_FILTER, **opts)
  @filter = filter
  @opts = opts
end

Class Method Details

.build(**defaults, &block) ⇒ Object

Build an anonymous middleware class from a block. The block becomes the #call method and runs via instance_exec, so filter, deep_merge, and @opts are all available inside it.

Middleware.build(filter: ->(r) { r.pod_bearing? }) do |manifest|
  manifest.resources.map! do |resource|
    filter(resource) do
      h = resource.to_h
      h[:metadata][:labels][:custom] = "yes"
      resource.rebuild(h)
    end
  end
end


73
74
75
76
77
78
79
80
81
# File 'lib/kube/cluster/middleware.rb', line 73

def self.build(**defaults, &block)
  Class.new(self) do
    define_method(:initialize) do |**overrides|
      super(**defaults, **overrides)
    end

    define_method(:call, &block)
  end
end

Instance Method Details

#call(manifest) ⇒ Object

Override in subclasses. Receives the full manifest, mutates it in place.



106
107
# File 'lib/kube/cluster/middleware.rb', line 106

def call(manifest)
end

#filter(resource, &block) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/kube/cluster/middleware.rb', line 83

def filter(resource, &block)
  # In case super() wasn't called by the middleware.
  unless @filter.respond_to?(:call)
    @filter = DEFAULT_FILTER
  end

  # Usage:
  #   def call(manifest)
  #     manifest.resources.map! do |resource|
  #       filter(resource) do
  #         # ... middleware code here
  #       end
  #     end
  #   end
  if @filter.call(resource)
    instance_exec(&block)
  else
    resource
  end
end