diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/gcp/cluster.rb | 90 | ||||
-rw-r--r-- | app/models/project.rb | 1 |
2 files changed, 91 insertions, 0 deletions
diff --git a/app/models/gcp/cluster.rb b/app/models/gcp/cluster.rb new file mode 100644 index 00000000000..8b39bedad55 --- /dev/null +++ b/app/models/gcp/cluster.rb @@ -0,0 +1,90 @@ +module Gcp + class Cluster < ActiveRecord::Base + extend Gitlab::Gcp::Model + + belongs_to :project, inverse_of: :cluster + belongs_to :user + belongs_to :service + + attr_encrypted :password, + mode: :per_attribute_iv, + key: Gitlab::Application.secrets.db_key_base, + algorithm: 'aes-256-cbc' + + attr_encrypted :kubernetes_token, + mode: :per_attribute_iv, + key: Gitlab::Application.secrets.db_key_base, + algorithm: 'aes-256-cbc' + + attr_encrypted :gcp_token, + mode: :per_attribute_iv, + key: Gitlab::Application.secrets.db_key_base, + algorithm: 'aes-256-cbc' + + enum status: { + unknown: nil, + scheduled: 1, + creating: 2, + created: 3, + errored: 4 + } + + validates :gcp_project_id, presence: true + validates :gcp_cluster_zone, presence: true + validates :gcp_cluster_name, presence: true + validates :gcp_cluster_size, presence: true, + numericality: { only_integer: true, greater_than: 0 } + validate :restrict_modification, on: :update + + def errored!(reason) + self.status = :errored + self.status_reason = reason + self.gcp_token = nil + + save!(validate: false) + end + + def creating!(gcp_operation_id) + self.status = :creating + self.gcp_operation_id = gcp_operation_id + + save!(validate: false) + end + + def created!(endpoint, ca_cert, kubernetes_token, username, password) + self.status = :created + self.enabled = true + self.endpoint = endpoint + self.ca_cert = ca_cert + self.kubernetes_token = kubernetes_token + self.username = username + self.password = password + self.service = project.find_or_initialize_service('kubernetes') + self.gcp_token = nil + self.gcp_operation_id = nil + + save! + end + + def on_creation? + scheduled? || creating? + end + + def api_url + 'https://' + endpoint + end + + def restrict_modification + if on_creation? + errors.add(:base, "cannot modify during creation") + return false + end + + true + end + + def destroy + super if restrict_modification + end + end +end diff --git a/app/models/project.rb b/app/models/project.rb index 44d1190cc5b..fd171cc7941 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -164,6 +164,7 @@ class Project < ActiveRecord::Base has_one :import_data, class_name: 'ProjectImportData', inverse_of: :project, autosave: true has_one :project_feature, inverse_of: :project has_one :statistics, class_name: 'ProjectStatistics' + has_one :cluster, class_name: 'Gcp::Cluster', inverse_of: :project # Container repositories need to remove data from the container registry, # which is not managed by the DB. Hence we're still using dependent: :destroy |