summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2017-12-14 00:17:56 +0900
committerShinya Maeda <shinya@gitlab.com>2018-01-08 16:22:17 +0900
commitb9fbfe5a6b21bed39010224fd012366d3d39b117 (patch)
tree3782231bc294ae059d5fca2a84d8c7598357f137
parente4745492821440b47a48b75e8786d049fde50fca (diff)
downloadgitlab-ce-b9fbfe5a6b21bed39010224fd012366d3d39b117.tar.gz
Fix unmanaged_kubernetes_service scope for multiple clusters
-rw-r--r--db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb44
1 files changed, 27 insertions, 17 deletions
diff --git a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb b/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb
index e1e02c2852a..4b9e3094f94 100644
--- a/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb
+++ b/db/post_migrate/20171124104327_migrate_kubernetes_service_to_new_clusters_architectures.rb
@@ -1,13 +1,12 @@
class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migration
DOWNTIME = false
- DEFAULT_KUBERNETES_SERVICE_CLUSTER_NAME = 'KubernetesService'
+ DEFAULT_KUBERNETES_SERVICE_CLUSTER_NAME = 'KubernetesService'.freeze
class Cluster < ActiveRecord::Base
self.table_name = 'clusters'
has_many :cluster_projects, class_name: 'ClustersProject'
has_many :projects, through: :cluster_projects, class_name: 'Project'
- has_one :provider_gcp, class_name: 'ProvidersGcp'
has_one :platform_kubernetes, class_name: 'PlatformsKubernetes'
attr_encrypted :token,
@@ -15,7 +14,6 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati
key: Gitlab::Application.secrets.db_key_base,
algorithm: 'aes-256-cbc'
- accepts_nested_attributes_for :provider_gcp
accepts_nested_attributes_for :platform_kubernetes
enum platform_type: {
@@ -31,8 +29,8 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati
class Project < ActiveRecord::Base
self.table_name = 'projects'
- has_one :cluster_project, class_name: 'ClustersProject'
- has_one :cluster, through: :cluster_project, class_name: 'Cluster'
+ has_many :cluster_projects, class_name: 'ClustersProject'
+ has_many :clusters, through: :cluster_projects, class_name: 'Cluster'
end
class Service < ActiveRecord::Base
@@ -42,20 +40,30 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati
belongs_to :project, class_name: 'Project'
+ # 10.1 ~ 10.2
# When users create a cluster, KubernetesService is automatically synchronized
# with Platforms::Kubernetes due to delegate Kubernetes specific logic.
# We only target unmanaged KubernetesService records.
+ #
+ # 10.3
+ # We no longer create KubernetesService because Platforms::Kubernetes has the specific logic.
+ #
+ # "unmanaged" means "unmanaged by Platforms::Kubernetes(New archetecture)"
+ #
+ # "cluster_projects.project_id IS NULL" -> it's not copied from KubernetesService
+ # "services.properties NOT LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%')" -> KubernetesService has unique configuration which is not included in Platforms::Kubernetes
scope :unmanaged_kubernetes_service, -> do
- joins('INNER JOIN projects ON projects.id = services.project_id ' \
- 'INNER JOIN cluster_projects ON projects.id = cluster_projects.project_id ' \
- 'INNER JOIN clusters ON cluster_projects.cluster_id = clusters.id ' \
- 'INNER JOIN cluster_platforms_kubernetes ON cluster_platforms_kubernetes.cluster_id = clusters.id')
- .where("services.category = 'deployment' AND services.type = 'KubernetesService' " \
- "AND ( " \
- " cluster_projects.project_id IS NULL " \
- " OR " \
- " services.properties NOT LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%') " \
- ") ")
+ joins('INNER JOIN projects ON projects.id = services.project_id')
+ .where("services.category = 'deployment'")
+ .where("services.type = 'KubernetesService'")
+ .where("services.template = FALSE")
+ .where("NOT EXISTS (?)",
+ PlatformsKubernetes
+ .joins('INNER JOIN cluster_projects ON cluster_projects.project_id = projects.id')
+ .where('cluster_projects.cluster_id = cluster_platforms_kubernetes.cluster_id')
+ .where("services.properties LIKE CONCAT('%', cluster_platforms_kubernetes.api_url, '%')")
+ .select('1') )
+ .order('services.project_id')
end
end
@@ -94,8 +102,10 @@ class MigrateKubernetesServiceToNewClustersArchitectures < ActiveRecord::Migrati
token: kubernetes_service.token # encrypted_token and encrypted_token_iv
} )
- # Disable the service, so that new cluster archetecture is going to be used
- kubernetes_service.updated(active: false)
+ # Disable the KubernetesService. Platforms::Kubernetes will be used from next time.
+ kubernetes_service.active = false
+ kubernetes_service.propaties.merge!( { migrated: true } )
+ kubernetes_service.save!
end
end