forked from BLC/sgeUpdated
multiple source calculation
This commit is contained in:
@@ -1,95 +1,7 @@
|
||||
{
|
||||
"158f073fbd554d4a9c32309ea7d1865e":{
|
||||
"main_optimization_space":{
|
||||
"vms":{
|
||||
"10.150.1.131":{
|
||||
"vm_name":"BLC-AYPOS-Development-20",
|
||||
"power":0,
|
||||
"state":"inactive",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"aypos.test.flavour.10",
|
||||
"tag":"None",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-20",
|
||||
2,
|
||||
1,
|
||||
8,
|
||||
"compute2"
|
||||
]
|
||||
},
|
||||
"10.150.1.186":{
|
||||
"vm_name":"BLC-AYPOS-Development-21",
|
||||
"power":0,
|
||||
"state":"inactive",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"aypos.test.flavour.10",
|
||||
"tag":"None",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-21",
|
||||
2,
|
||||
1,
|
||||
8,
|
||||
"compute2"
|
||||
]
|
||||
}
|
||||
},
|
||||
"pms":{
|
||||
"10.150.1.33":{
|
||||
"tag":"None",
|
||||
"name":"compute2",
|
||||
"power":177.83822950819666,
|
||||
"confg":[
|
||||
"compute2",
|
||||
3,
|
||||
94,
|
||||
59,
|
||||
114
|
||||
]
|
||||
},
|
||||
"10.150.1.34":{
|
||||
"tag":"None",
|
||||
"name":"compute3",
|
||||
"power":21.3385737704918,
|
||||
"confg":[
|
||||
"compute3",
|
||||
24,
|
||||
115,
|
||||
151,
|
||||
114
|
||||
]
|
||||
},
|
||||
"10.150.1.35":{
|
||||
"tag":"None",
|
||||
"name":"compute4",
|
||||
"power":152.66185245901653,
|
||||
"confg":[
|
||||
"compute4",
|
||||
-13,
|
||||
28,
|
||||
103,
|
||||
114
|
||||
]
|
||||
},
|
||||
"10.150.1.32":{
|
||||
"tag":"None",
|
||||
"name":"compute1",
|
||||
"power":36.34004918032787,
|
||||
"confg":[
|
||||
"compute1",
|
||||
10,
|
||||
97,
|
||||
211,
|
||||
114
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"sub_optimization_space":{
|
||||
|
||||
}
|
||||
},
|
||||
"id":111,
|
||||
"data_center":"new lab blc",
|
||||
"projects":{
|
||||
"48966d34ff274def88db7f7b6d9f5cdc":{
|
||||
"main_optimization_space":{
|
||||
"vms":{
|
||||
@@ -100,7 +12,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"m1.medium",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"Bgreen",
|
||||
2,
|
||||
@@ -116,7 +35,14 @@
|
||||
"hosting_pm":"10.150.1.34",
|
||||
"host":"compute3",
|
||||
"flavor_name":"aypos.test.flavour.8",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-1",
|
||||
3,
|
||||
@@ -132,7 +58,14 @@
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"m1.small",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"nginx-proxyV2",
|
||||
1,
|
||||
@@ -143,18 +76,25 @@
|
||||
},
|
||||
"10.150.1.114":{
|
||||
"vm_name":"BLC-AYPOS-Development-5",
|
||||
"power":8.541673488756713,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"power":0,
|
||||
"state":"inactive",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"aypos.test.flavour.19",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-5",
|
||||
2,
|
||||
3,
|
||||
8,
|
||||
"compute4"
|
||||
"compute2"
|
||||
]
|
||||
},
|
||||
"10.150.1.123":{
|
||||
@@ -164,7 +104,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"ForJAVA",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"SGE",
|
||||
8,
|
||||
@@ -180,7 +127,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"m1.public",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"aybuke",
|
||||
8,
|
||||
@@ -196,7 +150,14 @@
|
||||
"hosting_pm":"10.150.1.34",
|
||||
"host":"compute3",
|
||||
"flavor_name":"aypos.test.flavour.15",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-2",
|
||||
2,
|
||||
@@ -207,28 +168,42 @@
|
||||
},
|
||||
"10.150.1.141":{
|
||||
"vm_name":"BLC-AYPOS-Development-0",
|
||||
"power":10.146380530416682,
|
||||
"power":12.178434411667777,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"aypos.test.flavour.11",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-0",
|
||||
3,
|
||||
3,
|
||||
8,
|
||||
"compute2"
|
||||
"compute4"
|
||||
]
|
||||
},
|
||||
"10.150.1.145":{
|
||||
"vm_name":"BLC-AYPOS-Development-9",
|
||||
"power":12.464360819208926,
|
||||
"power":14.950904196341009,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"aypos.test.flavour.0",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-9",
|
||||
2,
|
||||
@@ -244,7 +219,14 @@
|
||||
"hosting_pm":"10.150.1.32",
|
||||
"host":"compute1",
|
||||
"flavor_name":"m1.xlarge",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"blc-cloud",
|
||||
8,
|
||||
@@ -260,7 +242,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"m1.vrealize",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"Aypos-Ulak",
|
||||
8,
|
||||
@@ -276,7 +265,14 @@
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"ayposYedek",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"prometheus_serverV3",
|
||||
2,
|
||||
@@ -292,7 +288,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"m1.devstack",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"blc-meet",
|
||||
4,
|
||||
@@ -308,7 +311,14 @@
|
||||
"hosting_pm":"10.150.1.32",
|
||||
"host":"compute1",
|
||||
"flavor_name":"m1.large",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"blc-office",
|
||||
4,
|
||||
@@ -324,7 +334,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"mail-server",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"mail-server",
|
||||
4,
|
||||
@@ -335,49 +352,65 @@
|
||||
},
|
||||
"10.150.1.175":{
|
||||
"vm_name":"BLC-AYPOS-Development-7",
|
||||
"power":16.084780100161176,
|
||||
"emissionsource":{
|
||||
"dizel":30,
|
||||
"coal":40,
|
||||
"solar energy":30
|
||||
},
|
||||
"power":19.256314103409117,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"aypos.test.flavour.19",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-7",
|
||||
2,
|
||||
3,
|
||||
8,
|
||||
"compute2"
|
||||
"compute4"
|
||||
]
|
||||
},
|
||||
"10.150.1.180":{
|
||||
"vm_name":"BLC-AYPOS-Development-8",
|
||||
"power":22.454381667855632,
|
||||
"power":26.738567147437937,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"aypos.test.flavour.6",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-8",
|
||||
1,
|
||||
2,
|
||||
8,
|
||||
"compute2"
|
||||
"compute4"
|
||||
]
|
||||
},
|
||||
"10.150.1.190":{
|
||||
"vm_name":"BLC-AYPOS-Development-6",
|
||||
"power":36.17691364518403,
|
||||
"power":42.36942549990342,
|
||||
"state":"active",
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"aypos.test.flavour.16",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-6",
|
||||
2,
|
||||
@@ -393,7 +426,14 @@
|
||||
"hosting_pm":"10.150.1.34",
|
||||
"host":"compute3",
|
||||
"flavor_name":"aypos.test.flavour.4",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"BLC-AYPOS-Development-4",
|
||||
2,
|
||||
@@ -409,7 +449,14 @@
|
||||
"hosting_pm":"10.150.1.33",
|
||||
"host":"compute2",
|
||||
"flavor_name":"m1.large",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"gitea-server",
|
||||
4,
|
||||
@@ -425,7 +472,14 @@
|
||||
"hosting_pm":"10.150.1.35",
|
||||
"host":"compute4",
|
||||
"flavor_name":"m1.vrealize",
|
||||
"tag":"None",
|
||||
"emissionsource":{
|
||||
"Dizel":10,
|
||||
"Ham petrol":5,
|
||||
"Orimulsion":15,
|
||||
"Motor benzini":30,
|
||||
"Jet benzini":40
|
||||
},
|
||||
"tag":"main_optimization_space",
|
||||
"confg":[
|
||||
"ollama",
|
||||
8,
|
||||
@@ -437,21 +491,21 @@
|
||||
},
|
||||
"pms":{
|
||||
"10.150.1.33":{
|
||||
"tag":"None",
|
||||
"tag":"main_optimization_space",
|
||||
"name":"compute2",
|
||||
"power":177.83822950819666,
|
||||
"power":159.86075409836062,
|
||||
"confg":[
|
||||
"compute2",
|
||||
3,
|
||||
94,
|
||||
59,
|
||||
11,
|
||||
101,
|
||||
91,
|
||||
114
|
||||
]
|
||||
},
|
||||
"10.150.1.34":{
|
||||
"tag":"None",
|
||||
"tag":"main_optimization_space",
|
||||
"name":"compute3",
|
||||
"power":21.3385737704918,
|
||||
"power":21.31772131147542,
|
||||
"confg":[
|
||||
"compute3",
|
||||
24,
|
||||
@@ -461,21 +515,21 @@
|
||||
]
|
||||
},
|
||||
"10.150.1.35":{
|
||||
"tag":"None",
|
||||
"tag":"main_optimization_space",
|
||||
"name":"compute4",
|
||||
"power":152.66185245901653,
|
||||
"power":189.92359016393448,
|
||||
"confg":[
|
||||
"compute4",
|
||||
-13,
|
||||
28,
|
||||
103,
|
||||
-17,
|
||||
23,
|
||||
87,
|
||||
114
|
||||
]
|
||||
},
|
||||
"10.150.1.32":{
|
||||
"tag":"None",
|
||||
"tag":"main_optimization_space",
|
||||
"name":"compute1",
|
||||
"power":36.34004918032787,
|
||||
"power":36.45219672131149,
|
||||
"confg":[
|
||||
"compute1",
|
||||
10,
|
||||
@@ -490,4 +544,5 @@
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,8 +2,13 @@ package com.sgs.graphql.dataCenter.domain;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonBackReference;
|
||||
import com.fasterxml.jackson.annotation.JsonManagedReference;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.sgs.lib.dao.domain.BaseDomain;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@Entity
|
||||
@@ -18,9 +23,11 @@ public class VM extends BaseDomain {
|
||||
private String host;
|
||||
private String flavorName;
|
||||
private String tag;
|
||||
private String emissionSourceData; // JSON string to store emission source map
|
||||
private Config config;
|
||||
private PhysicalMachine physicalMachine;
|
||||
|
||||
|
||||
@Column(name = "state")
|
||||
public String getState() {
|
||||
return state;
|
||||
@@ -102,6 +109,15 @@ public class VM extends BaseDomain {
|
||||
this.ip = ip;
|
||||
}
|
||||
|
||||
@Column(name = "emission_source_data", columnDefinition = "text")
|
||||
public String getEmissionSourceData() {
|
||||
return emissionSourceData;
|
||||
}
|
||||
|
||||
public void setEmissionSourceData(String emissionSourceData) {
|
||||
this.emissionSourceData = emissionSourceData;
|
||||
}
|
||||
|
||||
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "vm")
|
||||
@JsonManagedReference
|
||||
public Config getConfig() {
|
||||
@@ -123,4 +139,33 @@ public class VM extends BaseDomain {
|
||||
this.physicalMachine = physicalMachine;
|
||||
}
|
||||
|
||||
// Helper methods for emission source map
|
||||
@Transient
|
||||
public Map<String, Integer> getEmissionSource() {
|
||||
if (emissionSourceData == null || emissionSourceData.trim().isEmpty()) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
try {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
return mapper.readValue(emissionSourceData, new TypeReference<Map<String, Integer>>() {});
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error parsing emission source data: " + e.getMessage());
|
||||
return new HashMap<>();
|
||||
}
|
||||
}
|
||||
|
||||
public void setEmissionSource(Map<String, Integer> emissionSource) {
|
||||
if (emissionSource == null) {
|
||||
this.emissionSourceData = null;
|
||||
return;
|
||||
}
|
||||
try {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
this.emissionSourceData = mapper.writeValueAsString(emissionSource);
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error serializing emission source data: " + e.getMessage());
|
||||
this.emissionSourceData = null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package com.sgs.graphql.dataCenter.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class VMDto {
|
||||
@JsonProperty("vm_name")
|
||||
@@ -28,6 +29,9 @@ public class VMDto {
|
||||
@JsonProperty("confg") // Note: keeping the typo from JSON
|
||||
private List<Object> confg;
|
||||
|
||||
@JsonProperty("emissionsource")
|
||||
private Map<String, Integer> emissionSource;
|
||||
|
||||
private String ip; // IP address from the message key
|
||||
private boolean calcOn = false; // Derived from state: active = true, inactive = false
|
||||
|
||||
@@ -113,6 +117,14 @@ public class VMDto {
|
||||
this.calcOn = calcOn;
|
||||
}
|
||||
|
||||
public Map<String, Integer> getEmissionSource() {
|
||||
return emissionSource;
|
||||
}
|
||||
|
||||
public void setEmissionSource(Map<String, Integer> emissionSource) {
|
||||
this.emissionSource = emissionSource;
|
||||
}
|
||||
|
||||
// Helper method to get config as ConfigDto
|
||||
public ConfigDto getConfig() {
|
||||
if (confg != null && confg.size() >= 5) {
|
||||
|
||||
@@ -92,7 +92,14 @@ public class MessageListener {
|
||||
|
||||
DataCenter entity = toDataCenterEntity(dto);
|
||||
DataCenter dataCenter = createDataCenter(entity);
|
||||
processEmissionCalculations(dataCenter);
|
||||
|
||||
// Save message processing success log
|
||||
systemLogger.createSystemLog(LogType.INFO,
|
||||
"VM data processed successfully for DataCenter ID: " + dataCenter.getExternalId());
|
||||
|
||||
// Process emission calculations in a separate transaction to avoid rollback issues
|
||||
// This will be done asynchronously after the VM data is committed
|
||||
processEmissionCalculationsAsync(dataCenter);
|
||||
|
||||
// System.out.println(entity.toString());
|
||||
System.out.println("✅ Raw JSON message:\n" + message);
|
||||
@@ -117,7 +124,11 @@ public class MessageListener {
|
||||
|
||||
//System.out.println("✅ Saved DataCenter:\n" + objectMapper.writeValueAsString(dataCenter));
|
||||
} catch (Exception e) {
|
||||
System.err.println("Mesaj işlenirken hata oluştu: " + e.getMessage());
|
||||
System.err.println("❌ Mesaj işlenirken hata oluştu: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
systemLogger.createSystemLog(LogType.ERROR,
|
||||
"Error processing VM message: " + e.getMessage());
|
||||
// Don't rethrow the exception to prevent transaction rollback
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,8 +164,14 @@ public class MessageListener {
|
||||
// Handle config from confg array
|
||||
entity.setConfig(toConfigEntity(dto.getConfig()));
|
||||
|
||||
// Handle emission source map
|
||||
entity.setEmissionSource(dto.getEmissionSource());
|
||||
|
||||
// Debug logging
|
||||
System.out.println("🔍 VM Entity Created: " + dto.getVmName() + " - state = " + dto.getState() + " - calcOn = " + dto.isCalcOn());
|
||||
if (dto.getEmissionSource() != null && !dto.getEmissionSource().isEmpty()) {
|
||||
System.out.println(" Emission Sources: " + dto.getEmissionSource());
|
||||
}
|
||||
|
||||
return entity;
|
||||
}
|
||||
@@ -401,6 +418,7 @@ public class MessageListener {
|
||||
vm.setHost(newVm.getHost());
|
||||
vm.setFlavorName(newVm.getFlavorName());
|
||||
vm.setTag(newVm.getTag());
|
||||
vm.setEmissionSource(newVm.getEmissionSource());
|
||||
|
||||
System.out.println("✅ Updated existing VM: " + vm.getVmName() + " (IP: " + vm.getIp() + ") - calcOn = " + vm.getCalcOn());
|
||||
} else {
|
||||
@@ -450,6 +468,32 @@ public class MessageListener {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process emission calculations asynchronously to avoid transaction conflicts
|
||||
*/
|
||||
public void processEmissionCalculationsAsync(DataCenter dataCenter) {
|
||||
// Run emission calculations in a separate thread to avoid transaction issues
|
||||
new Thread(() -> {
|
||||
try {
|
||||
// Wait a bit to ensure the transaction is committed and VMs have IDs
|
||||
Thread.sleep(2000);
|
||||
|
||||
// Refresh the DataCenter to get the latest state with VM IDs
|
||||
Optional<DataCenter> refreshedDcOpt = dataCenterRepo.findByExternalId(dataCenter.getExternalId());
|
||||
if (refreshedDcOpt.isPresent()) {
|
||||
DataCenter refreshedDc = refreshedDcOpt.get();
|
||||
System.out.println("🔄 Processing emission calculations asynchronously for DataCenter: " + refreshedDc.getDataCenter());
|
||||
processEmissionCalculations(refreshedDc);
|
||||
} else {
|
||||
System.err.println("❌ Could not find DataCenter for emission calculations: " + dataCenter.getExternalId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("❌ Error in async emission calculations: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
public void processEmissionCalculations(DataCenter dataCenter) {
|
||||
System.out.println("🔍 Starting VM-level emission calculations for DataCenter ID: " + dataCenter.getId() +
|
||||
" (Name: " + dataCenter.getDataCenter() + ")");
|
||||
@@ -476,7 +520,10 @@ public class MessageListener {
|
||||
" (Name: " + dataCenter.getDataCenter() + ")");
|
||||
int totalVMs = 0;
|
||||
int eligibleVMs = 0;
|
||||
int processedVMs = 0;
|
||||
int successfulCalculations = 0;
|
||||
int failedCalculations = 0;
|
||||
int totalEmissionSources = 0;
|
||||
|
||||
for (Project project : dataCenter.getProjects()) {
|
||||
for (PhysicalMachine pm : project.getPhysicalMachines()) {
|
||||
@@ -488,8 +535,37 @@ public class MessageListener {
|
||||
eligibleVMs++;
|
||||
if (vm.getPower() != null && vm.getPower() > 0) {
|
||||
System.out.println("✅ Processing VM " + vm.getVmName() + " (calcOn = true)");
|
||||
processedVMs++;
|
||||
|
||||
// Check if VM has emission sources
|
||||
Map<String, Integer> emissionSources = vm.getEmissionSource();
|
||||
if (emissionSources != null && !emissionSources.isEmpty()) {
|
||||
// Create separate emission record for each emission source
|
||||
System.out.println("🔍 VM has " + emissionSources.size() + " emission sources");
|
||||
totalEmissionSources += emissionSources.size();
|
||||
for (Map.Entry<String, Integer> sourceEntry : emissionSources.entrySet()) {
|
||||
String sourceName = sourceEntry.getKey();
|
||||
Integer percentage = sourceEntry.getValue();
|
||||
System.out.println(" - " + sourceName + ": " + percentage + "%");
|
||||
|
||||
boolean success = createVMEmissionRecordForSource(dataCenter, vm, project, pm, sourceName, percentage);
|
||||
if (success) {
|
||||
successfulCalculations++;
|
||||
} else {
|
||||
failedCalculations++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Fallback to default emission source if VM has no emission sources
|
||||
System.out.println("⚠️ VM has no emission sources, using default");
|
||||
totalEmissionSources++;
|
||||
boolean success = createVMEmissionRecord(dataCenter, vm, project, pm);
|
||||
if (success) successfulCalculations++;
|
||||
if (success) {
|
||||
successfulCalculations++;
|
||||
} else {
|
||||
failedCalculations++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
System.out.println("⚠️ Skipping VM " + vm.getVmName() + " (calcOn = true) - no power consumption data");
|
||||
}
|
||||
@@ -504,13 +580,21 @@ public class MessageListener {
|
||||
System.out.println("🎯 VM Emission Calculation Summary:");
|
||||
System.out.println(" Total VMs found: " + totalVMs);
|
||||
System.out.println(" VMs with calcOn = true: " + eligibleVMs);
|
||||
System.out.println(" VMs processed for emissions: " + processedVMs);
|
||||
System.out.println(" VMs skipped (calcOn = false or null): " + (totalVMs - eligibleVMs));
|
||||
System.out.println(" Total emission source calculations: " + totalEmissionSources);
|
||||
System.out.println(" Successful emission calculations: " + successfulCalculations);
|
||||
System.out.println(" Failed calculations: " + (eligibleVMs - successfulCalculations));
|
||||
System.out.println(" Failed emission calculations: " + failedCalculations);
|
||||
}
|
||||
|
||||
private boolean createVMEmissionRecord(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm) {
|
||||
try {
|
||||
// Check if VM has an ID (is persisted)
|
||||
if (vm.getId() == null) {
|
||||
System.err.println("❌ VM " + vm.getVmName() + " has no ID - cannot create emission record");
|
||||
return false;
|
||||
}
|
||||
|
||||
MainDataTableCreateInput input = createVMMainDataTableInput(dataCenter, vm, project, pm);
|
||||
System.out.println("🔍 Creating emission record for VM: " + vm.getVmName() + " (Power: " + vm.getPower() + "W)");
|
||||
|
||||
@@ -535,6 +619,52 @@ public class MessageListener {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean createVMEmissionRecordForSource(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm, String emissionSourceName, Integer percentage) {
|
||||
try {
|
||||
// Check if VM has an ID (is persisted)
|
||||
if (vm.getId() == null) {
|
||||
System.err.println("❌ VM " + vm.getVmName() + " has no ID - cannot create emission record for source " + emissionSourceName);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Find the emission source by name/tag
|
||||
List<EmissionSource> emissionSources = emissionSourceRepo.findByTag(emissionSourceName);
|
||||
if (emissionSources.isEmpty()) {
|
||||
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);
|
||||
|
||||
MainDataTableCreateInput input = createVMMainDataTableInputForSource(dataCenter, vm, project, pm, emissionSource, sourceSpecificPower, percentage);
|
||||
System.out.println("🔍 Creating emission record for VM: " + vm.getVmName() +
|
||||
" - Source: " + emissionSourceName + " (" + percentage + "%) - Power: " + sourceSpecificPower + "W");
|
||||
|
||||
MainDataTable result = callMainDataTableMutation(input);
|
||||
|
||||
if (result != null) {
|
||||
System.out.println("✅ VM Emission calculation completed for source " + emissionSourceName + ":");
|
||||
System.out.println(" - VM: " + vm.getVmName());
|
||||
System.out.println(" - Emission Source: " + emissionSourceName + " (" + percentage + "%)");
|
||||
System.out.println(" - Power: " + sourceSpecificPower + "W");
|
||||
System.out.println(" - CO2: " + result.getCo2());
|
||||
System.out.println(" - Total Emission: " + result.getTotalEmission());
|
||||
System.out.println(" - Record ID: " + result.getId());
|
||||
return true;
|
||||
} else {
|
||||
System.err.println("❌ Failed to create emission record for VM: " + vm.getVmName() + " - Source: " + emissionSourceName);
|
||||
return false;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
System.err.println("❌ Error calculating emissions for VM " + vm.getVmName() + " - Source: " + emissionSourceName + ": " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private MainDataTableCreateInput createVMMainDataTableInput(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm) {
|
||||
MainDataTableCreateInput input = new MainDataTableCreateInput();
|
||||
|
||||
@@ -615,6 +745,76 @@ public class MessageListener {
|
||||
return input;
|
||||
}
|
||||
|
||||
private MainDataTableCreateInput createVMMainDataTableInputForSource(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm, EmissionSource emissionSource, double sourceSpecificPower, Integer percentage) {
|
||||
MainDataTableCreateInput input = new MainDataTableCreateInput();
|
||||
|
||||
// Copy datacenter-level information (if available)
|
||||
input.setYear("2025");
|
||||
input.setMonth("07");
|
||||
|
||||
// Note: These fields are no longer received in the message
|
||||
// They need to be set via DataCenter CRUD operations first
|
||||
if (dataCenter.getArea() != null && !dataCenter.getArea().getCities().isEmpty()) {
|
||||
input.setCity(dataCenter.getArea().getCities().get(0).getId());
|
||||
}
|
||||
|
||||
if (dataCenter.getArea() != null && !dataCenter.getArea().getDistricts().isEmpty()) {
|
||||
input.setDistrict(dataCenter.getArea().getDistricts().get(0).getId());
|
||||
}
|
||||
|
||||
if (dataCenter.getSector() != null) {
|
||||
input.setSector(dataCenter.getSector().getId());
|
||||
} else {
|
||||
System.out.println("⚠️ Warning: DataCenter has no sector set - emission calculation may fail");
|
||||
}
|
||||
|
||||
if (dataCenter.getSubSector() != null) {
|
||||
input.setSubSector(dataCenter.getSubSector().getId());
|
||||
}
|
||||
|
||||
// Use the specific emission source for this calculation
|
||||
input.setEmissionSource(emissionSource.getId());
|
||||
|
||||
if (dataCenter.getActivitySubUnit() != null) {
|
||||
input.setActivitySubUnit(dataCenter.getActivitySubUnit().getId());
|
||||
}
|
||||
|
||||
if (dataCenter.getConsuptionUnit() != null) {
|
||||
input.setConsuptionUnit(dataCenter.getConsuptionUnit().getId());
|
||||
}
|
||||
|
||||
// Default to Kapsam-3 if no emission scope is set
|
||||
input.setScope(dataCenter.getEmissionScope() != null ?
|
||||
dataCenter.getEmissionScope().getTag().equals("Kapsam-3") : true);
|
||||
|
||||
try {
|
||||
List<Organization> organizations = organizationRepo.findAll();
|
||||
if (!organizations.isEmpty()) {
|
||||
input.setOrganization(organizations.get(0).getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("❌ Error finding organization: " + e.getMessage());
|
||||
}
|
||||
|
||||
// Set VM-specific fields
|
||||
input.setVmId(vm.getId());
|
||||
|
||||
// Use the source-specific power consumption (percentage of total VM power)
|
||||
input.setConsuptionAmount(String.valueOf(sourceSpecificPower));
|
||||
|
||||
System.out.println("🔍 VM Emission Input for Source:");
|
||||
System.out.println(" VM ID: " + vm.getId());
|
||||
System.out.println(" VM Name: " + vm.getVmName());
|
||||
System.out.println(" Emission Source: " + emissionSource.getTag());
|
||||
System.out.println(" Percentage: " + percentage + "%");
|
||||
System.out.println(" Source Power: " + sourceSpecificPower + "W");
|
||||
System.out.println(" Physical Machine: " + pm.getName());
|
||||
System.out.println(" Project: " + project.getName());
|
||||
System.out.println(" DataCenter Sector: " + (dataCenter.getSector() != null ? dataCenter.getSector().getTag() : "NOT SET"));
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
private void setupSecurityContext() {
|
||||
User systemUser = new User("system", "", Collections.singletonList(new SimpleGrantedAuthority("dataset_create")));
|
||||
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(systemUser, null, systemUser.getAuthorities());
|
||||
|
||||
@@ -17,14 +17,14 @@ security.jwt.token.secret-key=secret
|
||||
|
||||
app.survey.base-url=http://localhost.com
|
||||
|
||||
spring.rabbitmq.host=188.132.198.145
|
||||
spring.rabbitmq.port=5672
|
||||
spring.rabbitmq.username=testuser
|
||||
spring.rabbitmq.password=JGasF24561AZv2894De
|
||||
# spring.rabbitmq.host=localhost
|
||||
# spring.rabbitmq.host=188.132.198.145
|
||||
# spring.rabbitmq.port=5672
|
||||
# spring.rabbitmq.username=guest
|
||||
# spring.rabbitmq.password=guest
|
||||
# spring.rabbitmq.username=testuser
|
||||
# spring.rabbitmq.password=JGasF24561AZv2894De
|
||||
spring.rabbitmq.host=localhost
|
||||
spring.rabbitmq.port=5672
|
||||
spring.rabbitmq.username=guest
|
||||
spring.rabbitmq.password=guest
|
||||
spring.rabbitmq.virtual-host=/
|
||||
spring.rabbitmq.connection-timeout=20000
|
||||
spring.rabbitmq.template.retry.enabled=true
|
||||
|
||||
@@ -47,9 +47,12 @@ type Vm {
|
||||
host: String
|
||||
flavorName: String
|
||||
tag: String
|
||||
emissionSource: EmissionSourceMap
|
||||
config: Config
|
||||
}
|
||||
|
||||
scalar EmissionSourceMap
|
||||
|
||||
type Config {
|
||||
id: ID
|
||||
cpu: Int
|
||||
|
||||
@@ -26,6 +26,7 @@ type MainDataTable {
|
||||
proteinAmount:Float
|
||||
burnOrOpenBurn:Boolean
|
||||
scopeCheck:Boolean
|
||||
vm: Vm
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user