kubernetes.rb 2.7 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 61 62 63 64 65 66 67 68 69
      def update_kubernetes_integration!
        raise 'Kubernetes service already configured' unless manages_kubernetes_service?

        ensure_kubernetes_service.update!(
          active: enabled?,
          api_url: api_url,
          namespace: namespace,
          token: token,
          ca_pem: ca_cert
        )
      end

70
      private
71

72 73
      def enforce_namespace_to_lower_case
        self.namespace = self.namespace&.downcase
74 75
      end

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

80
        kubernetes_service.api_url == api_url
81 82
      end

83 84
      def destroy_kubernetes_integration!
        return unless manages_kubernetes_service?
85

86
        kubernetes_service.destroy!
87 88
      end

89
      def kubernetes_service
90
        @kubernetes_service ||= project&.kubernetes_service
91 92
      end

93
      def ensure_kubernetes_service
94
        @kubernetes_service ||= kubernetes_service || project&.build_kubernetes_service
95 96 97 98
      end
    end
  end
end