forked from jasder/forgeplus
89 lines
3.0 KiB
Ruby
89 lines
3.0 KiB
Ruby
class Admins::CheckShixunMirrorsService < ApplicationService
|
||
Error = Class.new(StandardError)
|
||
|
||
def call
|
||
bridge_images
|
||
|
||
ActiveRecord::Base.transaction do
|
||
check_sync_mirrors!
|
||
|
||
check_mirrors!
|
||
end
|
||
end
|
||
|
||
private
|
||
|
||
def mirrors
|
||
bridge_images['images']
|
||
end
|
||
|
||
def sync_mirrors
|
||
bridge_images['imagesNotSync']
|
||
end
|
||
|
||
def check_mirrors!
|
||
return if mirrors.blank?
|
||
image_names = []
|
||
|
||
mirrors.each do |data|
|
||
mirror = JSON.parse(data)
|
||
|
||
name_repository = MirrorRepository.find_by(name: mirror['imageName'])
|
||
id_repository = MirrorRepository.find_by(mirrorID: mirror['imageID'])
|
||
|
||
image_names << mirror['imageName']
|
||
|
||
if name_repository.blank? && id_repository.present? # 镜像名称被修改
|
||
id_repository.update_column(:status, 2)
|
||
MirrorOperationRecord.create!(mirror_repository_id: id_repository.id, mirror_id: mirror['imageID'],
|
||
mirror_name: mirror['imageName'], status: 2, user_id: -1)
|
||
elsif name_repository.blank? # 镜像不存在、创建镜像
|
||
new_repository = MirrorRepository.create!(mirrorID: mirror['imageID'], name: mirror['imageName'])
|
||
MirrorOperationRecord.create!(mirror_repository_id: new_repository.id, mirror_id: mirror['imageID'],
|
||
mirror_name: mirror['imageName'], status: 0, user_id: -1)
|
||
elsif name_repository.mirrorID != mirror['imageID'] # 镜像ID被修改
|
||
name_repository.update_column(:status, 2)
|
||
MirrorOperationRecord.create!(mirror_repository_id: name_repository.id, mirror_id: mirror['imageID'],
|
||
mirror_name: mirror['imageName'], status: 1, user_id: -1)
|
||
end
|
||
end
|
||
|
||
# 判断中间层镜像是否被删除
|
||
MirrorRepository.find_each do |mirror|
|
||
next if mirror&.name.blank? || image_names.index(mirror.name)
|
||
|
||
mirror.update_column(:status, 4)
|
||
MirrorOperationRecord.create!(mirror_repository_id: mirror.id, mirror_id: mirror&.mirrorID,
|
||
mirror_name: mirror.name, status: 3, user_id: -1)
|
||
end
|
||
end
|
||
|
||
def check_sync_mirrors!
|
||
return if sync_mirrors.blank?
|
||
|
||
sync_mirrors.each do |data|
|
||
mirror = JSON.parse(data)
|
||
|
||
repository = MirrorRepository.find_by(name: mirror['imageName'])
|
||
next if repository.blank? || repository.status != 1
|
||
|
||
repository.update_column(:status, 5)
|
||
MirrorOperationRecord.create!(mirror_repository_id: repository.id, mirror_id: mirror['imageID'],
|
||
mirror_name: mirror['imageName'], status: 4, user_id: -1)
|
||
end
|
||
end
|
||
|
||
def bridge_images
|
||
@_bridge_images ||= begin
|
||
url = "#{EduSetting.get('cloud_bridge')}/bridge/docker/images"
|
||
res = Faraday.get(url)
|
||
res = JSON.parse(res.body)
|
||
raise Error, '拉取镜像信息异常' if res && res['code'] != 0
|
||
|
||
res
|
||
rescue => e
|
||
Rails.logger.error("get response failed ! #{e.message}")
|
||
raise Error, '实训云平台繁忙(繁忙等级:84)'
|
||
end
|
||
end
|
||
end |