|
|
|
|
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')
|
|
|
|
|
res = Faraday.get(url)
|
|
|
|
|
res_body = JSON.parse(res.body)
|
|
|
|
|
|
|
|
|
|
raise Error, '拉取镜像信息异常' if res_body && res_body['code'].to_i != 0
|
|
|
|
|
|
|
|
|
|
res_body
|
|
|
|
|
rescue => e
|
|
|
|
|
Rails.logger.error("get response failed ! #{e.message}")
|
|
|
|
|
raise Error, '实训云平台繁忙(繁忙等级:84)'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|