Add city to datacenter, cloudsystem to summary, fix listener

This commit is contained in:
Ali Sadeghi
2025-08-19 04:15:05 +03:00
parent 64eef4c695
commit e9dc6a87ff
13 changed files with 89 additions and 36 deletions

View File

@@ -2,6 +2,7 @@ package com.sgs.graphql.dataCenter.domain;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.sgs.graphql.area.domain.Area;
import com.sgs.graphql.city.domain.City;
import com.sgs.graphql.sector.domain.Sector;
import com.sgs.graphql.subSector.domain.SubSector;
import com.sgs.graphql.emissionScope.domain.EmissionScope;
@@ -29,6 +30,7 @@ public class DataCenter extends BaseDomain {
private Integer number;
private Area area;
private City city;
private List<PhysicalMachine> physicalMachines = new ArrayList<>();
private List<DataCenterEmissionSource> dataCenterEmissionSources = new ArrayList<>();
@@ -134,6 +136,16 @@ public class DataCenter extends BaseDomain {
this.area = area;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "city_id")
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sub_sector_id")
public SubSector getSubSector() {

View File

@@ -19,6 +19,8 @@ public class DataCenterCreateInput extends BaseCreateInput {
@NotNull(message = "Alan ID gereklidir")
private UUID areaId;
private UUID cityId;
@NotNull(message = "Sektör ID gereklidir")
private UUID sectorId;
@@ -51,6 +53,9 @@ public class DataCenterCreateInput extends BaseCreateInput {
public UUID getAreaId() { return areaId; }
public void setAreaId(UUID areaId) { this.areaId = areaId; }
public UUID getCityId() { return cityId; }
public void setCityId(UUID cityId) { this.cityId = cityId; }
public UUID getSectorId() { return sectorId; }
public void setSectorId(UUID sectorId) { this.sectorId = sectorId; }

View File

@@ -11,6 +11,7 @@ public class DataCenterUpdateInput extends BaseUpdateInput {
private Double consuptionAmount;
private UUID areaId;
private UUID cityId;
private UUID sectorId;
private UUID subSectorId;
private UUID emissionScopeId;
@@ -41,6 +42,9 @@ public class DataCenterUpdateInput extends BaseUpdateInput {
public UUID getAreaId() { return areaId; }
public void setAreaId(UUID areaId) { this.areaId = areaId; }
public UUID getCityId() { return cityId; }
public void setCityId(UUID cityId) { this.cityId = cityId; }
public UUID getSectorId() { return sectorId; }
public void setSectorId(UUID sectorId) { this.sectorId = sectorId; }

View File

@@ -12,6 +12,7 @@ import com.sgs.graphql.emissionSource.service.EmissionSourceService;
import com.sgs.graphql.emissionScope.service.EmissionScopeService;
import com.sgs.graphql.consuptionUnit.service.ConsuptionUnitService;
import com.sgs.graphql.activitySubUnit.service.ActivitySubUnitService;
import com.sgs.graphql.city.service.CityService;
import com.sgs.lib.dao.mutation.mapper.BaseCreateUpdateMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -29,12 +30,13 @@ public class DataCenterMapper extends BaseCreateUpdateMapper<DataCenter, DataCen
private final EmissionScopeService emissionScopeService;
private final ConsuptionUnitService consuptionUnitService;
private final ActivitySubUnitService activitySubUnitService;
private final CityService cityService;
@Autowired
public DataCenterMapper(AreaService areaService, SectorService sectorService,
SubSectorService subSectorService, EmissionSourceService emissionSourceService,
EmissionScopeService emissionScopeService, ConsuptionUnitService consuptionUnitService,
ActivitySubUnitService activitySubUnitService) {
ActivitySubUnitService activitySubUnitService, CityService cityService) {
this.areaService = areaService;
this.sectorService = sectorService;
this.subSectorService = subSectorService;
@@ -42,6 +44,7 @@ public class DataCenterMapper extends BaseCreateUpdateMapper<DataCenter, DataCen
this.emissionScopeService = emissionScopeService;
this.consuptionUnitService = consuptionUnitService;
this.activitySubUnitService = activitySubUnitService;
this.cityService = cityService;
}
@Override
@@ -58,6 +61,9 @@ public class DataCenterMapper extends BaseCreateUpdateMapper<DataCenter, DataCen
if (input.getAreaId() != null) {
entity.setArea(areaService.findById(input.getAreaId()).orElse(null));
}
if (input.getCityId() != null) {
entity.setCity(cityService.findById(input.getCityId()).orElse(null));
}
if (input.getSectorId() != null) {
entity.setSector(sectorService.findById(input.getSectorId()).orElse(null));
@@ -135,6 +141,9 @@ public class DataCenterMapper extends BaseCreateUpdateMapper<DataCenter, DataCen
if (input.getAreaId() != null) {
entity.setArea(areaService.findById(input.getAreaId()).orElse(null));
}
if (input.getCityId() != null) {
entity.setCity(cityService.findById(input.getCityId()).orElse(null));
}
if (input.getSectorId() != null) {
entity.setSector(sectorService.findById(input.getSectorId()).orElse(null));

View File

@@ -15,7 +15,7 @@ public class VMEmissionSummary {
private Double totalEmission; // Individual record's total emission
private LocalDateTime createdDate; // When this specific record was created
private String physicalMachine;
private String project;
private String cloudSystem; // From physical machine
private String dataCenter;
// Individual emission values for this specific record
@@ -31,7 +31,7 @@ public class VMEmissionSummary {
public VMEmissionSummary(UUID vmId, String vmName, Double vmPower, String vmStatus,
Double totalEmission, LocalDateTime createdDate,
String physicalMachine, String project, String dataCenter,
String physicalMachine, String cloudSystem, String dataCenter,
Double co2, Double ch4, Double n2o) {
this.vmId = vmId;
this.vmName = vmName;
@@ -40,7 +40,7 @@ public class VMEmissionSummary {
this.totalEmission = totalEmission;
this.createdDate = createdDate;
this.physicalMachine = physicalMachine;
this.project = project;
this.cloudSystem = cloudSystem;
this.dataCenter = dataCenter;
this.co2 = co2;
this.ch4 = ch4;
@@ -70,8 +70,8 @@ public class VMEmissionSummary {
public String getPhysicalMachine() { return physicalMachine; }
public void setPhysicalMachine(String physicalMachine) { this.physicalMachine = physicalMachine; }
public String getProject() { return project; }
public void setProject(String project) { this.project = project; }
public String getCloudSystem() { return cloudSystem; }
public void setCloudSystem(String cloudSystem) { this.cloudSystem = cloudSystem; }
public String getDataCenter() { return dataCenter; }
public void setDataCenter(String dataCenter) { this.dataCenter = dataCenter; }

View File

@@ -55,7 +55,7 @@ public class MainDataTableQueryResolver implements GraphQLQueryResolver {
* @param projectId Optional project ID to filter VMs by project
* @return List of VM emission summaries including datacenter, project, aggregate, and physical machine info
*/
public List<VMEmissionSummary> vmEmissionSummary(UUID datacenterId, UUID projectId) {
return mainDataTableService.getVMEmissionSummaries(datacenterId, projectId);
public List<VMEmissionSummary> vmEmissionSummary(UUID datacenterId) {
return mainDataTableService.getVMEmissionSummaries(datacenterId);
}
}

View File

@@ -33,24 +33,16 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
}
public List<VMEmissionSummary> getVMEmissionSummaries() {
return getVMEmissionSummaries(null, null);
return getVMEmissionSummaries(null);
}
public List<VMEmissionSummary> getVMEmissionSummaries(UUID datacenterId) {
return getVMEmissionSummaries(datacenterId, null);
}
public List<VMEmissionSummary> getVMEmissionSummaries(UUID datacenterId, UUID projectId) {
List<String> whereConditions = new ArrayList<>();
if (datacenterId != null) {
whereConditions.add("dc.id = decode(replace(:datacenterId, '-', ''), 'hex')");
}
if (projectId != null) {
whereConditions.add("p.id = decode(replace(:projectId, '-', ''), 'hex')");
}
String whereClause = whereConditions.isEmpty() ? "" :
"WHERE " + String.join(" AND ", whereConditions) + " ";
@@ -63,7 +55,7 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
mdt.total_emission,
mdt.created_date,
pm.name as physical_machine_name,
p.name as project_name,
pm.cloud_system as cloud_system,
dc.data_center_name as datacenter_name,
mdt.co2,
mdt.ch4,
@@ -71,8 +63,7 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
FROM main_data_table mdt
JOIN vm v ON mdt.vm_id = v.id
LEFT JOIN physical_machine pm ON v.physical_machine_id = pm.id
LEFT JOIN project p ON pm.project_id = p.id
LEFT JOIN data_center dc ON p.data_center_id = dc.id
LEFT JOIN data_center dc ON pm.data_center_id = dc.id
""" + whereClause + """
ORDER BY mdt.created_date DESC, v.vm_name
""";
@@ -84,10 +75,6 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
query.setParameter("datacenterId", datacenterId.toString());
}
if (projectId != null) {
query.setParameter("projectId", projectId.toString());
}
@SuppressWarnings("unchecked")
List<Object[]> results = query.getResultList();
@@ -111,7 +98,7 @@ public class MainDataTableService extends BaseService<MainDataTable, MainDataTab
}
summary.setPhysicalMachine((String) row[6]);
summary.setProject((String) row[7]);
summary.setCloudSystem((String) row[7]);
summary.setDataCenter((String) row[8]);
// Individual emission values

View File

@@ -217,6 +217,7 @@ public class MessageListener {
pm.setName(pmDto.getName());
pm.setIp(pmIp); // Use the IP from the map key
pm.setTag(pmDto.getTag());
pm.setCloudSystem(pmDto.getCloudSystem());
pm.setPower(pmDto.getPower());
pm.setDataCenter(entity);
@@ -282,16 +283,17 @@ public class MessageListener {
pm.setName(newPm.getName());
pm.setIp(newPm.getIp());
pm.setTag(newPm.getTag());
pm.setCloudSystem(newPm.getCloudSystem());
pm.setPower(newPm.getPower());
System.out.println("✅ Updated existing PM: " + pm.getName() + " (IP: " + pm.getIp() + ")");
System.out.println("✅ Updated existing PM: " + pm.getName() + " (IP: " + pm.getIp() + ") - CloudSystem: " + pm.getCloudSystem());
} else {
// Create new PM
pm = newPm;
pm.setDataCenter(dc);
dc.getPhysicalMachines().add(pm);
System.out.println("✅ Created new PM: " + pm.getName() + " (IP: " + pm.getIp() + ")");
System.out.println("✅ Created new PM: " + pm.getName() + " (IP: " + pm.getIp() + ") - CloudSystem: " + pm.getCloudSystem());
}
// Process VMs that are already assigned to this PM
@@ -547,15 +549,46 @@ public class MessageListener {
return false;
}
// Find the emission source by name/tag
List<EmissionSource> emissionSources = emissionSourceRepo.findByTag(emissionSourceName);
if (emissionSources.isEmpty()) {
// Find the emission source by name/tag from datacenter's configured emission sources
EmissionSource emissionSource = null;
// First, try to find the emission source from datacenter's configured sources
if (dataCenter.getDataCenterEmissionSources() != null && !dataCenter.getDataCenterEmissionSources().isEmpty()) {
for (DataCenterEmissionSource dces : dataCenter.getDataCenterEmissionSources()) {
if (dces.getEmissionSource() != null &&
emissionSourceName.equalsIgnoreCase(dces.getEmissionSource().getTag())) {
emissionSource = dces.getEmissionSource();
System.out.println("✅ Found emission source '" + emissionSourceName +
"' in datacenter's configured sources (ID: " + emissionSource.getId() + ")");
break;
}
}
}
// If not found in datacenter's sources, fall back to subsector-specific search
if (emissionSource == null && dataCenter.getSubSector() != null) {
emissionSource = emissionSourceRepo.findByTagAndSubSectorIgnoreCase(emissionSourceName, dataCenter.getSubSector());
if (emissionSource != null) {
System.out.println("⚠️ Using subsector fallback for emission source '" + emissionSourceName +
"' (ID: " + emissionSource.getId() + ") - Consider configuring it for datacenter");
}
}
// Last resort: global search
if (emissionSource == null) {
List<EmissionSource> emissionSources = emissionSourceRepo.findByTag(emissionSourceName);
if (!emissionSources.isEmpty()) {
emissionSource = emissionSources.get(0);
System.out.println("⚠️ Using global fallback for emission source '" + emissionSourceName +
"' (ID: " + emissionSource.getId() + ") - This may cause incorrect calculations!");
}
}
if (emissionSource == null) {
System.err.println("❌ Could not find emission source: " + emissionSourceName);
return false;
}
EmissionSource emissionSource = emissionSources.get(0);
// Calculate power consumption for this emission source (percentage of total VM power)
double sourceSpecificPower = vm.getPower() * (percentage / 100.0);

View File

@@ -22,8 +22,8 @@ app.survey.base-url=http://localhost.com
# spring.rabbitmq.username=testuser
# spring.rabbitmq.password=JGasF24561AZv2894De
spring.rabbitmq.host=rabbitmq
#spring.rabbitmq.host=localhost
#spring.rabbitmq.host=rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

View File

@@ -11,6 +11,7 @@ input DataCenterCreateInput {
consuptionAmount: Float
areaId: ID
cityId: ID
number: Int
ayposURL: String
address: String
@@ -31,6 +32,7 @@ input DataCenterUpdateInput {
consuptionAmount: Float
areaId: ID
cityId: ID
number: Int
ayposURL: String
address: String

View File

@@ -15,6 +15,7 @@ type DataCenter {
physicalMachines: [PhysicalMachine]
area: Area
city: City
number: Int
ayposURL: String

View File

@@ -2,5 +2,5 @@ extend type Query{
mainDataTable(id: ID!): MainDataTable!
mainDataTables(criteria: MainDataTableCriteria, sortBy: [SortBy!]): [MainDataTable!]
paginateMainDataTables(pagination : Pagination!, criteria: MainDataTableCriteria, sortBy:[SortBy!] ) : MainDataTablePageable!
vmEmissionSummary(datacenterId: ID, projectId: ID): [VMEmissionSummary!]!
vmEmissionSummary(datacenterId: ID): [VMEmissionSummary!]!
}

View File

@@ -60,7 +60,7 @@ type Config {
totalEmission: Float!
createdDate: LocalDateTime!
physicalMachine: String
project: String
cloudSystem: String
dataCenter: String
# Individual emission values per record
co2: Float!