lib/metatron/templates/concerns/pod_producer.rb in metatron-0.2.2 vs lib/metatron/templates/concerns/pod_producer.rb in metatron-0.2.3

- old
+ new

@@ -3,41 +3,84 @@ module Metatron module Templates module Concerns # A mixin to assist with templating Kubernetes resources that create Pods module PodProducer - def self.included(base) + def self.included(base) # rubocop:disable Metrics/MethodLength # base.extend ClassMethods base.class_eval do - attr_accessor :additional_labels, :additional_pod_labels, - :security_context, :volumes, :containers, :init_containers, - :affinity, :termination_grace_period_seconds, - :tolerations, :pod_annotations, :persistent_volume_claims + attr_accessor :active_deadline_seconds, :additional_labels, :additional_pod_labels, + :affinity, :automount_service_account_token, :containers, + :dns_policy, :enable_service_links, :hostname, :host_ipc, :host_network, + :host_pid, :image_pull_secrets, :init_containers, :node_selector, + :node_name, :persistent_volume_claims, :pod_annotations, :restart_policy, + :scheduler_name, :security_context, :service_account, + :service_account_name, :share_process_namespace, :subdomain, + :termination_grace_period_seconds, :tolerations, :volumes initializer :pod_producer_initialize + alias_method :activeDeadlineSeconds, :active_deadline_seconds + alias_method :automountServiceAccountToken, :automount_service_account_token + alias_method :dnsPolicy, :dns_policy + alias_method :enableServiceLinks, :enable_service_links + alias_method :hostIPC, :host_ipc + alias_method :hostNetwork, :host_network + alias_method :hostPID, :host_pid + alias_method :nodeSelector, :node_selector + alias_method :nodeName, :node_name + alias_method :restartPolicy, :restart_policy + alias_method :schedulerName, :scheduler_name alias_method :securityContext, :security_context + alias_method :serviceAccount, :service_account + alias_method :serviceAccountName, :service_account_name + alias_method :shareProcessNamespace, :share_process_namespace alias_method :terminationGracePeriodSeconds, :termination_grace_period_seconds end end def pod_producer_initialize + @additional_labels = {} + @additional_pod_labels = {} @affinity = {} - @volumes = [] - @security_context = {} @containers = [] + @enable_service_links = nil + @image_pull_secrets = [] @init_containers = [] - @additional_labels = {} - @additional_pod_labels = {} + @node_selector = {} + @persistent_volume_claims = [] @pod_annotations = {} + @restart_policy = nil + @security_context = {} @termination_grace_period_seconds = nil @tolerations = [] - @persistent_volume_claims = [] + @volumes = [] end def formatted_affinity = affinity && !affinity.empty? ? { affinity: } : {} + def formatted_containers = { containers: containers.map(&:render) } + def formatted_image_pull_secrets + if image_pull_secrets&.any? + { imagePullSecrets: image_pull_secrets.map { _1.is_a?(String) ? { name: _1 } : _1 } } + else + {} + end + end + + def formatted_init_containers + if init_containers&.any? + { initContainers: init_containers.map(&:render) } + else + {} + end + end + + def formatted_node_selector + node_selector && !node_selector.empty? ? { nodeSelector: } : {} + end + def formatted_pod_annotations pod_annotations && !pod_annotations.empty? ? { annotations: pod_annotations } : {} end def formatted_security_context @@ -55,9 +98,58 @@ end } else {} end + end + + def pod_metadata + { + metadata: { + labels: { "#{label_namespace}/name": name }.merge(additional_pod_labels) + }.merge(formatted_pod_annotations) + } + end + + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/MethodLength + def pod_spec + { + spec: { + activeDeadlineSeconds:, + automountServiceAccountToken:, + dnsPolicy:, + enableServiceLinks:, + hostIPC:, + hostNetwork:, + hostPID:, + hostname:, + nodeName:, + restartPolicy:, + schedulerName:, + serviceAccount:, + serviceAccountName:, + shareProcessNamespace:, + subdomain:, + terminationGracePeriodSeconds: + }.merge(formatted_volumes) + .merge(formatted_affinity) + .merge(formatted_tolerations) + .merge(formatted_security_context) + .merge(formatted_containers) + .merge(formatted_init_containers) + .merge(formatted_image_pull_secrets) + .merge(formatted_node_selector) + .compact + }.compact + end + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/MethodLength + + def pod_template + { + template: {}.merge(pod_metadata).merge(pod_spec).compact + } end end end end end