From b5901a049cdab2e22b2982ca226d87e948deb463 Mon Sep 17 00:00:00 2001 From: Ali Sadeghi <220201944@ostimteknik.edu.tr> Date: Tue, 19 Aug 2025 04:15:05 +0300 Subject: [PATCH] Merge: Add city to datacenter, cloudsystem to summary, fix listener --- .../graphql/dataCenter/domain/DataCenter.java | 12 ++++ .../mutation/input/DataCenterCreateInput.java | 5 ++ .../mutation/input/DataCenterUpdateInput.java | 4 ++ .../mutation/mapper/DataCenterMapper.java | 21 ++++-- .../mainDataTable/dto/VMEmissionSummary.java | 10 +-- .../query/MainDataTableQueryResolver.java | 4 +- .../service/MainDataTableService.java | 67 ++++++++----------- .../sgs/utils/rabbitMQ/MessageListener.java | 47 +++++++++++-- .../graphql/dataCenter/input.graphqls | 2 + .../graphql/dataCenter/type.graphqls | 1 + .../graphql/mainDataTable/query.graphqls | 2 +- .../graphql/mainDataTable/type.graphqls | 2 +- 12 files changed, 116 insertions(+), 61 deletions(-) diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenter.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenter.java index 6d49f23..30527cf 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenter.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenter.java @@ -3,6 +3,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 physicalMachines = new ArrayList<>(); private List dataCenterEmissionSources = new ArrayList<>(); @@ -131,6 +133,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() { diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterCreateInput.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterCreateInput.java index e9e856d..720f4e5 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterCreateInput.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterCreateInput.java @@ -18,6 +18,8 @@ public class DataCenterCreateInput extends BaseCreateInput { private UUID areaId; + private UUID cityId; + @NotNull(message = "Sektör ID gereklidir") private UUID sectorId; @@ -50,6 +52,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; } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterUpdateInput.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterUpdateInput.java index 803a5c0..0c732e5 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterUpdateInput.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterUpdateInput.java @@ -13,6 +13,7 @@ public class DataCenterUpdateInput extends BaseUpdateInput { private Double consuptionAmount; private UUID areaId; + private UUID cityId; @NotNull(message = "Sektör ID gereklidir") private UUID sectorId; private UUID subSectorId; @@ -44,6 +45,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; } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/mapper/DataCenterMapper.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/mapper/DataCenterMapper.java index f40b1fb..98a5f65 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/mapper/DataCenterMapper.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/mapper/DataCenterMapper.java @@ -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 vmEmissionSummary(UUID datacenterId, UUID projectId) { - return mainDataTableService.getVMEmissionSummaries(datacenterId, projectId); + public List vmEmissionSummary(UUID datacenterId) { + return mainDataTableService.getVMEmissionSummaries(datacenterId); } } diff --git a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java index 67809e7..0a04afb 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java +++ b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java @@ -34,59 +34,48 @@ public class MainDataTableService } public List getVMEmissionSummaries() { - return getVMEmissionSummaries(null, null); + return getVMEmissionSummaries(null); } public List getVMEmissionSummaries(UUID datacenterId) { - return getVMEmissionSummaries(datacenterId, null); - } - - public List getVMEmissionSummaries(UUID datacenterId, UUID projectId) { List whereConditions = new ArrayList<>(); if (datacenterId != null) { whereConditions.add("dc.id = decode(replace(:datacenterId, '-', ''), 'hex')"); } - - if (projectId != null) { - whereConditions.add("v.project = :projectId"); - } - - String whereClause = whereConditions.isEmpty() ? "" : "WHERE " + String.join(" AND ", whereConditions) + " "; - + + String whereClause = whereConditions.isEmpty() ? "" : + "WHERE " + String.join(" AND ", whereConditions) + " "; + String sql = """ - SELECT - CAST(v.id AS VARCHAR) as vm_id, - v.vm_name as vm_name, - v.power as vm_power, - v.state as vm_status, - mdt.total_emission, - mdt.created_date, - pm.name as physical_machine_name, - v.project as project_name, - dc.data_center_name as datacenter_name, - mdt.co2, - mdt.ch4, - mdt.n2o - 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 data_center dc ON pm.data_center_id = dc.id - """ + whereClause + """ - ORDER BY mdt.created_date DESC, v.vm_name - """; - + SELECT + CAST(v.id AS VARCHAR) as vm_id, + v.vm_name as vm_name, + v.power as vm_power, + v.state as vm_status, + mdt.total_emission, + mdt.created_date, + pm.name as physical_machine_name, + pm.cloud_system as cloud_system, + dc.data_center_name as datacenter_name, + mdt.co2, + mdt.ch4, + mdt.n2o + 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 data_center dc ON pm.data_center_id = dc.id + """ + whereClause + """ + ORDER BY mdt.created_date DESC, v.vm_name + """; + Query query = entityManager.createNativeQuery(sql); // Add parameters if provided if (datacenterId != null) { query.setParameter("datacenterId", datacenterId.toString()); } - - if (projectId != null) { - query.setParameter("projectId", projectId.toString()); - } - + @SuppressWarnings("unchecked") List results = query.getResultList(); @@ -110,7 +99,7 @@ public class MainDataTableService } summary.setPhysicalMachine((String) row[6]); - summary.setProject((String) row[7]); + summary.setCloudSystem((String) row[7]); summary.setDataCenter((String) row[8]); // Individual emission values diff --git a/sge-backend/src/main/java/com/sgs/utils/rabbitMQ/MessageListener.java b/sge-backend/src/main/java/com/sgs/utils/rabbitMQ/MessageListener.java index d26845c..5c768e7 100644 --- a/sge-backend/src/main/java/com/sgs/utils/rabbitMQ/MessageListener.java +++ b/sge-backend/src/main/java/com/sgs/utils/rabbitMQ/MessageListener.java @@ -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 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 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); diff --git a/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls index 4c5cb3f..ec46a32 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls @@ -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 diff --git a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls index c6b5929..7554f2d 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls @@ -15,6 +15,7 @@ type DataCenter { physicalMachines: [PhysicalMachine] area: Area + city: City number: Int ayposURL: String diff --git a/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls b/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls index 5a05347..fa85239 100644 --- a/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls +++ b/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls @@ -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!]! } \ No newline at end of file diff --git a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls index 0424e35..57e6360 100644 --- a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls +++ b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls @@ -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!