//package com.bocloud.ims.service.resource;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.bocloud.cmp.entity.resource.*;
//import com.bocloud.common.encrypt.AESEncrptor;
//import com.bocloud.common.encrypt.Encryptor;
//import com.bocloud.common.enums.HttpRequestMethod;
//import com.bocloud.common.exception.BoCloudDBException;
//import com.bocloud.common.model.*;
//import com.bocloud.common.utils.Common;
//import com.bocloud.common.utils.DateTools;
//import com.bocloud.common.utils.ListTool;
//import com.bocloud.common.utils.MapTools;
//import com.bocloud.ims.interfaces.resource.HarborService;
//import com.bocloud.ims.repository.resource.*;
//import com.bocloud.ims.service.utils.HarborUtil;
//import com.bocloud.ims.service.utils.ResourceEventPublisher;
//import com.bocloud.ims.service.utils.TarUtil;
//import com.bocloud.service.lock.BocloudACLock;
//import com.bocloud.service.lock.LockFactory;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.apache.commons.lang3.StringUtils;
//
//import java.io.*;
//import java.io.File;
//import java.math.BigDecimal;
//import java.net.URLEncoder;
//import java.util.*;
//import java.util.Map.Entry;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author aile
// * @date 2020/3/25 14:26
// */
//
//@Service
//public class HarborServiceImpl implements HarborService {
//	private static final Logger logger = LoggerFactory.getLogger(HarborServiceImpl.class);
//
//	@Autowired
//	private HarborRepository harborRepository;
//	@Autowired
//	private HarborTagRepository harborTagRepository;
//	@Autowired
//	private HarborProjectRepository harborProjectRepository;
//	@Autowired
//	private ResourceEventPublisher resourceEventPublisher;
//	@Autowired
//	private CloudVendorRepository cloudVendorRepository;
//	@Autowired
//	private HarborImageRepository harborImageRepository;
//	@Autowired
//	private LockFactory lockFactory;
//	@Value("${upload.storage.path:/home/cmp}")
//	private String path;
//
//	private final String PROJECTS = "/api/projects"; // 获得所有项目,和项目的添加
//	private final String IMAGES = "/api/repositories?project_id="; // 获得某个项目下的所有镜像仓库
//	private final String TAGS = "/api/repositories/"; // 获得某仓库下的所有镜像标签
//	private final String USERS = "/api/users?page=1&page_size=1"; // 用于验证用户名或者密码是否准确
//	private final String REGISTRIES = "/api/registries";// harbor仓库管理路由
//	private final String POLICIES = "/api/replication/policies";// harbor复制规则路由
//	private final String EXECUTIONS = "/api/replication/executions";// harbor镜像复制路由
//
//	/**
//	 * 添加项目
//	 *
//	 * @param param
//	 * @return
//	 */
//	@Override
//	public BocloudResult projectAdd(String param, Long harborId) {
//		HarborUtil harborUtil = initAuth(harborId);
//		if (harborUtil == null) {
//			logger.info("获取harbor权限失败!");
//			new BocloudResult<>(false, "获取harbor权限失败!");
//		}
//		JSONObject paramJSON = JSONObject.parseObject(param);
//		Map<String, Object> params = new HashMap<>();
//		params.put("metadata", MapTools.simpleMap("public", "true")); // 一定公有，写死
//		params.put("project_name", paramJSON.getString("project_name"));
//		params.put("count_limit", paramJSON.getInteger("count_limit"));
//		params.put("storage_limit", paramJSON.getInteger("storage_limit"));
//		Result result = harborUtil
//				.httpConnection(harborUtil.getSectionUrl() + PROJECTS, HttpRequestMethod.POST, params);
//		if (!result.isSuccess()) {
//			logger.info("项目添加失败!" + result.getMessage());
//			return new BocloudResult<>(false, "项目添加失败，" + result.getMessage());
//		}
//		result = harborUtil.httpConnection(
//				harborUtil.getSectionUrl() + PROJECTS + "?name=" + paramJSON.getString("project_name"),
//				HttpRequestMethod.GET, null);
//		if (!result.isSuccess()) {
//			logger.info("harbor项目添加成功，同步数据库失败!" + result.getMessage());
//			return new BocloudResult<>(false, "harbor项目添加成功，同步数据库失败，" + result.getMessage());
//		}
//		JSONArray array = JSONArray.parseArray(result.getMessage());
//		HarborProject project = array.getObject(0, HarborProject.class); // 通过名字查找的肯定只有一个，所以默认取0；
//		project.setHarborId(harborId);
//		project.setHarborProjectId(array.getJSONObject(0).getLong("project_id"));
//		harborProjectRepository.save(project); // 入数据库
//		logger.info("项目添加成功");
//		return new BocloudResult<>(true, "项目添加成功");
//	}
//
//	/**
//	 * 根据 项目id 删除项目
//	 *
//	 * @param projectId
//	 * @return
//	 */
//	@Override
//	public BocloudResult projectDelete(Long projectId) {
//		HarborProject project = harborProjectRepository.query(projectId);
//		HarborUtil harborUtil = initAuth(project.getHarborId());
//		if (harborUtil.httpConnection(harborUtil.getSectionUrl() + PROJECTS + "/" + project.getHarborProjectId(),
//				HttpRequestMethod.DELETE, null).isFailed()) {
//			logger.info("项目删除失败");
//			return new BocloudResult<>(false, "项目删除失败");
//		}
//		harborProjectRepository.delete(HarborProject.class, projectId);
//		logger.info("项目删除成功");
//		return new BocloudResult<>(true, "项目删除成功");
//	}
//
//	/**
//	 * 同步数据库与harbor的镜像标签等信息
//	 *
//	 * @param harborId
//	 * @return
//	 */
//	@Override
//	@Transactional(rollbackFor = BoCloudDBException.class)
//	public BocloudResult sync(Long harborId, RequestContext context) {
//		HarborUtil harborUtil = initAuth(harborId);
//		if (harborUtil == null) {
//			logger.info("同步失败，获取harbor权限失败！");
//			return new BocloudResult<>(false, "同步失败，获取harbor权限失败！");
//		}
//		new Thread(() -> {
//			String lockPath = Harbor.class.getSimpleName() + "_" + harborId;
//			try (BocloudACLock lock = lockFactory.getACLock(lockPath)) {
//				if (!lock.acquire(10, TimeUnit.SECONDS)) {
//					logger.warn("已存在同步任务！！");
//					resourceEventPublisher.send(new OperateResult(false, "已存在同步任务！！", "harbor.image", MapTools
//							.simpleMap(Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//				}
//				Result result = harborUtil.httpConnection(harborUtil.getSectionUrl() + PROJECTS, HttpRequestMethod.GET,
//						null);
//				if (result.isSuccess()) {
//					JSONArray projectArray = JSONArray.parseArray(result.getMessage());
//					// 同步时，二则共同的更新，oldProjectList有而newProjectList没有的则删除，oldProjectList没有，newProjectList有的则重新插入
//				List<HarborProject> oldProjectList = harborProjectRepository.listByHarborId(harborId); // 存放之前数据库中存在的项目
//				List<HarborImage> oldImageList = harborImageRepository.imageListByHarborId(harborId); // 存放之前数据库中存在的镜像
//				List<HarborTag> oldTagList = harborTagRepository.tagListByHarborId(harborId); // 存放之前数据库中存在的标签
//				List<HarborProject> newProjectList = new ArrayList<>(); // 存放harbor当前的项目
//				List<HarborImage> newImageList = new ArrayList<>(); // 存放harbor当前的项目
//				List<HarborTag> newTagList = new ArrayList<>(); // 存放harbor当前的项目
//				for (int i = 0; i < projectArray.size(); i++) {
//					JSONObject jsonObject = projectArray.getJSONObject(i);
//					HarborProject harborProject = JSONObject.toJavaObject(jsonObject, HarborProject.class);
//					harborProject.setHarborId(harborId);
//					harborProject.setCreationTime(HarborUtil.timeTransfer(harborProject.getCreationTime()));
//					harborProject.setUpdateTime(HarborUtil.timeTransfer(harborProject.getUpdateTime()));
//					harborProject.setHarborProjectId(jsonObject.getLong("project_id")); // 无法自动转换，手动
//					HarborProject tempProject = harborProjectRepository.query(harborProject.getHarborId(),
//							harborProject.getName());
//					if (tempProject == null) {// 没有则插入，有则更新
//					harborProjectRepository.save(harborProject);
//				} else {
//					harborProject.setId(tempProject.getId());
//					harborProjectRepository.update(harborProject);
//				}
//				newProjectList.add(harborProject);
//				String projectId = jsonObject.getString("project_id");
//				result = harborUtil.httpConnection(harborUtil.getSectionUrl() + IMAGES + projectId,
//						HttpRequestMethod.GET, null);
//				if (result.isSuccess()) {
//					JSONArray imageArray = JSONArray.parseArray(result.getMessage());
//					for (int k = 0; k < imageArray.size(); k++) {
//						HarborImage harborImage = JSONObject.toJavaObject(imageArray.getJSONObject(k),
//								HarborImage.class);
//						harborImage.setProjectId(harborProject.getId());
//						harborImage.setHarborImageId(harborImage.getId());
//						harborImage.setId(null); // 主键自动生成
//						harborImage.setCreationTime(HarborUtil.timeTransfer(harborImage.getCreationTime()));
//						harborImage.setUpdateTime(HarborUtil.timeTransfer(harborImage.getUpdateTime()));
//						harborImage.setHarborId(harborId);
//						HarborImage tempImage = harborImageRepository.query(harborImage.getHarborImageId(),
//								harborImage.getHarborId());
//						if (tempImage == null) {// 没有则插入，有则更新
//							harborImageRepository.save(harborImage);
//						} else {
//							harborImage.setId(tempImage.getId());
//							harborImageRepository.update(harborImage);
//						}
//						newImageList.add(harborImage);
//						String imageName = harborImage.getName();
//						result = harborUtil.httpConnection(harborUtil.getSectionUrl() + TAGS + imageName
//								+ "/tags?detail=true", HttpRequestMethod.GET, null);
//						if (result.isSuccess()) {
//							JSONArray tagsArray = JSONArray.parseArray(result.getMessage());
//							for (int j = 0; j < tagsArray.size(); j++) {
//								HarborTag harborTag = JSONObject.parseObject(tagsArray.getJSONObject(j).toJSONString(),
//										HarborTag.class);
//								harborTag.setPullTime(HarborUtil.timeTransfer(harborTag.getPullTime()));
//								harborTag.setPushTime(HarborUtil.timeTransfer(harborTag.getPushTime()));
//								harborTag.setCreated(HarborUtil.timeTransfer(harborTag.getCreated()));
//								harborTag.setImageName(imageName);
//								String size = harborTag.getSize();
//								Double num = Double.parseDouble(size); // 将单位B化简为KB或者MB
//								size = new BigDecimal(num / 1024).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
//								if (size.length() >= 6) { // 加2位小数位，如果整数位数大于4，就将单位化为MB
//									num = Double.parseDouble(size); // 将单位B化简为KB或者MB
//									size = new BigDecimal(num / 1024).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
//									size = size + "MB";
//								} else {
//									size = size + "KB";
//								}
//								harborTag.setSize(size);
//								harborTag.setHarborId(harborId);
//								harborTag.setOsVersion(tagsArray.getJSONObject(j).getString("os.version")); // 特殊格式，json无法直接住转换
//								harborTag.setImageId(harborImage.getId());
//								HarborTag tempTag = harborTagRepository.query(harborId, harborTag.getName(),
//										harborImage.getName());
//								if (tempTag == null) {
//									harborTagRepository.save(harborTag);
//								} else {
//									harborTag.setId(tempTag.getId());
//									harborTagRepository.update(harborTag);
//								}
//								newTagList.add(harborTag);
//							}
//						} else {
//							logger.info("harbor仓库同步失败");
//							resourceEventPublisher.send(new OperateResult(false, "harbor仓库同步失败！", "harbor.image",
//									MapTools.simpleMap(Common.VENDORID, 1),
//									OperateResult.OperateCategory.ResourceEvent, context));
//							return;
//						}
//					}
//				} else {
//					logger.info("harbor仓库同步失败");
//					resourceEventPublisher.send(new OperateResult(false, "harbor仓库同步失败！", "harbor.image", MapTools
//							.simpleMap(Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//					return;
//				}
//			}
//			// 逻辑删除数据库中存在，但是harbor中不存在的项目、镜像、标签
//			oldProjectList.removeAll(newProjectList);
//			oldImageList.removeAll(newImageList);
//			oldTagList.removeAll(newTagList);
//			for (HarborTag harborTag : oldTagList) {
//				harborTagRepository.remove(HarborTag.class, harborTag.getId());
//			}
//			for (HarborImage harborImage : oldImageList) {
//				harborImageRepository.remove(HarborImage.class, harborImage.getId());
//			}
//			for (HarborProject harborProject : oldProjectList) {
//				harborProjectRepository.remove(HarborProject.class, harborProject.getId());
//			}
//			logger.info("harbor仓库同步成功");
//			resourceEventPublisher.send(new OperateResult(true, "harbor仓库同步成功！", "harbor.image", MapTools.simpleMap(
//					Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//			return;
//		}
//		logger.info("harbor仓库同步失败");
//		resourceEventPublisher.send(new OperateResult(false, "harbor仓库同步失败！", "harbor.image", MapTools.simpleMap(
//				Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//	} catch (Exception e) {
//		logger.error("同步失败！:", e);
//		resourceEventPublisher.send(new OperateResult(false, "同步失败！！", "harbor.image", MapTools.simpleMap(
//				Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//	}
//}		).start();
//		logger.info("同步任务已下发，正在执行");
//		return new BocloudResult<>(true, "同步任务已下发，正在执行");
//	}
//
//	/**
//	 * 同步之前，将原有的删除
//	 *
//	 * @param harborId
//	 */
//	@Transactional(rollbackFor = BoCloudDBException.class)
//	public void deleteOldRepository(Long harborId, Long menderId) {
//		List<HarborProject> projectList = harborProjectRepository.listByHarborId(harborId);
//		for (int j = 0; j < projectList.size(); j++) {
//			List<HarborImage> imageList = harborImageRepository.imageListByProjectId(projectList.get(j).getId());
//			for (int i = 0; i < imageList.size(); i++) {
//				harborTagRepository.deleteByImageId(imageList.get(i).getId(), menderId);
//			}
//			harborImageRepository.deleteByProjectId(projectList.get(j).getId(), menderId);
//		}
//		harborProjectRepository.deleteByRepositoryId(harborId, menderId);
//	}
//
//	/**
//	 * 创建harbor仓库
//	 *
//	 * @param params
//	 * @return
//	 */
//	@Override
//	public BocloudResult createHarbor(String params, RequestContext context) {
//		Harbor harbor = JSONObject.parseObject(params, Harbor.class);
//		harbor.setCreatorId(context.getTarget());
//		String password = "";
//		Encryptor encryptor = new AESEncrptor();
//		try {
//			password = encryptor.decrypt(harbor.getPassword(), null);
//		} catch (Exception e) {
//			logger.info("密码解密异常：" + e);
//			return new BocloudResult<>(false, "仓库添加失败");
//		}
//		HarborUtil harborUtil = new HarborUtil(harbor.getUsername(), password);
//		Result result = harborUtil.httpConnection(harbor.getProtocol() + "://" + harbor.getServerIp() + USERS,
//				HttpRequestMethod.GET, null);
//		if (result.isFailed()) {
//			logger.info("仓库添加失败,协议、IP、用户名或密码错误！");
//			return new BocloudResult<>(false, "仓库添加失败,协议、IP、用户名或密码错误！");
//		}
//		Harbor oldHarbor = harborRepository.getByIP(harbor.getServerIp());
//		if (oldHarbor != null) {
//			logger.info("IP地址不能重复");
//			return new BocloudResult<>(false, "IP地址不能重复");
//		}
//		oldHarbor = harborRepository.getByName(harbor.getName());
//		if (oldHarbor != null) {
//			logger.info("名称不能重复");
//			return new BocloudResult<>(false, "名称不能重复");
//		}
//		harborRepository.save(harbor);
//		logger.info("仓库创建成功");
//		return new BocloudResult<>(true, "创建成功");
//	}
//
//	/**
//	 * 初始化httpclient，赋予权限
//	 *
//	 * @param harborId
//	 */
//	private HarborUtil initAuth(Long harborId) {
//		Harbor harbor;
//		try {
//			harbor = harborRepository.query(harborId);
//		} catch (Exception e) {
//			logger.error("初始化权限失败，数据库查询失败，查询时发生异常：" + e);
//			return null;
//		}
//		if (harbor == null) {
//			logger.info("初始化权限失败");
//			return null;
//		}
//		Encryptor encryptor = new AESEncrptor();
//		try {
//			// 对密码解密，用于harbor权限
//			harbor.setPassword(encryptor.decrypt(harbor.getPassword(), null));
//		} catch (Exception e) {
//			logger.info("初始化权限失败");
//			return null;
//		}
//		HarborUtil httpClientUtil = new HarborUtil(harbor.getUsername(), harbor.getPassword());
//		httpClientUtil.setSectionUrl(harbor.getProtocol() + "://" + harbor.getServerIp());
//		return httpClientUtil;
//	}
//
//	/**
//	 * 获得所有的仓库
//	 *
//	 * @param context
//	 * @return
//	 */
//	@Override
//	public BocloudResult repositoryList(RequestContext context, Pager pager) {
//		Map<String, String> sorter = new HashMap<>();
//		sorter.put("gmtCreate", Common.ONE);
//		pager.setSorter(sorter);
//		List<Harbor> list = harborRepository.list(pager.getPage(), pager.getRows(), pager.getParams(),
//				pager.getSorter());
//		int total = harborRepository.count(pager.getParams());
//		GridBean gridBean = new GridBean(pager.getPage(), pager.getRows(), total, list);
//		return new BocloudResult<>(true, gridBean, "查询成功");
//	}
//
//	/**
//	 * 获得所有项目
//	 *
//	 * @param harborId
//	 * @return
//	 */
//	@Override
//	public BocloudResult projectList(Long harborId, Pager pager) {
//		Map<String, String> sorter = new HashMap<>();
//		sorter.put("gmtCreate", Common.ONE);
//		pager.setSorter(sorter);
//		List<HarborProject> projectList = harborProjectRepository.listByHarborId(harborId, pager);
//		GridBean gridBean = new GridBean(pager.getPage(), pager.getRows(), projectList.size(), projectList);
//		return new BocloudResult<>(true, gridBean, "查询成功");
//	}
//
//	// /**
//	// * 查询某项目下面的镜像
//	// * @param projectId
//	// * @return
//	// */
//	// @Override
//	// public BocloudResult imageList(Long projectId, Pager pager){
//	// List<HarborImage> list =
//	// harborImageRepository.imageListByProjectId(projectId,
//	// pager);
//	// GridBean gridBean = new GridBean(pager.getPage(), pager.getRows(),
//	// list.size(), list);
//	// return new BocloudResult<>(true, gridBean, "查询成功");
//	// }
//
//	/**
//	 * 通过harbor直接过去下面的所有镜像
//	 *
//	 * @param harborId
//	 * @return
//	 */
//	@Override
//	public BocloudResult imageList(Long harborId, Pager pager) {
//		Map<String, String> sorter = new HashMap<>();
//		sorter.put("creation_time", Common.ONE);
//		pager.setSorter(sorter);
//		List<HarborImage> imageList = harborImageRepository.imagesByHarborId(harborId, pager);
//		int total = harborImageRepository.count(harborId, pager.getParams());
//		GridBean gridBean = new GridBean(pager.getPage(), pager.getRows(), total, imageList);
//		return new BocloudResult<>(true, gridBean, "查询成功");
//	}
//
//	/**
//	 *
//	 * 获取详情
//	 * 
//	 * @param id
//	 * @return
//	 */
//	@Override
//	public BocloudResult imageDetail(long id) {
//		HarborImage image = harborImageRepository.query(id);
//		return new BocloudResult<>(true, image, "查询成功");
//	}
//
//	/**
//	 * 通过镜像名字，获取镜像的所有标签
//	 *
//	 * @param imageId
//	 * @return
//	 */
//	@Override
//	public BocloudResult tagList(Long imageId) {
//		List<HarborTag> list = harborTagRepository.tagListImageId(imageId);
//		return new BocloudResult<>(true, list, "查询成功");
//	}
//
//	/**
//	 *
//	 * 删除标签
//	 *
//	 * @param id
//	 * @return
//	 */
//	@Override
//	public BocloudResult tagDelete(Long id, Long menderId) {
//		HarborTag harborTag = harborTagRepository.getById(id);
//		if (harborTag == null) {
//			logger.warn("该标签不存在，请刷新!");
//			return new BocloudResult<>(false, "该标签不存在，请刷新!");
//		}
//		HarborUtil harborUtil = initAuth(harborTag.getHarborId());
//		if (harborUtil == null) {
//			return new BocloudResult<>(false, "获取harbor权限失败！");
//		}
//		String imageName = "";
//		try {
//			imageName = URLEncoder.encode(harborTag.getImageName(), "UTF-8");
//		} catch (UnsupportedEncodingException e) {
//			logger.error("镜像名称转码失败：");
//			return new BocloudResult<>(false, "删除失败！");
//		}
//		String url = harborUtil.getSectionUrl() + TAGS + imageName + "/tags/" + harborTag.getName();
//		Result result = harborUtil.httpConnection(url, HttpRequestMethod.DELETE, null);
//		if (result.isSuccess()) {
//			harborTagRepository.remove(harborTag.getId(), menderId);
//			HarborImage harborImage = harborImageRepository.query(harborTag.getImageId());
//			int tagsCount = harborImage.getTagsCount() - 1;
//			if (0 == tagsCount) {
//				harborImageRepository.remove(HarborImage.class, harborImage.getId());
//			} else {
//				harborImage.setTagsCount(tagsCount);
//				harborImageRepository.update(harborImage);
//			}
//			return new BocloudResult<>(true, "删除成功！");
//		} else {
//			logger.warn("删除失败：" + result.getMessage());
//			return new BocloudResult<>(false, "删除失败!");
//		}
//	}
//
//	/**
//	 * 删除harbor
//	 *
//	 * @param id
//	 * @return
//	 */
//	@Transactional(rollbackFor = BoCloudDBException.class)
//	@Override
//	public BocloudResult deleteHarborById(Long id, RequestContext context) {
//		harborRepository.remove(id, context.getTarget());
//		// 删除平台对应关系
//		CloudVendor cloudVendor = cloudVendorRepository.queryByBarborId(id);
//		if (null != cloudVendor) {
//			cloudVendor.setHarborId(null);
//			cloudVendorRepository.update(cloudVendor);
//		}
//		this.deleteOldRepository(id, context.getTarget()); // 删除harbor下面对应的项目、镜像、标签
//		return new BocloudResult<>(true, "删除成功");
//	}
//
//	/**
//	 * harbor详情
//	 *
//	 * @param id
//	 * @return
//	 */
//	@Override
//	public BocloudResult getHarbor(Long id) {
//		return new BocloudResult<>(true, harborRepository.query(id), "查询成功");
//	}
//
//	@Override
//	public BocloudResult upload(String params, RequestContext context) throws Exception {
//		JSONObject object = JSONObject.parseObject(params, JSONObject.class);
//		if (null == object) {
//			return new BocloudResult<>(false, "参数格式错误！");
//		}
//		String filePath = object.getString("filePath");
//		filePath = path + filePath;
//		File file = new File(filePath);
//		try {
//			Long harborId = object.getLong("harborId");
//			Harbor harbor = harborRepository.query(harborId);
//			if (null == harbor) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "仓库信息异常！");
//			}
//			CloudVendor cloudVendor = cloudVendorRepository.queryByBarborId(harborId);
//			if (null == cloudVendor) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "绑定集群信息异常！");
//			}
//			String dockerAddress = cloudVendor.getDockerAddress();
//			if (StringUtils.isEmpty(dockerAddress)) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "容器地址不存在！");
//			}
//			if (!dockerAddress.contains("tcp://")) {
//				dockerAddress = "tcp://" + dockerAddress;
//			}
//			String registryProject = null;
//			String registryAddress = harbor.getServerIp();
//			String registryUserName = harbor.getUsername();
//			Encryptor encryptor = new AESEncrptor();
//			String registryPassword = encryptor.decrypt(harbor.getPassword(), null);
//			Long tenantId = context.getTenant();
//			HarborProject project = null;
//			if (null != tenantId && 0 != tenantId) {
//				// TODO
//				registryProject = ""; // 通过租户查询项目
//			} else {
//				project = harborProjectRepository.query(harborId, "library");
//			}
//			if (null == project) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "仓库数据异常！");
//			}
//			registryProject = project.getName();
//			String registry = registryAddress + "/" + registryProject;
//			String unTar = TarUtil.unTar(filePath);
//			if (StringUtils.isEmpty(unTar)) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "镜像解析错误！");
//			}
//			String fileImageName = null;
//			String fileImageVision = null;
//			JSONObject parseObject = JSON.parseObject(unTar);
//			Set<Entry<String, Object>> entrySet = parseObject.entrySet();
//			for (Entry<String, Object> entry : entrySet) {
//				fileImageName = entry.getKey();
//				JSONObject valueObject = JSON.parseObject(JSON.toJSONString(entry.getValue()));
//				Set<Entry<String, Object>> entrySet2 = valueObject.entrySet();
//				for (Entry<String, Object> entry2 : entrySet2) {
//					fileImageVision = entry2.getKey();
//				}
//			}
//			if (StringUtils.isEmpty(fileImageName) || StringUtils.isEmpty(fileImageVision)) {
//				deleteFile(file);
//				return new BocloudResult<>(false, "镜像解析错误！");
//			}
//			final String dockerConnectionUrl = dockerAddress;
//			final String imageName = fileImageName;
//			final String imageVersion = fileImageVision;
//			final String registryProjectName = registryProject;
//			final HarborProject harborProject = project;
//			new Thread(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						String imageInfo = imageName + ":" + imageVersion;
//						DockerUtils dockerUtils = new DockerUtils(dockerConnectionUrl);
//						// 判断上传之前是否存在
//						com.github.dockerjava.api.model.Image imagesCmd = dockerUtils.getImagesCmd(imageInfo);
//						BocloudResult loadImageCmd = dockerUtils.loadImageCmd(file);
//						if (loadImageCmd.isFailed()) {
//							resourceEventPublisher.send(new OperateResult(false, "镜像load失败！", "harbor.image", MapTools
//									.simpleMap(Common.VENDORID, cloudVendor.getId()),
//									OperateResult.OperateCategory.ResourceEvent, context));
//							return;
//						}
//						String imageId = null;
//						if (imageName.contains(registry)) {
//							imageId = imageName;
//						} else {
//							imageId = registry + "/" + imageName;
//						}
//						if (!imageId.equalsIgnoreCase(imageInfo)) {
//							BocloudResult tagImageCmd = dockerUtils.tagImageCmd(imageInfo, imageId, imageVersion);
//							if (tagImageCmd.isFailed()) {
//								if (null == imagesCmd) {
//									dockerUtils.removeImageCmd(imageInfo);
//								}
//								resourceEventPublisher.send(new OperateResult(false, "镜像上传失败！", "harbor.image",
//										MapTools.simpleMap(Common.VENDORID, cloudVendor.getId()),
//										OperateResult.OperateCategory.ResourceEvent, context));
//								return;
//							}
//						}
//
//						AuthConfig authConfig = new AuthConfig().withUsername(registryUserName)
//								.withPassword(registryPassword).withRegistryAddress(registryAddress);
//						BocloudResult pushImageCmd = dockerUtils.pushImageCmd(imageId, imageVersion, authConfig);
//						if (pushImageCmd.isFailed()) {
//							if (null == imagesCmd) {
//								dockerUtils.removeImageCmd(imageInfo);
//							}
//							if (!imageId.equalsIgnoreCase(imageInfo)) {
//								dockerUtils.removeImageCmd(imageId + ":" + imageVersion);
//							}
//							resourceEventPublisher.send(new OperateResult(false, "镜像上传失败！", "harbor.image", MapTools
//									.simpleMap(Common.VENDORID, cloudVendor.getId()),
//									OperateResult.OperateCategory.ResourceEvent, context));
//							return;
//						}
//						// 保存数据
//						Image newImage = dockerUtils.getImagesCmd(imageId + ":" + imageVersion);
//						if (null == imagesCmd) {
//							dockerUtils.removeImageCmd(imageInfo);
//						}
//						if (!imageId.equalsIgnoreCase(imageInfo)) {
//							dockerUtils.removeImageCmd(imageId + ":" + imageVersion);
//						}
//						String harborImageName = imageName;
//						if (!imageName.startsWith(registryProjectName + "/")) {
//							harborImageName = registryProjectName + "/" + harborImageName;
//						}
//						HarborImage image = harborImageRepository.getByName(harborId, harborProject.getId(),
//								harborImageName);
//						if (null == image) {
//							image = new HarborImage();
//							image.setName(harborImageName);
//							image.setProjectId(harborProject.getId());
//							image.setTagsCount(1);
//							image.setPullCount(0);
//							image.setCreatorId(context.getTarget());
//							image.setHarborId(harborId);
//							image.setCreationTime(DateTools.formatTime(new Date()));
//							image.setUpdateTime(DateTools.formatTime(new Date()));
//							harborImageRepository.save(image);
//						} else {
//							image.setTagsCount(newImage.getRepoTags().length);
//							image.setUpdateTime(DateTools.formatTime(new Date()));
//							harborImageRepository.update(image);
//						}
//						HarborTag imageTag = harborTagRepository.getByName(harborId, image.getId(), imageVersion);
//						if (null == imageTag) {
//							Version version = dockerUtils.versionCmd();
//							imageTag = new HarborTag();
//							imageTag.setHarborId(harborId);
//							imageTag.setImageId(image.getId());
//							imageTag.setName(imageVersion);
//							imageTag.setDigest(newImage.getId());
//							imageTag.setCreated(DateTools.formatTime(new Date()));
//							imageTag.setPushTime(DateTools.formatTime(new Date()));
//							imageTag.setCreatorId(context.getTarget());
//							if (null != version) {
//								imageTag.setDockerVersion(version.getVersion());
//								imageTag.setArchitecture(version.getArch());
//								imageTag.setOs(version.getOperatingSystem());
//							}
//							BigDecimal imageSize = new BigDecimal(newImage.getSize()).divide(
//									BigDecimal.valueOf(1024 * 1024), 2, BigDecimal.ROUND_HALF_UP);
//							imageTag.setSize(String.valueOf(imageSize.doubleValue()) + "MB");
//							harborTagRepository.save(imageTag);
//						}
//						List<HarborTag> list = harborTagRepository.tagListImageId(image.getId());
//						if (!ListTool.isEmpty(list)) {
//							image.setTagsCount(list.size());
//							harborImageRepository.update(image);
//						}
//						resourceEventPublisher.send(new OperateResult(true, "镜像上传成功！", "harbor.image", MapTools
//								.simpleMap(Common.VENDORID, cloudVendor.getId()),
//								OperateResult.OperateCategory.ResourceEvent, context));
//					} catch (Exception e) {
//						logger.error("镜像上传失败：" + e.getMessage());
//						resourceEventPublisher.send(new OperateResult(false, "镜像上传失败！", "harbor.image", MapTools
//								.simpleMap(Common.VENDORID, cloudVendor.getId()),
//								OperateResult.OperateCategory.ResourceEvent, context));
//					} finally {
//						deleteFile(file);
//					}
//				}
//			}).start();
//			return new BocloudResult<>(true, "镜像上传任务已下发，正在执行...");
//
//		} catch (Exception e) {
//			logger.error("镜像上传失败：" + e.getMessage());
//			deleteFile(file);
//			return new BocloudResult<>(false, "镜像上传失败：" + e.getMessage());
//		}
//	}
//
//	public void deleteFile(File file) {
//		if (null != file) {
//			file.delete();
//			if (null != file.getParentFile() && file.getParentFile().exists()) {
//				file.getParentFile().delete();
//			}
//		}
//	}
//
//	@Override
//	public BocloudResult harborListByVendorId(Long id, RequestContext context) {
//		try {
//			CloudVendor cloudVendor = cloudVendorRepository.query(id);
//			if (null == cloudVendor) {
//				return new BocloudResult<>(false, "平台信息异常！");
//			}
//			List<Harbor> harbors = harborRepository.listByVendorId();
//			Long harborId = cloudVendor.getHarborId();
//			if (null != harborId) {
//				Harbor harbor = harborRepository.query(harborId);
//				harbors.add(harbor);
//			}
//			return new BocloudResult<>(false, harbors, "查询成功！");
//		} catch (Exception e) {
//			logger.error("查询失败：" + e.getMessage());
//			return new BocloudResult<>(false, "查询失败！");
//		}
//	}
//
//	@Override
//	public BocloudResult downloadCheck(String params, RequestContext context) {
//		JSONObject object = JSONObject.parseObject(params, JSONObject.class);
//		if (null == object) {
//			return new BocloudResult<>(false, "参数格式错误！");
//		}
//		try {
//			Long imageTagId = object.getLong("imageTagId");
//			HarborTag harborTag = harborTagRepository.query(imageTagId);
//			if (null == harborTag) {
//				logger.error("镜像标签数据异常！");
//				return new BocloudResult<>(false, "镜像标签数据异常！");
//			}
//			Long imageId = harborTag.getImageId();
//			HarborImage harborImage = harborImageRepository.query(imageId);
//			if (null == harborImage) {
//				logger.error("镜像数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			Long projectId = harborImage.getProjectId();
//			HarborProject harborProject = harborProjectRepository.query(projectId);
//			if (null == harborProject) {
//				logger.error("项目数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			Long harborId = harborProject.getHarborId();
//			Harbor harbor = harborRepository.query(harborId);
//			if (null == harbor) {
//				logger.error("仓库数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			CloudVendor cloudVendor = cloudVendorRepository.queryByBarborId(harborId);
//			if (null == cloudVendor) {
//				return new BocloudResult<>(false, "当前仓库未绑定集群！");
//			}
//			String dockerAddress = cloudVendor.getDockerAddress();
//			if (StringUtils.isEmpty(dockerAddress)) {
//				return new BocloudResult<>(false, "当前集群未配置Docker地址！");
//			}
//			DockerUtils dockerUtils = new DockerUtils(dockerAddress);
//			String imageName = harbor.getServerIp() + "/" + harborImage.getName() + ":" + harborTag.getName();
//			dockerUtils.getImagesCmd(imageName);
//			return new BocloudResult<>(true, "镜像下载中...");
//		} catch (Exception e) {
//			logger.error("镜像下载失败：" + e.getMessage());
//			return new BocloudResult<>(false, "镜像下载失败：" + e.getMessage());
//		}
//	}
//
//	@Override
//	public BocloudResult downloadImage(String params, RequestContext context) {
//		JSONObject object = JSONObject.parseObject(params, JSONObject.class);
//		if (null == object) {
//			return new BocloudResult<>(false, "参数格式错误！");
//		}
//		BufferedInputStream in = null;
//		BufferedOutputStream out = null;
//		try {
//			Long imageTagId = object.getLong("imageTagId");
//			HarborTag harborTag = harborTagRepository.query(imageTagId);
//			if (null == harborTag) {
//				logger.error("镜像标签数据异常！");
//				return new BocloudResult<>(false, "镜像标签数据异常！");
//			}
//			Long imageId = harborTag.getImageId();
//			HarborImage harborImage = harborImageRepository.query(imageId);
//			if (null == harborImage) {
//				logger.error("镜像数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			Long projectId = harborImage.getProjectId();
//			HarborProject harborProject = harborProjectRepository.query(projectId);
//			if (null == harborProject) {
//				logger.error("项目数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			Long harborId = harborProject.getHarborId();
//			Harbor harbor = harborRepository.query(harborId);
//			if (null == harbor) {
//				logger.error("仓库数据异常！");
//				return new BocloudResult<>(false, "镜像数据异常！");
//			}
//			CloudVendor cloudVendor = cloudVendorRepository.queryByBarborId(harborId);
//			if (null == cloudVendor) {
//				return new BocloudResult<>(false, "当前仓库未绑定集群！");
//			}
//			String dockerAddress = cloudVendor.getDockerAddress();
//			if (StringUtils.isEmpty(dockerAddress)) {
//				return new BocloudResult<>(false, "当前集群未指定Docker地址！");
//			}
//			DockerUtils dockerUtils = new DockerUtils(dockerAddress);
//			String imageName = harbor.getServerIp() + "/" + harborImage.getName() + ":" + harborTag.getName();
//			Image imagesCmd = dockerUtils.getImagesCmd(imageName);
//			if (null == imagesCmd) {
//				BocloudResult pullImageCmd = dockerUtils.pullImageCmd(imageName);
//				if (pullImageCmd.isFailed()) {
//					return new BocloudResult<>(false, "镜像下载失败！");
//				}
//			}
//			String name = harborImage.getName();
//			if (null != name && name.contains("/")) {
//				name = name.substring(name.lastIndexOf("/") + 1, name.length()) + ".tar";
//			}
//			InputStream inputStream = dockerUtils.saveImageCmd(imageName);
//			JSONObject jsonObject = new JSONObject();
//			jsonObject.put("name", name);
//			jsonObject.put("data", inputStream);
//			if (null == imagesCmd) {
//				dockerUtils.removeImageCmd(imageName);
//			}
//			return new BocloudResult<>(true, jsonObject, "镜像下载成功");
//		} catch (Exception e) {
//			logger.error("镜像下载失败：" + e.getMessage());
//			return new BocloudResult<>(false, "镜像下载失败：" + e.getMessage());
//		} finally {
//			try {
//				if (null != in) {
//					in.close();
//				}
//				if (null != out) {
//					out.close();
//				}
//			} catch (IOException e) {
//			}
//
//		}
//	}
//
//	/**
//	 *
//	 * 获取镜像，以及该镜像下的标签
//	 *
//	 * @param id
//	 * @param pager
//	 * @return
//	 */
//	@Override
//	public BocloudResult imagesTagsList(Long id, Pager pager) {
//		Map<String, String> sorter = new HashMap<>();
//		sorter.put("creation_time", Common.ONE);
//		pager.setSorter(sorter);
//		List<HarborImage> imageList = harborImageRepository.getByVendorId(id, pager);
//		for (HarborImage harborImage : imageList) {
//			harborImage.setTagList(harborTagRepository.tagListImageId(harborImage.getId()));
//		}
//		int total = harborImageRepository.countByVendorId(id, pager.getParams());
//		GridBean gridBean = new GridBean(pager.getPage(), pager.getRows(), total, imageList);
//		return new BocloudResult<>(true, gridBean, "查询成功");
//	}
//
//	/**
//	 *
//	 * 启动复制
//	 * 
//	 * @param harborId
//	 * @param params
//	 * @param context
//	 * @return
//	 */
//	@Override
//	public BocloudResult push(Long harborId, String params, RequestContext context) {
//		new Thread(() -> {
//			HarborUtil harborUtil = initAuth(harborId);
//			if (harborUtil == null) {
//				resourceEventPublisher.send(new OperateResult(false, "获取harbor权限失败！", "harbor.image", MapTools
//						.simpleMap(Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//				return;
//			}
//			JSONObject jsonObject = JSONObject.parseObject(params);
//			String password = jsonObject.getString("password");
//			Encryptor encryptor = new AESEncrptor();
//			try {
//				// 对密码解密，用于harbor权限
//				password = encryptor.decrypt(password, null);
//			} catch (Exception e) {
//				logger.info("密码转换错误：" + e);
//				resourceEventPublisher.send(new OperateResult(false, "推送失败！", "harbor.image", MapTools.simpleMap(
//						Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//				return;
//			}
//			Map<String, Object> credential = MapTools.simpleMap("type", "basic");
//			credential.put("access_key", jsonObject.getString("username"));
//			credential.put("access_secret", password);
//			Map<String, Object> clientParams = MapTools.simpleMap("credential", credential);
//			String url = jsonObject.getString("protocol") + "://" + jsonObject.getString("serverIp");
//			clientParams.put("url", url);
//			String uuNameRegistry = UUID.randomUUID().toString(); // 目标添加时候，不能重名
//				clientParams.put("name", uuNameRegistry);
//				clientParams.put("description", "");
//				clientParams.put("type", "harbor");
//				clientParams.put("insecure", false);
//				// 首先创建推送目标
//				Result result = harborUtil.httpConnection(harborUtil.getSectionUrl() + REGISTRIES,
//						HttpRequestMethod.POST, clientParams);
//				if (result.isSuccess()) {
//					result = harborUtil.httpConnection(harborUtil.getSectionUrl() + REGISTRIES + "?name="
//							+ uuNameRegistry, HttpRequestMethod.GET, null);
//					if (result.isSuccess()) {
//						JSONArray jsonArray = JSONArray.parseArray(result.getMessage());
//						for (Object o : jsonArray) { // 根据名字查询的结果，虽然是数组，实质上只有一组数据
//							JSONObject object = (JSONObject) o;
//							Long registryId = object.getLong("id");
//							Map<String, Object> registryMap = MapTools.simpleMap("id", registryId);
//							Map<String, Object> mapParams = MapTools.simpleMap("dest_registry", registryMap);
//							String uuNamePolicy = UUID.randomUUID().toString(); // 规则添加的时候，不能重名
//							mapParams.put("name", uuNamePolicy);
//							mapParams.put("override", true);
//							mapParams.put("deletion", true);
//							mapParams.put("enabled", true);
//							mapParams.put("trigger", JSONObject
//									.parseObject("{\"type\": \"manual\", \"trigger_settings\": {\"cron\": \"\"}}"));
//							mapParams.put(
//									"filters",
//									JSONObject.parseArray("[{\"type\":\"name\",\"value\":\""
//											+ jsonObject.getString("imageName") + "\"},"
//											+ "{\"type\":\"tag\",\"value\":\"" + jsonObject.getString("name") + "\"}]"));
//							// 创建推送规则
//							result = harborUtil.httpConnection(harborUtil.getSectionUrl() + POLICIES,
//									HttpRequestMethod.POST, mapParams);
//							if (result.isSuccess()) {
//								result = harborUtil.httpConnection(harborUtil.getSectionUrl() + POLICIES + "?name="
//										+ uuNamePolicy, HttpRequestMethod.GET, mapParams);
//								if (result.isSuccess()) {
//									JSONArray policyArr = JSONObject.parseArray(result.getMessage());
//									for (Object obj : policyArr) { // 虽然是数组，但是有且有一个
//										JSONObject objectPolicy = (JSONObject) obj;
//										Long policyId = objectPolicy.getLong("id");
//										// 进行推送
//										result = harborUtil.httpConnection(harborUtil.getSectionUrl() + EXECUTIONS,
//												HttpRequestMethod.POST, MapTools.simpleMap("policy_id", policyId));
//										if (result.isSuccess()) {
//											result = deleteRegistryAndPolicy(uuNamePolicy, uuNameRegistry, harborUtil);
//											resourceEventPublisher.send(new OperateResult(result.isSuccess(), result
//													.getMessage(), "harbor.image", MapTools.simpleMap(Common.VENDORID,
//													1), OperateResult.OperateCategory.ResourceEvent, context));
//											return;
//										}
//									}
//								}
//							}
//						}
//					}
//				}
//				logger.info("推送失败！" + result.getMessage());
//				resourceEventPublisher.send(new OperateResult(false, "推送失败！", "harbor.image", MapTools.simpleMap(
//						Common.VENDORID, 1), OperateResult.OperateCategory.ResourceEvent, context));
//			}).start();
//		logger.info("正在推送...");
//		return new BocloudResult<>(true, "正在推送...");
//	}
//
//	/**
//	 *
//	 * 推送完成后，删除目标与规则，防止堆积
//	 * 
//	 * @param uuNamePolicy
//	 * @param uuNameRegistry
//	 * @param harborUtil
//	 * @return
//	 */
//	private Result deleteRegistryAndPolicy(String uuNamePolicy, String uuNameRegistry, HarborUtil harborUtil) {
//		Result result = harborUtil.httpConnection(harborUtil.getSectionUrl() + POLICIES + "?name=" + uuNamePolicy,
//				HttpRequestMethod.GET, null);
//		if (result.isSuccess()) {
//			// 因为result是查询成功状态，所以该返回结果的json数组一定只有且只有一个对象
//			Long policyId = JSONArray.parseArray(result.getMessage()).getJSONObject(0).getLong("id");
//			String status = "InProgress";
//			while ("InProgress".equals(status)) { // 一直查询是否推送结束
//				result = harborUtil.httpConnection(harborUtil.getSectionUrl() + EXECUTIONS + "?policy_id=" + policyId,
//						HttpRequestMethod.GET, null);
//				if (result.isSuccess()) {
//					// 因为result是查询成功状态，所以该返回结果的json数组一定只有且只有一个对象
//					status = JSONArray.parseArray(result.getMessage()).getJSONObject(0).getString("status");
//				}
//				try {
//					Thread.sleep(1000); // 一秒去查看一次，避免网络请求太频繁
//				} catch (InterruptedException e) {
//					logger.info("中断异常");
//				}
//			}
//			// 说明镜像推送结束了，将上面的目标和规则删除
//			harborUtil.httpConnection(harborUtil.getSectionUrl() + POLICIES + "/" + policyId, HttpRequestMethod.DELETE,
//					null);
//			result = harborUtil.httpConnection(harborUtil.getSectionUrl() + REGISTRIES + "?name=" + uuNameRegistry,
//					HttpRequestMethod.GET, null);
//			if (result.isSuccess()) {
//				Long registryId = JSONArray.parseArray(result.getMessage()).getJSONObject(0).getLong("id");
//				harborUtil.httpConnection(harborUtil.getSectionUrl() + REGISTRIES + "/" + registryId,
//						HttpRequestMethod.DELETE, null);
//			}
//			if ("Succeed".equals(status)) {
//				logger.info("推送成功");
//				return new Result(true, "推送成功");
//			} else {
//				logger.info("推送失败");
//				return new Result(false, "推送失败");
//			}
//		} else {
//			logger.info("推送失败");
//			return new Result(false, "推送失败");
//		}
//	}
//
//	/**
//	 *
//	 * 更新镜像描述
//	 * 
//	 * @param harborId
//	 * @param params
//	 * @param context
//	 * @return
//	 */
//	@Override
//	public BocloudResult updateImageDescription(Long harborId, String params, RequestContext context) {
//		HarborUtil harborUtil = initAuth(harborId);
//		JSONObject jsonObject = JSONObject.parseObject(params);
//		String imageName = jsonObject.getString("name");
//		String description = jsonObject.getString("description");
//		if (harborUtil == null) {
//			logger.info("更新失败，权限获取失败！");
//			return new BocloudResult<>(false, "更新失败，权限获取失败！");
//		}
//		Result result = harborUtil.httpConnection(harborUtil.getSectionUrl() + TAGS + imageName, HttpRequestMethod.PUT,
//				MapTools.simpleMap("description", description));
//		if (result.isSuccess()) {
//			harborImageRepository.updateByNameAndHarborId(harborId, imageName, context.getTarget(), description);
//			logger.info("更新成功！");
//			return new BocloudResult<>(true, "更新成功！");
//		}
//		logger.info("更新失败！" + result.getMessage());
//		return new BocloudResult<>(false, "更新失败！");
//	}
//}
