物理机创建、查询优化

develop
yuemian 2024-09-03 15:09:48 +08:00
parent c81027e127
commit ce82e9271e
4 changed files with 104 additions and 26 deletions

View File

@ -220,7 +220,7 @@ public class TianyiLocationProvider extends TianyiProvider {
} }
log.info("获取物理机信息..."); log.info("获取物理机信息...");
TianyiPhysicalProvider physicalProvider = new TianyiPhysicalProvider(this.getButler()); TianyiPhysicalProvider physicalProvider = new TianyiPhysicalProvider(this.getButler());
GeneralResult<List<PhysicalServerModel>> physicalResult = physicalProvider.list(); GeneralResult<List<PhysicalServerModel>> physicalResult = physicalProvider.list(null);
log.info("同步物理机结果:{}", physicalResult.isSuccess()); log.info("同步物理机结果:{}", physicalResult.isSuccess());
if(physicalResult.isSuccess()){ if(physicalResult.isSuccess()){
syncModel.setPhysicalModels(physicalResult.getData()); syncModel.setPhysicalModels(physicalResult.getData());

View File

@ -1,5 +1,6 @@
package com.bocloud.ctstack.plugin.provider.compute; package com.bocloud.ctstack.plugin.provider.compute;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bocloud.cmp.domain.Butler; import com.bocloud.cmp.domain.Butler;
@ -55,14 +56,14 @@ public class TianyiPhysicalProvider extends TianyiProvider {
physicalModels.add(physcicalConvertor.convertModel(model)); physicalModels.add(physcicalConvertor.convertModel(model));
} }
} }
return new GeneralResult(true, physicalModels, "查询宿主机列表成功"); return new GeneralResult(true, physicalModels, "查询物理机列表成功");
} catch (Exception e) { } catch (Exception e) {
log.error("查询宿主机列表失败 ", e); log.error("查询物理机列表失败 ", e);
return new GeneralResult(false, "查询宿主机列表失败" + e.getMessage()); return new GeneralResult(false, "查询物理机列表失败" + e.getMessage());
} }
} }
/*public GeneralResult create(PhysicalServerModel model) { public GeneralResult create(PhysicalServerModel model) {
try { try {
String apiUrl = "/v4/ebm/create"; String apiUrl = "/v4/ebm/create";
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
@ -95,30 +96,28 @@ public class TianyiPhysicalProvider extends TianyiProvider {
Result result = doPost(apiUrl, jsonObject); Result result = doPost(apiUrl, jsonObject);
JSONObject returnObj = checkResult(result, "创建物理机"); JSONObject returnObj = checkResult(result, "创建物理机");
List<JSONObject> resources = returnObj.getJSONArray("resources").toJavaList(JSONObject.class); List<JSONObject> resources = returnObj.getJSONArray("resources").toJavaList(JSONObject.class);
String resourceID = resources.get(0).getString("resourceID"); if (CollectionUtils.isEmpty(resources)) {
if (resourceID == null) { return GeneralResult.FAILED("物理机创建失败无创建resource信息返回");
return new GeneralResult(false, "创建物理机失败!");
} }
Long startTime = System.currentTimeMillis(); List<PhysicalServerModel> models = new ArrayList<>();
while (true) { List<String> resourceIds = new ArrayList<>();
sleepSomeTime(5000); for (JSONObject resource : resources) {
PhysicalServerModel physicalServerModel = (PhysicalServerModel) detail(resourceID, model.getRegionId(), false).getData(); String resourceId = resource.getString("resourceID");
if (null != physicalServerModel) { resourceIds.add(resourceId);
return new GeneralResult<>(true, physicalServerModel, "success");
} else {
log.warn("根据ResourceId[{}]查询云主机信息返回空数据", resourceID);
}
Long endTime = System.currentTimeMillis();
// 等待三分钟
if (endTime - startTime > 15 * 60 * 1000) {
return GeneralResult.FAILED("查询资源详情超时!");
}
} }
GeneralResult modelResult = listByResourceId(resourceIds, model.getZoneId());
Object modelObject = modelResult.getData();
if (modelObject != null) {
models = JSONArray.parseArray(JSON.toJSONString(modelObject), PhysicalServerModel.class);
} else {
return GeneralResult.FAILED("物理主机批量创建完全失败");
}
return new GeneralResult<>(true, models, "success");
} catch (Exception e) { } catch (Exception e) {
log.error("创建物理机失败 " + e.getMessage(), e); log.error("创建物理机失败 " + e.getMessage(), e);
return GeneralResult.FAILED("创建物理机失败:" + e.getMessage()); return GeneralResult.FAILED("创建物理机失败:" + e.getMessage());
} }
}*/ }
public List<JSONObject> listZones(String regionId) { public List<JSONObject> listZones(String regionId) {
try { try {
@ -176,4 +175,41 @@ public class TianyiPhysicalProvider extends TianyiProvider {
} }
public GeneralResult<List<PhysicalServerModel>> listByResourceId(List<String> resourceIds, String zoneId) {
try {
List<PhysicalServerModel> physicalModels = new ArrayList<>();
for (String resourceId : resourceIds) {
long startTime = System.currentTimeMillis();
Boolean flag = true;
while (flag) {
if (System.currentTimeMillis() - startTime > 3 * 60 * 1000) {
flag = false;
}
String apiUrl = "/v4/ebm/list";
JSONObject body = new JSONObject();
body.put("regionID", this.getRegionId());
body.put("azName", zoneId);
body.put("resourceID", resourceId);
Result result = doGet(apiUrl, null, body);
JSONObject returnObj = checkResult(result, "查询物理机列表");
List<JSONObject> results = new ArrayList<>();
results.addAll(JSONArray.parseArray(returnObj.getString("results"), JSONObject.class));
if (!CollectionUtils.isEmpty(results)) {
for (JSONObject model : results) {
physicalModels.add(physcicalConvertor.convertModel(model));
}
flag = false;
}
}
}
if (physicalModels.size() != resourceIds.size()) {
return new GeneralResult<>(false, physicalModels, "部分成功");
}
return new GeneralResult(true, physicalModels, "查询物理机列表成功");
} catch (Exception e) {
log.error("查询物理机列表失败 ", e);
return new GeneralResult(false, "查询物理机列表失败" + e.getMessage());
}
}
} }

View File

@ -64,7 +64,11 @@ public class PhysicalServerRepository extends BasicGenericDao<PhysicalServer, Lo
} }
public List<PhysicalServer> list(int page, int rows, List<Param> params, Map<String, String> sorter) throws Exception { public List<PhysicalServer> list(int page, int rows, List<Param> params, Map<String, String> sorter) throws Exception {
String sql = "select a.* from physical_server a where 1 = 1 "; String sql = "select a.*, b.name vpc_name, c.name subnet_name from physical_server a " +
"left join vpc b on b.vpc_id = a.vpc_uuid " +
"left join subnet c on c.subnet_uuid = a.subnet_uuid " +
"left join zone d on d.zone_id = a.zone_id " +
"where 1 = 1 ";
sql = this.getQueryBuilder().build(sql, new Pager(page, rows, params, sorter), "a"); sql = this.getQueryBuilder().build(sql, new Pager(page, rows, params, sorter), "a");
Map<String, Object> param = this.getQueryBuilder().getParam(params); Map<String, Object> param = this.getQueryBuilder().getParam(params);
return this.list(PhysicalServer.class, sql, param); return this.list(PhysicalServer.class, sql, param);

View File

@ -1,13 +1,15 @@
package com.bocloud.ctstack.plugin.service.impl; package com.bocloud.ctstack.plugin.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.bocloud.cmp.entity.CloudVendor; import com.bocloud.cmp.entity.CloudVendor;
import com.bocloud.cmp.entity.PhysicalServer; import com.bocloud.cmp.entity.PhysicalServer;
import com.bocloud.cmp.repository.CloudVendorRepository; import com.bocloud.cmp.repository.CloudVendorRepository;
import com.bocloud.ctstack.plugin.repository.PhysicalServerRepository;
import com.bocloud.ctstack.plugin.config.ButlerConfig; import com.bocloud.ctstack.plugin.config.ButlerConfig;
import com.bocloud.ctstack.plugin.domain.model.PhysicalServerModel; import com.bocloud.ctstack.plugin.domain.model.PhysicalServerModel;
import com.bocloud.ctstack.plugin.entity.Label; import com.bocloud.ctstack.plugin.entity.Label;
import com.bocloud.ctstack.plugin.provider.compute.TianyiPhysicalProvider; import com.bocloud.ctstack.plugin.provider.compute.TianyiPhysicalProvider;
import com.bocloud.ctstack.plugin.repository.PhysicalServerRepository;
import com.bocloud.ctstack.plugin.repository.ResourceEventRepository; import com.bocloud.ctstack.plugin.repository.ResourceEventRepository;
import com.bocloud.ctstack.plugin.repository.VolumeRepository; import com.bocloud.ctstack.plugin.repository.VolumeRepository;
import com.bocloud.ctstack.plugin.repository.VpcRepository; import com.bocloud.ctstack.plugin.repository.VpcRepository;
@ -22,9 +24,11 @@ import com.megatron.common.utils.GridHelper;
import com.megatron.framework.lock.AutoCloseLock; import com.megatron.framework.lock.AutoCloseLock;
import com.megatron.framework.lock.LockFactory; import com.megatron.framework.lock.LockFactory;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -85,7 +89,39 @@ public class PhysicalServerServiceImpl implements PhysicalServerService {
@Override @Override
public GeneralResult<PhysicalServer> create(PhysicalServer physicalServer, RequestContext context) { public GeneralResult<PhysicalServer> create(PhysicalServer physicalServer, RequestContext context) {
return null; // 云平台ID
Long vendorId = physicalServer.getVendorId();
String path = CloudVendor.class.getSimpleName() + "_" + vendorId + "_SYNC";
try (AutoCloseLock lock = lockFactory.getACLock(path)) {
if (!lock.acquire(10, TimeUnit.SECONDS)) {
log.warn("当前云平台存在同步任务,稍后创建");
return GeneralResult.FAILED("当前云平台存在同步任务,稍后创建!");
}
CloudVendor vendor = cloudVendorRepository.query(vendorId);
Assert.notNull(vendor, "云平台不存在");
new Thread(() -> {
TianyiPhysicalProvider physicalProvider = new TianyiPhysicalProvider(butlerConfig.regionButler(vendor.getUuid(), physicalServer.getRegionId()));
PhysicalServerModel model = new PhysicalServerModel();
BeanUtils.copyProperties(physicalServer, model);
GeneralResult result = physicalProvider.create(model);
if (result.isSuccess()) {
if (result.getData() != null) {
List<PhysicalServerModel> models = JSONArray.parseArray(JSON.toJSONString(result.getData()), PhysicalServerModel.class);
if (!CollectionUtils.isEmpty(models)) {
for (PhysicalServerModel serverModel: models) {
PhysicalServer server = new PhysicalServer();
BeanUtils.copyProperties(serverModel, server);
physicalServerRepository.save(server);
}
}
}
}
}).start();
return new GeneralResult<>(true, "裸金属创建任务下发成功!");
} catch (Exception e) {
log.error("Get error message" + e.getMessage(), e);
return GeneralResult.FAILED("裸金属创建失败:" + e.getMessage());
}
} }
@Override @Override
@ -108,10 +144,12 @@ public class PhysicalServerServiceImpl implements PhysicalServerService {
model.setRegionId(oldServer.getRegionId()); model.setRegionId(oldServer.getRegionId());
model.setZoneId(oldServer.getZoneId()); model.setZoneId(oldServer.getZoneId());
model.setRemark(physicalServer.getRemark()); model.setRemark(physicalServer.getRemark());
model.setDisplayName(physicalServer.getDisplayName());
TianyiPhysicalProvider physicalProvider = new TianyiPhysicalProvider(butlerConfig.regionButler(vendor.getUuid(), oldServer.getRegionId())); TianyiPhysicalProvider physicalProvider = new TianyiPhysicalProvider(butlerConfig.regionButler(vendor.getUuid(), oldServer.getRegionId()));
GeneralResult result = physicalProvider.modify(model); GeneralResult result = physicalProvider.modify(model);
if (result.isSuccess()) { if (result.isSuccess()) {
oldServer.setRemark(physicalServer.getRemark()); oldServer.setRemark(physicalServer.getRemark());
oldServer.setDisplayName(physicalServer.getDisplayName());
physicalServerRepository.update(oldServer); physicalServerRepository.update(oldServer);
} }
}).start(); }).start();