ProjectServiceImpl.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package nju.seec.SEECdemo.logic.service.impl;
  2. import io.kubernetes.client.models.V1LimitRange;
  3. import nju.seec.SEECdemo.data.entity.ResourceConfig;
  4. import nju.seec.SEECdemo.logic.api.k8s.LimitRangeApi;
  5. import nju.seec.SEECdemo.logic.api.k8s.NamespaceApi;
  6. import nju.seec.SEECdemo.logic.api.k8s.ResourceQuotaApi;
  7. import nju.seec.SEECdemo.logic.api.k8s.SecretApi;
  8. import nju.seec.SEECdemo.logic.api.k8s.model.Namespace;
  9. import nju.seec.SEECdemo.logic.api.k8s.model.ResourceQuota;
  10. import nju.seec.SEECdemo.logic.service.DBService;
  11. import nju.seec.SEECdemo.logic.service.ProjectService;
  12. import nju.seec.SEECdemo.logic.vo.DBDetailVO;
  13. import nju.seec.SEECdemo.logic.vo.ProjectVO;
  14. import nju.seec.SEECdemo.logic.vo.projecttemplate.ProjectTemplate;
  15. import nju.seec.SEECdemo.util.ApplicationProperties;
  16. import nju.seec.SEECdemo.util.DateUtil;
  17. import nju.seec.SEECdemo.util.LoggerUtil;
  18. import org.slf4j.Logger;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import java.time.LocalDate;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import static nju.seec.SEECdemo.util.Constants.*;
  25. @Service
  26. public class ProjectServiceImpl implements ProjectService{
  27. private static final Logger logger = LoggerUtil.getLogger(ProjectService.class);
  28. @Autowired
  29. private NamespaceApi namespaceApi;
  30. @Autowired
  31. private ResourceQuotaApi resourceQuotaApi;
  32. @Autowired
  33. private ProjectTemplate seecIITemplate;
  34. @Autowired
  35. private SecretApi secretApi;
  36. @Autowired
  37. private DBService dbService;
  38. @Autowired
  39. private ApplicationProperties applicationProperties;
  40. @Autowired
  41. private LimitRangeApi limitRangeApi;
  42. @Override
  43. public ProjectVO createSeecIIProject(String projectName, String description, LocalDate startsAt, LocalDate endsAt) {
  44. if (namespaceApi.exists(projectName)) {
  45. LoggerUtil.error(logger, "项目已经存在, projectName={}", projectName);
  46. return null;
  47. }
  48. try {
  49. //创建部署空间
  50. String type = seecIITemplate.getName();
  51. Namespace namespace = buildNamespace(projectName, type, description, startsAt, endsAt);
  52. namespaceApi.create(namespace);
  53. } catch (Exception e) {
  54. LoggerUtil.error(logger, e, "创建项目失败,projectName={}, projectType={}", projectName, seecIITemplate.getName());
  55. return null;
  56. }
  57. try {
  58. //为部署空间配置私有仓库密钥
  59. ApplicationProperties.Registry registry = applicationProperties.getRegistry();
  60. secretApi.createPrivateRegistrySecret(projectName, registry.getHost(), registry.getUsername(), registry.getPassword());
  61. //创建项目资源限额
  62. ResourceQuota resourceQuota = buildResourceQuota(projectName, seecIITemplate.getDefaultResourceConfig());
  63. resourceQuotaApi.create(resourceQuota);
  64. //创建项目资源默认配额
  65. V1LimitRange v1LimitRange = buildLimitRange(projectName, seecIITemplate.getDefaultResourceConfig());
  66. limitRangeApi.createLimitRange(projectName, v1LimitRange);
  67. //创建项目同名数据库
  68. DBDetailVO dbDetailVO = dbService.createSchemaAndUserForProject(projectName);
  69. Map<String, byte[]> data = new HashMap<>();
  70. data.put("DB_URL", dbDetailVO.getUrl().getBytes());
  71. data.put("DB_SCHEMA", dbDetailVO.getSchema().getBytes());
  72. data.put("DB_USERNAME", dbDetailVO.getUsername().getBytes());
  73. data.put("DB_PASSWORD", dbDetailVO.getPassword().getBytes());
  74. secretApi.createGenericSecret(projectName, projectName + "-" + DB_SECRET_NAME, data);
  75. //封装返回数据
  76. ProjectVO projectVO = new ProjectVO();
  77. projectVO.setName(projectName);
  78. projectVO.setDescription(description);
  79. projectVO.setStartsAt(DateUtil.fromDateToString(startsAt));
  80. projectVO.setEndsAt(DateUtil.fromDateToString(endsAt));
  81. projectVO.getExtra().put(ProjectVO.DB, dbDetailVO);
  82. return projectVO;
  83. } catch (Exception e) {
  84. LoggerUtil.error(logger, e, "配置项目失败,projectName={}, projectType={}", projectName, seecIITemplate.getName());
  85. namespaceApi.delete(projectName);
  86. }
  87. return null;
  88. }
  89. @Override
  90. public boolean deleteProject(long projectId) {
  91. return false;
  92. }
  93. @Override
  94. public boolean deleteProjectForce(long projectId) {
  95. return false;
  96. }
  97. /**
  98. * 根据项目信息构建Namespace
  99. * @param projectName Namespace的名称
  100. * @param type 项目的类型,存在Namespace的标签中
  101. * @param description 项目的描述,可以存在Namespace的标签或者注释中
  102. * @param startsAt 项目开始时间,存在Namespace的标签中
  103. * @param endsAt 项目的结束时间,存在Namespace的标签中
  104. * @return
  105. */
  106. private Namespace buildNamespace(String projectName, String type, String description, LocalDate startsAt, LocalDate endsAt){
  107. Namespace namespace = new Namespace();
  108. namespace.setName(projectName);
  109. namespace.addToLabel(TYPE_LABEL, type);
  110. namespace.addToLabel(DESCRIPTION_LABEL, description);
  111. namespace.addToLabel(STARTS_AT_LABEL, DateUtil.fromDateToString(startsAt, DateUtil.BASE_DATE_FORMAT));
  112. namespace.addToLabel(ENDS_AT_LABEL, DateUtil.fromDateToString(endsAt, DateUtil.BASE_DATE_FORMAT));
  113. return namespace;
  114. }
  115. private ResourceQuota buildResourceQuota(String projectName, ResourceConfig resourceConfig) {
  116. ResourceQuota resourceQuota = new ResourceQuota();
  117. resourceQuota.setNamespace(projectName);
  118. resourceQuota.setName(projectName);
  119. resourceQuota.setMaxMemoryTotalRequest(resourceConfig.getMaxMemory());
  120. resourceQuota.setMaxMemoryTotalLimit(resourceConfig.getMaxMemory());
  121. resourceQuota.setMaxCpuTotalRequest(resourceConfig.getMaxCPU());
  122. resourceQuota.setMaxCpuTotalLimit(resourceConfig.getMaxCPU());
  123. return resourceQuota;
  124. }
  125. private V1LimitRange buildLimitRange(String projectName, ResourceConfig resourceConfig) {
  126. //配置应用的默认配额
  127. Map<String, Integer> defaultValue = new HashMap<>();
  128. defaultValue.put("cpu", 50);
  129. defaultValue.put("memory", 500);
  130. V1LimitRange v1LimitRange = limitRangeApi.toLimitRange(projectName, projectName, defaultValue, defaultValue, null, null);
  131. return v1LimitRange;
  132. }
  133. }