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