|
|
@@ -1,11 +1,16 @@
|
|
|
package nju.seec.SEECdemo.logic.service.impl;
|
|
|
|
|
|
+import io.kubernetes.client.models.V1LimitRange;
|
|
|
+import nju.seec.SEECdemo.data.entity.ResourceConfig;
|
|
|
+import nju.seec.SEECdemo.logic.api.k8s.LimitRangeApi;
|
|
|
import nju.seec.SEECdemo.logic.api.k8s.NamespaceApi;
|
|
|
+import nju.seec.SEECdemo.logic.api.k8s.ResourceQuotaApi;
|
|
|
import nju.seec.SEECdemo.logic.api.k8s.SecretApi;
|
|
|
import nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException;
|
|
|
-import nju.seec.SEECdemo.logic.api.k8s.vo.Namespace;
|
|
|
+import nju.seec.SEECdemo.logic.api.k8s.vo.*;
|
|
|
import nju.seec.SEECdemo.logic.service.DBService;
|
|
|
import nju.seec.SEECdemo.logic.service.ProjectService;
|
|
|
+import nju.seec.SEECdemo.logic.vo.DBDetailVO;
|
|
|
import nju.seec.SEECdemo.logic.vo.ProjectVO;
|
|
|
import nju.seec.SEECdemo.logic.vo.projecttemplate.ProjectTemplate;
|
|
|
import nju.seec.SEECdemo.util.ApplicationProperties;
|
|
|
@@ -16,6 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDate;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
import static nju.seec.SEECdemo.util.Constants.*;
|
|
|
|
|
|
@@ -27,6 +34,9 @@ public class ProjectServiceImpl implements ProjectService{
|
|
|
@Autowired
|
|
|
private NamespaceApi namespaceApi;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ResourceQuotaApi resourceQuotaApi;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ProjectTemplate seecIITemplate;
|
|
|
|
|
|
@@ -39,39 +49,70 @@ public class ProjectServiceImpl implements ProjectService{
|
|
|
@Autowired
|
|
|
private ApplicationProperties applicationProperties;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private LimitRangeApi limitRangeApi;
|
|
|
+
|
|
|
@Override
|
|
|
public ProjectVO createSeecIIProject(String projectName, String description, LocalDate startsAt, LocalDate endsAt) {
|
|
|
- try {
|
|
|
- if (namespaceApi.exists(projectName)){
|
|
|
- LoggerUtil.error(logger, "该项目已经存在,projectName={}", projectName);
|
|
|
- //抛出异常
|
|
|
- }
|
|
|
+ if (namespaceApi.exists(projectName)) {
|
|
|
+ LoggerUtil.error(logger, "项目已经存在, projectName={}", projectName);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
+ try {
|
|
|
+ //创建部署空间
|
|
|
String type = seecIITemplate.getName();
|
|
|
Namespace namespace = buildNamespace(projectName, type, description, startsAt, endsAt);
|
|
|
namespaceApi.create(namespace);
|
|
|
-
|
|
|
- //为命名空间配置私有仓库密钥
|
|
|
+ } catch (K8sApiException e) {
|
|
|
+ LoggerUtil.error(logger, e, "创建项目失败,projectName={}, projectType={}", projectName, seecIITemplate.getName());
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ //为部署空间配置私有仓库密钥
|
|
|
ApplicationProperties.Registry registry = applicationProperties.getRegistry();
|
|
|
secretApi.createPrivateRegistrySecret(projectName, registry.getHost(), registry.getUsername(), registry.getPassword());
|
|
|
|
|
|
- ApplicationProperties.K8s k8s = applicationProperties
|
|
|
+ //创建项目资源限额
|
|
|
+ ResourceConfig resourceConfig = seecIITemplate.getDefaultResourceConfig();
|
|
|
+ ResourceQuota resourceQuota = new ResourceQuota();
|
|
|
+ resourceQuota.setNamespace(projectName);
|
|
|
+ resourceQuota.setName(projectName);
|
|
|
+ resourceQuota.setMaxMemoryTotalRequest(resourceConfig.getMaxMemory());
|
|
|
+ resourceQuota.setMaxMemoryTotalLimit(resourceConfig.getMaxMemory());
|
|
|
+ resourceQuota.setMaxCpuTotalRequest(resourceConfig.getMaxCPU());
|
|
|
+ resourceQuota.setMaxCpuTotalLimit(resourceConfig.getMaxCPU());
|
|
|
+ resourceQuotaApi.create(resourceQuota);
|
|
|
+
|
|
|
+ //配置应用的默认配额
|
|
|
+ Map<String, Integer> defaultValue = new HashMap<>();
|
|
|
+ defaultValue.put("cpu", resourceConfig.getDefaultCPU().getQuantity());
|
|
|
+ defaultValue.put("memory", resourceConfig.getDefaultMemory().getQuantity().intValue());
|
|
|
+ V1LimitRange v1LimitRange = limitRangeApi.toLimitRange(projectName, projectName, defaultValue, defaultValue, null, null);
|
|
|
+ limitRangeApi.createLimitRange(projectName, v1LimitRange);
|
|
|
+
|
|
|
+ //创建项目同名数据库
|
|
|
+ DBDetailVO dbDetailVO = dbService.createSchemaAndUserForProject(projectName);
|
|
|
+ Map<String, byte[]> data = new HashMap<>();
|
|
|
+ data.put("DB_URL", dbDetailVO.getUrl().getBytes());
|
|
|
+ data.put("DB_SCHEMA", dbDetailVO.getSchema().getBytes());
|
|
|
+ data.put("DB_USERNAME", dbDetailVO.getUsername().getBytes());
|
|
|
+ data.put("DB_PASSWORD", dbDetailVO.getPassword().getBytes());
|
|
|
+ secretApi.createGenericSecret(projectName, projectName + "-" + DB_SECRET_NAME, data);
|
|
|
+
|
|
|
+ //@todo密码存在哪里?
|
|
|
+
|
|
|
+ //封装返回数据
|
|
|
+ ProjectVO projectVO = new ProjectVO();
|
|
|
+ projectVO.setName(projectName);
|
|
|
+ projectVO.setDescription(description);
|
|
|
+ projectVO.setStartsAt(DateUtil.fromDateToString(startsAt));
|
|
|
+ projectVO.setEndsAt(DateUtil.fromDateToString(endsAt));
|
|
|
+ projectVO.getExtra().put(ProjectVO.DB, dbDetailVO);
|
|
|
+ return projectVO;
|
|
|
} catch (K8sApiException e) {
|
|
|
- LoggerUtil.error(logger, e, "创建项目失败,projectName={}, projectType={}", projectName, seecIITemplate.getName());
|
|
|
-
|
|
|
- if (e.getCode() == K8sApiException.NAMESPACE_NOT_EXIST) {
|
|
|
-
|
|
|
- }else {
|
|
|
-
|
|
|
- }
|
|
|
+ LoggerUtil.error(logger, e, "配置项目失败,projectName={}, projectType={}", projectName, seecIITemplate.getName());
|
|
|
+ namespaceApi.deleteByName(projectName);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ProjectVO createSeecIIProjectAsync(String projectName, String description, LocalDate startsAt, LocalDate endsAt) {
|
|
|
return null;
|
|
|
}
|
|
|
|