kubernetes.rb 2.8 KB
Newer Older
1 2 3
module Clusters
  module Platforms
    class Kubernetes < ActiveRecord::Base
S
Shinya Maeda 已提交
4
      self.table_name = 'cluster_platforms_kubernetes'
5

S
Shinya Maeda 已提交
6
      belongs_to :cluster, inverse_of: :platform_kubernetes, class_name: 'Clusters::Cluster'
7 8 9 10 11 12 13 14 15 16 17

      attr_encrypted :password,
        mode: :per_attribute_iv,
        key: Gitlab::Application.secrets.db_key_base,
        algorithm: 'aes-256-cbc'

      attr_encrypted :token,
        mode: :per_attribute_iv,
        key: Gitlab::Application.secrets.db_key_base,
        algorithm: 'aes-256-cbc'

S
Shinya Maeda 已提交
18 19
      before_validation :enforce_namespace_to_lower_case

20 21 22 23 24 25 26 27
      validates :namespace,
        allow_blank: true,
        length: 1..63,
        format: {
          with: Gitlab::Regex.kubernetes_namespace_regex,
          message: Gitlab::Regex.kubernetes_namespace_regex_message
        }

28
      # We expect to be `active?` only when enabled and cluster is created (the api_url is assigned)
29 30
      validates :api_url, url: true, presence: true
      validates :token, presence: true
31

32 33
      # TODO: Glue code till we migrate Kubernetes Integration into Platforms::Kubernetes
      after_destroy :destroy_kubernetes_integration!
S
Shinya Maeda 已提交
34 35 36 37 38 39 40 41 42 43 44

      alias_attribute :ca_pem, :ca_cert

      delegate :project, to: :cluster, allow_nil: true
      delegate :enabled?, to: :cluster, allow_nil: true

      class << self
        def namespace_for_project(project)
          "#{project.path}-#{project.id}"
        end
      end
45 46 47 48 49 50 51 52 53

      def actual_namespace
        if namespace.present?
          namespace
        else
          default_namespace
        end
      end

S
Shinya Maeda 已提交
54 55 56 57
      def default_namespace
        self.class.namespace_for_project(project) if project
      end

58 59 60
      def update_kubernetes_integration!
        raise 'Kubernetes service already configured' unless manages_kubernetes_service?

61 62 63
        # This is neccesary, otheriwse enabled? returns true even though cluster updated with enabled: false
        cluster.reload

S
Shinya Maeda 已提交
64
        ensure_kubernetes_service&.update!(
65 66 67 68 69 70 71 72
          active: enabled?,
          api_url: api_url,
          namespace: namespace,
          token: token,
          ca_pem: ca_cert
        )
      end

73
      private
74

75 76
      def enforce_namespace_to_lower_case
        self.namespace = self.namespace&.downcase
77 78
      end

79 80 81
      # TODO: glue code till we migrate Kubernetes Service into Platforms::Kubernetes class
      def manages_kubernetes_service?
        return true unless kubernetes_service&.active?
82

83
        kubernetes_service.api_url == api_url
84 85
      end

86 87
      def destroy_kubernetes_integration!
        return unless manages_kubernetes_service?
88

S
Shinya Maeda 已提交
89
        kubernetes_service&.destroy!
90 91
      end

92
      def kubernetes_service
93
        @kubernetes_service ||= project&.kubernetes_service
94 95
      end

96
      def ensure_kubernetes_service
97
        @kubernetes_service ||= kubernetes_service || project&.build_kubernetes_service
98 99 100 101
      end
    end
  end
end