Class: Kube::Cluster::Manifest::Stack

Inherits:
Object
  • Object
show all
Defined in:
lib/kube/cluster/manifest/stack.rb

Overview

An ordered pipeline of middleware that processes the full manifest at each stage. Each stage flat_maps individual resources through a single middleware — so generative middleware can introduce new resources that subsequent stages will see and process.

stack = Kube::Cluster::Manifest::Stack.new do
  use Middleware::ServiceForDeployment   # generates Services
  use Middleware::Labels, app: "web"      # labels everything, including generated Services
  use Middleware::ResourcePreset          # sizes everything
end

processed = stack.call(resources)

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ Stack

Returns a new instance of Stack.



20
21
22
23
# File 'lib/kube/cluster/manifest/stack.rb', line 20

def initialize(&block)
  @middleware = []
  instance_eval(&block) if block
end

Instance Method Details

#call(resources) ⇒ Array<Kube::Schema::Resource>

Run the full resource array through every middleware stage in order. At each stage, every resource is passed individually through the middleware. Middleware can return a single resource (transform) or an array of resources (generative). The results are collected into the array for the next stage.

Parameters:

  • resources (Array<Kube::Schema::Resource>)

Returns:

  • (Array<Kube::Schema::Resource>)


42
43
44
45
46
47
# File 'lib/kube/cluster/manifest/stack.rb', line 42

def call(resources)
  @middleware.reduce(resources) do |current, (klass, args, kwargs)|
    middleware = klass.new(*args, **kwargs)
    current.flat_map { |r| Array(middleware.call(r)) }
  end
end

#empty?Boolean

True when no middleware has been registered.

Returns:

  • (Boolean)


50
51
52
# File 'lib/kube/cluster/manifest/stack.rb', line 50

def empty?
  @middleware.empty?
end

#use(klass, *args, **kwargs) ⇒ Object

Register a middleware class with optional positional and keyword arguments.

Parameters:

  • klass (Class)

    a Middleware subclass

  • args (Array)

    positional arguments forwarded to klass.new

  • kwargs (Hash)

    keyword arguments forwarded to klass.new



30
31
32
# File 'lib/kube/cluster/manifest/stack.rb', line 30

def use(klass, *args, **kwargs)
  @middleware << [klass, args, kwargs]
end