diff --git a/sge-backend/message.json b/sge-backend/message.json index f109f80..9869d0a 100644 --- a/sge-backend/message.json +++ b/sge-backend/message.json @@ -1,547 +1,548 @@ { "id":111, "data_center":"new lab blc", - "projects":{ - "48966d34ff274def88db7f7b6d9f5cdc":{ - "main_optimization_space":{ - "vms":{ - "10.150.1.101":{ - "vm_name":"Bgreen", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"m1.medium", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "Bgreen", - 2, - 4, - 40, - "compute4" - ] + "physical_machines":{ + "10.150.1.33":{ + "tag":"main_optimization_space", + "name":"compute2", + "power":158.23672131147552, + "cloud_system":"open-stack", + "confg":[ + "compute2", + 11, + 101, + 91, + 114 + ], + "vms":{ + "10.150.1.112":{ + "vm_name":"nginx-proxyV2", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"m1.small", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 }, - "10.150.1.107":{ - "vm_name":"BLC-AYPOS-Development-1", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.34", - "host":"compute3", - "flavor_name":"aypos.test.flavour.8", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "BLC-AYPOS-Development-1", - 3, - 3, - 8, - "compute3" - ] - }, - "10.150.1.112":{ - "vm_name":"nginx-proxyV2", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"m1.small", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "nginx-proxyV2", - 1, - 2, - 20, - "compute2" - ] - }, - "10.150.1.114":{ - "vm_name":"BLC-AYPOS-Development-5", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"aypos.test.flavour.19", - "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, - "compute2" - ] - }, - "10.150.1.123":{ - "vm_name":"SGE", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"ForJAVA", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "SGE", - 8, - 32, - 150, - "compute4" - ] - }, - "10.150.1.130":{ - "vm_name":"aybuke", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"m1.public", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "aybuke", - 8, - 8, - 50, - "compute4" - ] - }, - "10.150.1.133":{ - "vm_name":"BLC-AYPOS-Development-2", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.34", - "host":"compute3", - "flavor_name":"aypos.test.flavour.15", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "BLC-AYPOS-Development-2", - 2, - 4, - 8, - "compute3" - ] - }, - "10.150.1.141":{ - "vm_name":"BLC-AYPOS-Development-0", - "power":12.178434411667777, - "state":"active", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"aypos.test.flavour.11", - "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, - "compute4" - ] - }, - "10.150.1.145":{ - "vm_name":"BLC-AYPOS-Development-9", - "power":14.950904196341009, - "state":"active", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"aypos.test.flavour.0", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "BLC-AYPOS-Development-9", - 2, - 1, - 8, - "compute2" - ] - }, - "10.150.1.150":{ - "vm_name":"blc-cloud", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.32", - "host":"compute1", - "flavor_name":"m1.xlarge", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "blc-cloud", - 8, - 16, - 160, - "compute1" - ] - }, - "10.150.1.155":{ - "vm_name":"Aypos-Ulak", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"m1.vrealize", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "Aypos-Ulak", - 8, - 16, - 50, - "compute4" - ] - }, - "10.150.1.167":{ - "vm_name":"prometheus_serverV3", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"ayposYedek", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "prometheus_serverV3", - 2, - 6, - 60, - "compute2" - ] - }, - "10.150.1.171":{ - "vm_name":"blc-meet", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"m1.devstack", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "blc-meet", - 4, - 7, - 60, - "compute4" - ] - }, - "10.150.1.172":{ - "vm_name":"blc-office", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.32", - "host":"compute1", - "flavor_name":"m1.large", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "blc-office", - 4, - 8, - 80, - "compute1" - ] - }, - "10.150.1.174":{ - "vm_name":"mail-server", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"mail-server", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "mail-server", - 4, - 8, - 100, - "compute4" - ] - }, - "10.150.1.175":{ - "vm_name":"BLC-AYPOS-Development-7", - "power":19.256314103409117, - "state":"active", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"aypos.test.flavour.19", - "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, - "compute4" - ] - }, - "10.150.1.180":{ - "vm_name":"BLC-AYPOS-Development-8", - "power":26.738567147437937, - "state":"active", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"aypos.test.flavour.6", - "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, - "compute4" - ] - }, - "10.150.1.190":{ - "vm_name":"BLC-AYPOS-Development-6", - "power":42.36942549990342, - "state":"active", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"aypos.test.flavour.16", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "BLC-AYPOS-Development-6", - 2, - 4, - 8, - "compute2" - ] - }, - "10.150.1.193":{ - "vm_name":"BLC-AYPOS-Development-4", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.34", - "host":"compute3", - "flavor_name":"aypos.test.flavour.4", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "BLC-AYPOS-Development-4", - 2, - 1, - 8, - "compute3" - ] - }, - "10.150.1.199":{ - "vm_name":"gitea-server", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.33", - "host":"compute2", - "flavor_name":"m1.large", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "gitea-server", - 4, - 8, - 80, - "compute2" - ] - }, - "10.150.1.200":{ - "vm_name":"ollama", - "power":0, - "state":"inactive", - "hosting_pm":"10.150.1.35", - "host":"compute4", - "flavor_name":"m1.vrealize", - "emissionsource":{ - "Dizel":10, - "Ham petrol":5, - "Orimulsion":15, - "Motor benzini":30, - "Jet benzini":40 - }, - "tag":"main_optimization_space", - "confg":[ - "ollama", - 8, - 16, - 50, - "compute4" - ] - } + "tag":"main_optimization_space", + "confg":[ + "nginx-proxyV2", + 1, + 2, + 20, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" }, - "pms":{ - "10.150.1.33":{ - "tag":"main_optimization_space", - "name":"compute2", - "power":159.86075409836062, - "confg":[ - "compute2", - 11, - 101, - 91, - 114 - ] + "10.150.1.114":{ + "vm_name":"BLC-AYPOS-Development-5", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"aypos.test.flavour.19", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 }, - "10.150.1.34":{ - "tag":"main_optimization_space", - "name":"compute3", - "power":21.31772131147542, - "confg":[ - "compute3", - 24, - 115, - 151, - 114 - ] + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-5", + 2, + 3, + 8, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.145":{ + "vm_name":"BLC-AYPOS-Development-9", + "power":8.857817947598239, + "state":"active", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"aypos.test.flavour.0", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 }, - "10.150.1.35":{ - "tag":"main_optimization_space", - "name":"compute4", - "power":189.92359016393448, - "confg":[ - "compute4", - -17, - 23, - 87, - 114 - ] + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-9", + 2, + 1, + 8, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.167":{ + "vm_name":"prometheus_serverV3", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"ayposYedek", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 }, - "10.150.1.32":{ - "tag":"main_optimization_space", - "name":"compute1", - "power":36.45219672131149, - "confg":[ - "compute1", - 10, - 97, - 211, - 114 - ] - } + "tag":"main_optimization_space", + "confg":[ + "prometheus_serverV3", + 2, + 6, + 60, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.190":{ + "vm_name":"BLC-AYPOS-Development-6", + "power":7.483440624373921, + "state":"active", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"aypos.test.flavour.16", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-6", + 2, + 4, + 8, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.199":{ + "vm_name":"gitea-server", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.33", + "host":"compute2", + "flavor_name":"m1.large", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "gitea-server", + 4, + 8, + 80, + "compute2" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + } + } + }, + "10.150.1.34":{ + "tag":"main_optimization_space", + "name":"compute3", + "power":22.16875409836066, + "cloud_system":"open-stack", + "confg":[ + "compute3", + 24, + 115, + 151, + 114 + ], + "vms":{ + "10.150.1.107":{ + "vm_name":"BLC-AYPOS-Development-1", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.34", + "host":"compute3", + "flavor_name":"aypos.test.flavour.8", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-1", + 3, + 3, + 8, + "compute3" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.133":{ + "vm_name":"BLC-AYPOS-Development-2", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.34", + "host":"compute3", + "flavor_name":"aypos.test.flavour.15", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-2", + 2, + 4, + 8, + "compute3" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.193":{ + "vm_name":"BLC-AYPOS-Development-4", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.34", + "host":"compute3", + "flavor_name":"aypos.test.flavour.4", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-4", + 2, + 1, + 8, + "compute3" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + } + } + }, + "10.150.1.35":{ + "tag":"main_optimization_space", + "name":"compute4", + "power":161.65611475409833, + "cloud_system":"open-stack", + "confg":[ + "compute4", + -19, + 19, + 87, + 114 + ], + "vms":{ + "10.150.1.101":{ + "vm_name":"Bgreen", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"m1.large", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "Bgreen", + 4, + 8, + 80, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.123":{ + "vm_name":"SGE", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"ForJAVA", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "SGE", + 8, + 32, + 150, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.130":{ + "vm_name":"aybuke", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"m1.public", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "aybuke", + 8, + 8, + 50, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.141":{ + "vm_name":"BLC-AYPOS-Development-0", + "power":1.1574191009150598, + "state":"active", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"aypos.test.flavour.11", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-0", + 3, + 3, + 8, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.155":{ + "vm_name":"Aypos-Ulak", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"m1.vrealize", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "Aypos-Ulak", + 8, + 16, + 50, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.171":{ + "vm_name":"blc-meet", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"m1.devstack", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "blc-meet", + 4, + 7, + 60, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.174":{ + "vm_name":"mail-server", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"mail-server", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "mail-server", + 4, + 8, + 100, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.175":{ + "vm_name":"BLC-AYPOS-Development-7", + "power":0.765597705736144, + "state":"active", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"aypos.test.flavour.19", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-7", + 2, + 3, + 8, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.180":{ + "vm_name":"BLC-AYPOS-Development-8", + "power":0.3963838074873964, + "state":"active", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"aypos.test.flavour.6", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "BLC-AYPOS-Development-8", + 1, + 2, + 8, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.200":{ + "vm_name":"ollama", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.35", + "host":"compute4", + "flavor_name":"m1.vrealize", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "ollama", + 8, + 16, + 50, + "compute4" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + } + } + }, + "10.150.1.32":{ + "tag":"main_optimization_space", + "name":"compute1", + "power":36.502836065573774, + "cloud_system":"open-stack", + "confg":[ + "compute1", + 10, + 97, + 211, + 114 + ], + "vms":{ + "10.150.1.150":{ + "vm_name":"blc-cloud", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.32", + "host":"compute1", + "flavor_name":"m1.xlarge", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "blc-cloud", + 8, + 16, + 160, + "compute1" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" + }, + "10.150.1.172":{ + "vm_name":"blc-office", + "power":0, + "state":"inactive", + "hosting_pm":"10.150.1.32", + "host":"compute1", + "flavor_name":"m1.large", + "emissionsource":{ + "Dizel":15, + "Ham petrol":10, + "Motor benzini":35, + "Jet benzini":40 + }, + "tag":"main_optimization_space", + "confg":[ + "blc-office", + 4, + 8, + 80, + "compute1" + ], + "project":"48966d34ff274def88db7f7b6d9f5cdc" } - }, - "sub_optimization_space":{ - } } } 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 ea02b59..368662a 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 @@ -4,9 +4,7 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; import com.sgs.graphql.area.domain.Area; import com.sgs.graphql.sector.domain.Sector; import com.sgs.graphql.subSector.domain.SubSector; -import com.sgs.graphql.emissionSource.domain.EmissionSource; import com.sgs.graphql.emissionScope.domain.EmissionScope; -import com.sgs.graphql.consuptionUnit.domain.ConsuptionUnit; import com.sgs.graphql.activitySubUnit.domain.ActivitySubUnit; import com.sgs.lib.dao.domain.BaseDomain; @@ -14,6 +12,8 @@ import javax.persistence.*; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; @@ -30,13 +30,12 @@ public class DataCenter extends BaseDomain { private Integer number; private Area area; - private List projects = new ArrayList<>(); + private List physicalMachines = new ArrayList<>(); + private List dataCenterEmissionSources = new ArrayList<>(); private Sector sector; private SubSector subSector; - private EmissionSource emissionSource; private EmissionScope emissionScope; private Double consuptionAmount; - private ConsuptionUnit consuptionUnit; private ActivitySubUnit activitySubUnit; // New attributes @@ -63,12 +62,23 @@ public class DataCenter extends BaseDomain { @OneToMany(mappedBy = "dataCenter", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) @JsonManagedReference - public List getProjects() { - return projects; + public List getPhysicalMachines() { + return physicalMachines; } - public void setProjects(List projects) { - this.projects = projects; + public void setPhysicalMachines(List physicalMachines) { + this.physicalMachines = physicalMachines; + } + + @OneToMany(mappedBy = "dataCenter", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + @Fetch(FetchMode.SUBSELECT) + @JsonManagedReference + public List getDataCenterEmissionSources() { + return dataCenterEmissionSources; + } + + public void setDataCenterEmissionSources(List dataCenterEmissionSources) { + this.dataCenterEmissionSources = dataCenterEmissionSources; } public void setExternalId(Integer externalId) { @@ -114,16 +124,6 @@ public class DataCenter extends BaseDomain { this.consuptionAmount = consuptionAmount; } - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "consuption_unit_id") - public ConsuptionUnit getConsuptionUnit() { - return consuptionUnit; - } - - public void setConsuptionUnit(ConsuptionUnit consuptionUnit) { - this.consuptionUnit = consuptionUnit; - } - @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "area_id") public Area getArea() { @@ -144,16 +144,6 @@ public class DataCenter extends BaseDomain { this.subSector = subSector; } - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "emission_source_id") - public EmissionSource getEmissionSource() { - return emissionSource; - } - - public void setEmissionSource(EmissionSource emissionSource) { - this.emissionSource = emissionSource; - } - @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "activity_sub_unit_id") public ActivitySubUnit getActivitySubUnit() { diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenterEmissionSource.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenterEmissionSource.java new file mode 100644 index 0000000..a92a385 --- /dev/null +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/DataCenterEmissionSource.java @@ -0,0 +1,68 @@ +package com.sgs.graphql.dataCenter.domain; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.sgs.graphql.emissionSource.domain.EmissionSource; +import com.sgs.graphql.consuptionUnit.domain.ConsuptionUnit; +import com.sgs.lib.dao.domain.BaseDomain; + +import javax.persistence.*; + +@Entity +@Table(name = "data_center_emission_source") +public class DataCenterEmissionSource extends BaseDomain { + + private DataCenter dataCenter; + private EmissionSource emissionSource; + private ConsuptionUnit consuptionUnit; + private Boolean isDefault = false; // To mark which one is the default emission source + private Double percentage; // Percentage allocation for this emission source (optional) + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "data_center_id", nullable = false) + @JsonBackReference + public DataCenter getDataCenter() { + return dataCenter; + } + + public void setDataCenter(DataCenter dataCenter) { + this.dataCenter = dataCenter; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "emission_source_id", nullable = false) + public EmissionSource getEmissionSource() { + return emissionSource; + } + + public void setEmissionSource(EmissionSource emissionSource) { + this.emissionSource = emissionSource; + } + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "consuption_unit_id", nullable = false) + public ConsuptionUnit getConsuptionUnit() { + return consuptionUnit; + } + + public void setConsuptionUnit(ConsuptionUnit consuptionUnit) { + this.consuptionUnit = consuptionUnit; + } + + @Column(name = "is_default") + public Boolean getIsDefault() { + return isDefault; + } + + public void setIsDefault(Boolean isDefault) { + this.isDefault = isDefault; + } + + @Column(name = "percentage") + public Double getPercentage() { + return percentage; + } + + public void setPercentage(Double percentage) { + this.percentage = percentage; + } +} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/PhysicalMachine.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/PhysicalMachine.java index b3ece1a..3d53485 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/PhysicalMachine.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/PhysicalMachine.java @@ -14,9 +14,10 @@ public class PhysicalMachine extends BaseDomain { private String name; private String ip; private String tag; + private String cloudSystem; private Double power; private List vms = new ArrayList<>(); - private Project project; + private DataCenter dataCenter; @Column(name = "name") public String getName() { @@ -45,6 +46,15 @@ public class PhysicalMachine extends BaseDomain { this.tag = tag; } + @Column(name = "cloud_system") + public String getCloudSystem() { + return cloudSystem; + } + + public void setCloudSystem(String cloudSystem) { + this.cloudSystem = cloudSystem; + } + @Column(name = "power") public Double getPower() { return power; @@ -65,13 +75,13 @@ public class PhysicalMachine extends BaseDomain { } @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "project_id") + @JoinColumn(name = "data_center_id") @JsonBackReference - public Project getProject() { - return project; + public DataCenter getDataCenter() { + return dataCenter; } - public void setProject(Project project) { - this.project = project; + public void setDataCenter(DataCenter dataCenter) { + this.dataCenter = dataCenter; } } \ No newline at end of file diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/Project.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/Project.java deleted file mode 100644 index f4ca3e9..0000000 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/Project.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sgs.graphql.dataCenter.domain; - -import java.util.List; - -import javax.persistence.*; - -import com.fasterxml.jackson.annotation.JsonBackReference; -import com.fasterxml.jackson.annotation.JsonManagedReference; -import com.sgs.lib.dao.domain.BaseDomain; - -@Entity -@Table(name = "project") -public class Project extends BaseDomain{ - - private String name; - - private List physicalMachines; - - - @OneToMany(mappedBy = "project", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) - @JsonManagedReference - public List getPhysicalMachines() { - return physicalMachines; - } - - public void setPhysicalMachines(List physicalMachines) { - this.physicalMachines = physicalMachines; - } - - // This creates a foreign key in the `project` table - private DataCenter dataCenter; - - - @Column(name = "name") - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - @ManyToOne - @JoinColumn(name = "data_center_id") - @JsonBackReference - public DataCenter getDataCenter() { - return dataCenter; - } - public void setDataCenter(DataCenter dataCenter) { - this.dataCenter = dataCenter; - } -} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/VM.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/VM.java index 9305f63..ee29795 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/VM.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/domain/VM.java @@ -23,6 +23,7 @@ public class VM extends BaseDomain { private String host; private String flavorName; private String tag; + private String project; // UUID of the project this VM belongs to private String emissionSourceData; // JSON string to store emission source map private Config config; private PhysicalMachine physicalMachine; @@ -100,6 +101,15 @@ public class VM extends BaseDomain { this.tag = tag; } + @Column(name = "project") + public String getProject() { + return project; + } + + public void setProject(String project) { + this.project = project; + } + @Column(name = "ip") public String getIp() { return ip; diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterDto.java index 8893445..1973dbf 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterDto.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterDto.java @@ -17,7 +17,9 @@ public class DataCenterDto { private Integer externalId; private Integer number; private AreaDto area; - private Map projects; + + @JsonProperty("physical_machine") + private Map physicalMachine; // Emission calculation fields private SectorDto sector; @@ -68,12 +70,12 @@ public class DataCenterDto { this.area = area; } - public Map getProjects() { - return projects; + public Map getPhysicalMachine() { + return physicalMachine; } - public void setProjects(Map projects) { - this.projects = projects; + public void setPhysicalMachine(Map physicalMachine) { + this.physicalMachine = physicalMachine; } public SectorDto getSector() { diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterEmissionSourceDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterEmissionSourceDto.java new file mode 100644 index 0000000..d3cd4b6 --- /dev/null +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/DataCenterEmissionSourceDto.java @@ -0,0 +1,50 @@ +package com.sgs.graphql.dataCenter.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DataCenterEmissionSourceDto { + + @JsonProperty("emission_source_id") + private String emissionSourceId; + + @JsonProperty("consuption_unit_id") + private String consuptionUnitId; + + @JsonProperty("is_default") + private Boolean isDefault = false; + + @JsonProperty("percentage") + private Double percentage; + + public String getEmissionSourceId() { + return emissionSourceId; + } + + public void setEmissionSourceId(String emissionSourceId) { + this.emissionSourceId = emissionSourceId; + } + + public String getConsuptionUnitId() { + return consuptionUnitId; + } + + public void setConsuptionUnitId(String consuptionUnitId) { + this.consuptionUnitId = consuptionUnitId; + } + + public Boolean getIsDefault() { + return isDefault; + } + + public void setIsDefault(Boolean isDefault) { + this.isDefault = isDefault; + } + + public Double getPercentage() { + return percentage; + } + + public void setPercentage(Double percentage) { + this.percentage = percentage; + } +} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/MainOptimizationSpaceDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/MainOptimizationSpaceDto.java deleted file mode 100644 index 1086696..0000000 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/MainOptimizationSpaceDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sgs.graphql.dataCenter.dto; - -import java.util.Map; - -public class MainOptimizationSpaceDto { - private Map vms; - private Map pms; - - public Map getVms() { - return vms; - } - - public void setVms(Map vms) { - this.vms = vms; - } - - public Map getPms() { - return pms; - } - - public void setPms(Map pms) { - this.pms = pms; - } -} \ No newline at end of file diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/PhysicalMachineDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/PhysicalMachineDto.java index 1f730b3..f4bc349 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/PhysicalMachineDto.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/PhysicalMachineDto.java @@ -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 PhysicalMachineDto { @JsonProperty("name") @@ -10,11 +11,17 @@ public class PhysicalMachineDto { @JsonProperty("tag") private String tag; + @JsonProperty("cloud_system") + private String cloudSystem; + @JsonProperty("power") private double power; @JsonProperty("confg") // Note: keeping the typo from JSON private List confg; + + @JsonProperty("vms") + private Map vms; private String ip; // IP address from the message key @@ -34,6 +41,14 @@ public class PhysicalMachineDto { this.tag = tag; } + public String getCloudSystem() { + return cloudSystem; + } + + public void setCloudSystem(String cloudSystem) { + this.cloudSystem = cloudSystem; + } + public double getPower() { return power; } @@ -57,4 +72,12 @@ public class PhysicalMachineDto { public void setIp(String ip) { this.ip = ip; } + + public Map getVms() { + return vms; + } + + public void setVms(Map vms) { + this.vms = vms; + } } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/ProjectDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/ProjectDto.java deleted file mode 100644 index 1103893..0000000 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/ProjectDto.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sgs.graphql.dataCenter.dto; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ProjectDto { - @JsonProperty("main_optimization_space") - private MainOptimizationSpaceDto mainOptimizationSpace; - - @JsonProperty("sub_optimization_space") - private SubOptimizationSpaceDto subOptimizationSpace; - - // Legacy field - kept for backward compatibility with older message formats - @JsonProperty("physical_machines") - private List physicalMachines; - - // These fields are derived from the map key and entity relationships, not from the message - private String id; // This will be set from the map key - private String name; // This will be derived or set separately - - public MainOptimizationSpaceDto getMainOptimizationSpace() { - return mainOptimizationSpace; - } - - public void setMainOptimizationSpace(MainOptimizationSpaceDto mainOptimizationSpace) { - this.mainOptimizationSpace = mainOptimizationSpace; - } - - public SubOptimizationSpaceDto getSubOptimizationSpace() { - return subOptimizationSpace; - } - - public void setSubOptimizationSpace(SubOptimizationSpaceDto subOptimizationSpace) { - this.subOptimizationSpace = subOptimizationSpace; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public List getPhysicalMachines() { - return physicalMachines; - } - public void setPhysicalMachines(List physicalMachines) { - this.physicalMachines = physicalMachines; - } -} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/SubOptimizationSpaceDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/SubOptimizationSpaceDto.java deleted file mode 100644 index ddce932..0000000 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/SubOptimizationSpaceDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sgs.graphql.dataCenter.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -/** - * DTO for sub_optimization_space in the message format. - * Currently appears to be empty in the message structure. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class SubOptimizationSpaceDto { - // Currently empty based on the message format - // Can be extended if needed in the future - - // Add a placeholder field to make Jackson happy - private boolean isEmpty = true; - - public boolean isEmpty() { - return isEmpty; - } - - public void setEmpty(boolean empty) { - this.isEmpty = empty; - } -} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/VMDto.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/VMDto.java index 4a106b0..92f026d 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/VMDto.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/dto/VMDto.java @@ -26,6 +26,9 @@ public class VMDto { @JsonProperty("tag") private String tag; + @JsonProperty("project") + private String project; + @JsonProperty("confg") // Note: keeping the typo from JSON private List confg; @@ -101,6 +104,14 @@ public class VMDto { this.tag = tag; } + public String getProject() { + return project; + } + + public void setProject(String project) { + this.project = project; + } + public List getConfg() { return confg; } 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 057e22b..d6cc527 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 @@ -5,6 +5,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Min; import java.util.UUID; +import java.util.List; public class DataCenterCreateInput extends BaseCreateInput { @NotBlank(message = "Data center adı gereklidir") @@ -22,11 +23,12 @@ public class DataCenterCreateInput extends BaseCreateInput { private UUID sectorId; private UUID subSectorId; - private UUID emissionSourceId; private UUID emissionScopeId; - private UUID consuptionUnitId; private UUID activitySubUnitId; + // Multiple emission sources support - each with exactly one unit + private List dataCenterEmissionSources; + // New attributes private String ayposURL; private String address; @@ -55,18 +57,15 @@ public class DataCenterCreateInput extends BaseCreateInput { public UUID getSubSectorId() { return subSectorId; } public void setSubSectorId(UUID subSectorId) { this.subSectorId = subSectorId; } - public UUID getEmissionSourceId() { return emissionSourceId; } - public void setEmissionSourceId(UUID emissionSourceId) { this.emissionSourceId = emissionSourceId; } - public UUID getEmissionScopeId() { return emissionScopeId; } public void setEmissionScopeId(UUID emissionScopeId) { this.emissionScopeId = emissionScopeId; } - public UUID getConsuptionUnitId() { return consuptionUnitId; } - public void setConsuptionUnitId(UUID consuptionUnitId) { this.consuptionUnitId = consuptionUnitId; } - public UUID getActivitySubUnitId() { return activitySubUnitId; } public void setActivitySubUnitId(UUID activitySubUnitId) { this.activitySubUnitId = activitySubUnitId; } + public List getDataCenterEmissionSources() { return dataCenterEmissionSources; } + public void setDataCenterEmissionSources(List dataCenterEmissionSources) { this.dataCenterEmissionSources = dataCenterEmissionSources; } + // New attribute getters and setters public String getAyposURL() { return ayposURL; } public void setAyposURL(String ayposURL) { this.ayposURL = ayposURL; } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterEmissionSourceInput.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterEmissionSourceInput.java new file mode 100644 index 0000000..e5a9b11 --- /dev/null +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/mutation/input/DataCenterEmissionSourceInput.java @@ -0,0 +1,40 @@ +package com.sgs.graphql.dataCenter.mutation.input; + +public class DataCenterEmissionSourceInput { + private String emissionSourceId; + private String consuptionUnitId; + private Boolean isDefault = false; + private Double percentage; + + public String getEmissionSourceId() { + return emissionSourceId; + } + + public void setEmissionSourceId(String emissionSourceId) { + this.emissionSourceId = emissionSourceId; + } + + public String getConsuptionUnitId() { + return consuptionUnitId; + } + + public void setConsuptionUnitId(String consuptionUnitId) { + this.consuptionUnitId = consuptionUnitId; + } + + public Boolean getIsDefault() { + return isDefault; + } + + public void setIsDefault(Boolean isDefault) { + this.isDefault = isDefault; + } + + public Double getPercentage() { + return percentage; + } + + public void setPercentage(Double percentage) { + this.percentage = percentage; + } +} 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 7c44336..462cca0 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 @@ -1,6 +1,7 @@ package com.sgs.graphql.dataCenter.mutation.input; import com.sgs.lib.dao.mutation.input.BaseUpdateInput; +import java.util.List; import java.util.UUID; public class DataCenterUpdateInput extends BaseUpdateInput { @@ -12,11 +13,12 @@ public class DataCenterUpdateInput extends BaseUpdateInput { private UUID areaId; private UUID sectorId; private UUID subSectorId; - private UUID emissionSourceId; private UUID emissionScopeId; - private UUID consuptionUnitId; private UUID activitySubUnitId; + // Multiple emission sources with units + private List dataCenterEmissionSources; + // New attributes private String ayposURL; private String address; @@ -45,18 +47,19 @@ public class DataCenterUpdateInput extends BaseUpdateInput { public UUID getSubSectorId() { return subSectorId; } public void setSubSectorId(UUID subSectorId) { this.subSectorId = subSectorId; } - public UUID getEmissionSourceId() { return emissionSourceId; } - public void setEmissionSourceId(UUID emissionSourceId) { this.emissionSourceId = emissionSourceId; } - public UUID getEmissionScopeId() { return emissionScopeId; } public void setEmissionScopeId(UUID emissionScopeId) { this.emissionScopeId = emissionScopeId; } - public UUID getConsuptionUnitId() { return consuptionUnitId; } - public void setConsuptionUnitId(UUID consuptionUnitId) { this.consuptionUnitId = consuptionUnitId; } - public UUID getActivitySubUnitId() { return activitySubUnitId; } public void setActivitySubUnitId(UUID activitySubUnitId) { this.activitySubUnitId = activitySubUnitId; } + public List getDataCenterEmissionSources() { + return dataCenterEmissionSources; + } + public void setDataCenterEmissionSources(List dataCenterEmissionSources) { + this.dataCenterEmissionSources = dataCenterEmissionSources; + } + // New attribute getters and setters public String getAyposURL() { return ayposURL; } public void setAyposURL(String ayposURL) { this.ayposURL = ayposURL; } 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 eb6e446..1419cf2 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 @@ -1,8 +1,10 @@ package com.sgs.graphql.dataCenter.mutation.mapper; import com.sgs.graphql.dataCenter.domain.DataCenter; +import com.sgs.graphql.dataCenter.domain.DataCenterEmissionSource; import com.sgs.graphql.dataCenter.mutation.input.DataCenterCreateInput; import com.sgs.graphql.dataCenter.mutation.input.DataCenterUpdateInput; +import com.sgs.graphql.dataCenter.mutation.input.DataCenterEmissionSourceInput; import com.sgs.graphql.area.service.AreaService; import com.sgs.graphql.sector.service.SectorService; import com.sgs.graphql.subSector.service.SubSectorService; @@ -13,6 +15,9 @@ import com.sgs.graphql.activitySubUnit.service.ActivitySubUnitService; import com.sgs.lib.dao.mutation.mapper.BaseCreateUpdateMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.ArrayList; +import java.util.UUID; @Component public class DataCenterMapper extends BaseCreateUpdateMapper { @@ -62,18 +67,10 @@ public class DataCenterMapper extends BaseCreateUpdateMapper dataCenterEmissionSources = new ArrayList<>(); + + for (DataCenterEmissionSourceInput emissionSourceInput : input.getDataCenterEmissionSources()) { + DataCenterEmissionSource dcEmissionSource = new DataCenterEmissionSource(); + dcEmissionSource.setDataCenter(entity); + + // Set EmissionSource + if (emissionSourceInput.getEmissionSourceId() != null) { + dcEmissionSource.setEmissionSource(emissionSourceService.findById(UUID.fromString(emissionSourceInput.getEmissionSourceId())).orElse(null)); + } + + // Set ConsuptionUnit + if (emissionSourceInput.getConsuptionUnitId() != null) { + dcEmissionSource.setConsuptionUnit(consuptionUnitService.findById(UUID.fromString(emissionSourceInput.getConsuptionUnitId())).orElse(null)); + } + + // Set optional fields + dcEmissionSource.setIsDefault(emissionSourceInput.getIsDefault() != null ? emissionSourceInput.getIsDefault() : false); + dcEmissionSource.setPercentage(emissionSourceInput.getPercentage()); + + dataCenterEmissionSources.add(dcEmissionSource); + } + + entity.setDataCenterEmissionSources(dataCenterEmissionSources); + } + return entity; } @@ -119,22 +144,40 @@ public class DataCenterMapper extends BaseCreateUpdateMapper dataCenterEmissionSources = new ArrayList<>(); + for (DataCenterEmissionSourceInput emissionSourceInput : input.getDataCenterEmissionSources()) { + DataCenterEmissionSource dcEmissionSource = new DataCenterEmissionSource(); + dcEmissionSource.setDataCenter(entity); + + if (emissionSourceInput.getEmissionSourceId() != null) { + dcEmissionSource.setEmissionSource(emissionSourceService.findById(UUID.fromString(emissionSourceInput.getEmissionSourceId())).orElse(null)); + } + + if (emissionSourceInput.getConsuptionUnitId() != null) { + dcEmissionSource.setConsuptionUnit(consuptionUnitService.findById(UUID.fromString(emissionSourceInput.getConsuptionUnitId())).orElse(null)); + } + + dcEmissionSource.setIsDefault(emissionSourceInput.getIsDefault() != null ? emissionSourceInput.getIsDefault() : false); + dcEmissionSource.setPercentage(emissionSourceInput.getPercentage()); + + dataCenterEmissionSources.add(dcEmissionSource); + } + entity.setDataCenterEmissionSources(dataCenterEmissionSources); + } + // New attributes (partial update - only if provided) if (input.getAyposURL() != null) { entity.setAyposURL(input.getAyposURL()); diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java index b3396c1..26c7862 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java @@ -70,8 +70,8 @@ public class DataCenterQueryResolver implements GraphQLQueryResolver { return dataCenterRepo.findByNumber(id).stream().findFirst(); } - public List physicalMachines(UUID datacenterId, UUID projectId) { - return physicalMachineRepo.findByDatacenterIdAndProjectId(datacenterId, projectId); + public List physicalMachines(UUID datacenterId) { + return physicalMachineRepo.findByDatacenterId(datacenterId); } } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/DataCenterEmissionSourceRepo.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/DataCenterEmissionSourceRepo.java new file mode 100644 index 0000000..cf04b4f --- /dev/null +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/DataCenterEmissionSourceRepo.java @@ -0,0 +1,24 @@ +package com.sgs.graphql.dataCenter.repo; + +import com.sgs.graphql.dataCenter.domain.DataCenter; +import com.sgs.graphql.dataCenter.domain.DataCenterEmissionSource; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface DataCenterEmissionSourceRepo extends JpaRepository { + + List findByDataCenter(DataCenter dataCenter); + + Optional findByDataCenterAndIsDefaultTrue(DataCenter dataCenter); + + @Query("SELECT dces FROM DataCenterEmissionSource dces WHERE dces.dataCenter.id = :dataCenterId") + List findByDataCenterId(@Param("dataCenterId") String dataCenterId); + + void deleteByDataCenter(DataCenter dataCenter); +} diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java index 5d7fa00..a08b7be 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java @@ -13,15 +13,10 @@ import java.util.UUID; public interface PhysicalMachineRepo extends BaseRepo { /** - * Find all physical machines by datacenter ID and project ID + * Find all physical machines by datacenter ID * @param datacenterId Datacenter ID - * @param projectId Project ID * @return List of physical machines */ - @Query("SELECT pm FROM PhysicalMachine pm " + - "JOIN pm.project p " + - "JOIN p.dataCenter dc " + - "WHERE dc.id = :datacenterId AND p.id = :projectId") - List findByDatacenterIdAndProjectId(@Param("datacenterId") UUID datacenterId, - @Param("projectId") UUID projectId); + @Query("SELECT pm FROM PhysicalMachine pm WHERE pm.dataCenter.id = :datacenterId") + List findByDatacenterId(@Param("datacenterId") UUID datacenterId); } 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 43af254..12302f3 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 @@ -74,19 +74,16 @@ public class MessageListener { System.out.println(" External ID: " + dto.getId()); System.out.println(" Number: " + dto.getNumber()); System.out.println(" Consumption Amount: " + dto.getConsuptionAmount()); - System.out.println(" Projects Count: " + (dto.getProjects() != null ? dto.getProjects().size() : 0)); + System.out.println(" Physical Machines Count: " + (dto.getPhysicalMachine() != null ? dto.getPhysicalMachine().size() : 0)); - // Log MainOptimizationSpace info for each project - if (dto.getProjects() != null) { - for (Map.Entry projectEntry : dto.getProjects().entrySet()) { - String projectId = projectEntry.getKey(); - ProjectDto project = projectEntry.getValue(); - if (project.getMainOptimizationSpace() != null) { - MainOptimizationSpaceDto mainOpt = project.getMainOptimizationSpace(); - System.out.println(" Project " + projectId + ":"); - System.out.println(" PMs: " + (mainOpt.getPms() != null ? mainOpt.getPms().size() : 0)); - System.out.println(" VMs: " + (mainOpt.getVms() != null ? mainOpt.getVms().size() : 0)); - } + // Log Physical Machine info + if (dto.getPhysicalMachine() != null) { + for (Map.Entry pmEntry : dto.getPhysicalMachine().entrySet()) { + String pmIp = pmEntry.getKey(); + PhysicalMachineDto pm = pmEntry.getValue(); + System.out.println(" Physical Machine " + pm.getName() + " (IP: " + pmIp + "):"); + System.out.println(" Power: " + pm.getPower()); + System.out.println(" VMs: " + (pm.getVms() != null ? pm.getVms().size() : 0)); } } @@ -103,18 +100,18 @@ public class MessageListener { // System.out.println(entity.toString()); System.out.println("✅ Raw JSON message:\n" + message); - System.out.println("✅ DTO parsed:\n" + objectMapper.writeValueAsString(dto)); + //System.out.println("✅ DTO parsed:\n" + objectMapper.writeValueAsString(dto)); //System.out.println("✅ Entity:\n" + objectMapper.writeValueAsString(entity)); System.out.println("🚨 DataCenter name: " + dataCenter.getDataCenter()); System.out.println("🚨 External ID: " + dataCenter.getExternalId()); - System.out.println("🚨 Projects count: " + (dataCenter.getProjects() != null ? dataCenter.getProjects().size() : 0)); - if (dataCenter.getProjects() != null && !dataCenter.getProjects().isEmpty()) { - Project firstProject = dataCenter.getProjects().get(0); - System.out.println("🚨 PMs in first project: " + firstProject.getPhysicalMachines().size()); + System.out.println("🚨 Physical Machines count: " + (dataCenter.getPhysicalMachines() != null ? dataCenter.getPhysicalMachines().size() : 0)); + if (dataCenter.getPhysicalMachines() != null && !dataCenter.getPhysicalMachines().isEmpty()) { + PhysicalMachine firstPM = dataCenter.getPhysicalMachines().get(0); + System.out.println("🚨 VMs in first PM: " + firstPM.getVms().size()); // Show VM assignment summary int totalVMs = 0; - for (PhysicalMachine pm : firstProject.getPhysicalMachines()) { + for (PhysicalMachine pm : dataCenter.getPhysicalMachines()) { int vmCount = pm.getVms() != null ? pm.getVms().size() : 0; totalVMs += vmCount; System.out.println(" PM " + pm.getName() + " (IP: " + pm.getIp() + "): " + vmCount + " VMs"); @@ -157,6 +154,7 @@ public class MessageListener { entity.setHost(dto.getHost()); entity.setFlavorName(dto.getFlavorName()); entity.setTag(dto.getTag()); + entity.setProject(dto.getProject()); // Set calcOn - you may want to derive this from state or other logic entity.setCalcOn(dto.isCalcOn()); @@ -168,7 +166,7 @@ public class MessageListener { entity.setEmissionSource(dto.getEmissionSource()); // Debug logging - System.out.println("🔍 VM Entity Created: " + dto.getVmName() + " - state = " + dto.getState() + " - calcOn = " + dto.isCalcOn()); + System.out.println("🔍 VM Entity Created: " + dto.getVmName() + " - state = " + dto.getState() + " - calcOn = " + dto.isCalcOn() + " - project = " + dto.getProject()); if (dto.getEmissionSource() != null && !dto.getEmissionSource().isEmpty()) { System.out.println(" Emission Sources: " + dto.getEmissionSource()); } @@ -184,6 +182,7 @@ public class MessageListener { entity.setName(dto.getName()); entity.setIp(dto.getIp()); entity.setTag(dto.getTag()); + entity.setCloudSystem(dto.getCloudSystem()); entity.setPower(dto.getPower()); // VMs are now processed separately from the new message format @@ -207,112 +206,42 @@ public class MessageListener { // ConsuptionUnit, and ActivitySubUnit are no longer received in the message // These will need to be set via the DataCenter CRUD operations - // Convert Projects - if (dto.getProjects() != null) { - List projects = new ArrayList<>(); - for (Map.Entry projectEntry : dto.getProjects().entrySet()) { - String projectId = projectEntry.getKey(); - ProjectDto projectDto = projectEntry.getValue(); + // Convert Physical Machines directly + if (dto.getPhysicalMachine() != null) { + List physicalMachines = new ArrayList<>(); + for (Map.Entry pmEntry : dto.getPhysicalMachine().entrySet()) { + String pmIp = pmEntry.getKey(); + PhysicalMachineDto pmDto = pmEntry.getValue(); - // Set the project ID and a default name if not provided - projectDto.setId(projectId); - if (projectDto.getName() == null || projectDto.getName().isEmpty()) { - projectDto.setName("Project-" + projectId.substring(0, 8)); // Use first 8 chars of ID as name + PhysicalMachine pm = new PhysicalMachine(); + pm.setName(pmDto.getName()); + pm.setIp(pmIp); // Use the IP from the map key + pm.setTag(pmDto.getTag()); + pm.setPower(pmDto.getPower()); + pm.setDataCenter(entity); + + // Process VMs for this PM + if (pmDto.getVms() != null) { + List vms = new ArrayList<>(); + for (Map.Entry vmEntry : pmDto.getVms().entrySet()) { + String vmIp = vmEntry.getKey(); + VMDto vmDto = vmEntry.getValue(); + + VM vm = toVMEntity(vmDto); + vm.setIp(vmIp); // Use the IP from the map key + vm.setPhysicalMachine(pm); + vms.add(vm); + } + pm.setVms(vms); } - Project project = toProjectEntity(projectDto); - project.setDataCenter(entity); - projects.add(project); + physicalMachines.add(pm); } - entity.setProjects(projects); - } - - return entity; - } - - public Project toProjectEntity(ProjectDto dto){ - if (dto == null) - return null; - - Project entity = new Project(); - entity.setName(dto.getName()); - - // Process MainOptimizationSpace instead of physical machines list - if (dto.getMainOptimizationSpace() != null) { - List physicalMachines = processMainOptimizationSpace(dto.getMainOptimizationSpace()); - // Set project reference for each PM - physicalMachines.forEach(pm -> pm.setProject(entity)); entity.setPhysicalMachines(physicalMachines); } - + return entity; } - - /** - * Process MainOptimizationSpaceDto and assign VMs to their hosting PMs - */ - private List processMainOptimizationSpace(MainOptimizationSpaceDto mainOptSpace) { - List physicalMachines = new ArrayList<>(); - - if (mainOptSpace.getPms() == null || mainOptSpace.getVms() == null) { - System.out.println("⚠️ MainOptimizationSpace has null PMs or VMs"); - return physicalMachines; - } - - System.out.println("🔍 Processing MainOptimizationSpace with " + - mainOptSpace.getPms().size() + " PMs and " + - mainOptSpace.getVms().size() + " VMs"); - - // Convert PMs from DTO to Entity - for (Map.Entry pmEntry : mainOptSpace.getPms().entrySet()) { - String pmIp = pmEntry.getKey(); - PhysicalMachineDto pmDto = pmEntry.getValue(); - - // Set the IP from the map key - pmDto.setIp(pmIp); - - PhysicalMachine pm = toPhysicalMachineEntity(pmDto); - physicalMachines.add(pm); - - System.out.println("✅ Created PM: " + pm.getName() + " (IP: " + pm.getIp() + ")"); - } - - // Assign VMs to their hosting PMs - for (Map.Entry vmEntry : mainOptSpace.getVms().entrySet()) { - String vmIp = vmEntry.getKey(); - VMDto vmDto = vmEntry.getValue(); - - // Set the IP from the map key - vmDto.setIp(vmIp); - - VM vm = toVMEntity(vmDto); - - // Find the hosting PM by IP - String hostingPmIp = vmDto.getHostingPm(); - PhysicalMachine hostingPm = physicalMachines.stream() - .filter(pm -> pm.getIp().equals(hostingPmIp)) - .findFirst() - .orElse(null); - - if (hostingPm != null) { - // Assign VM to PM - vm.setPhysicalMachine(hostingPm); - if (hostingPm.getVms() == null) { - hostingPm.setVms(new ArrayList<>()); - } - hostingPm.getVms().add(vm); - - System.out.println("✅ Assigned VM: " + vm.getVmName() + " (IP: " + vm.getIp() + - ") to PM: " + hostingPm.getName() + " (IP: " + hostingPm.getIp() + ")"); - } else { - System.err.println("❌ Could not find hosting PM with IP: " + hostingPmIp + - " for VM: " + vm.getVmName()); - } - } - - return physicalMachines; - } - @Transactional public DataCenter createDataCenter(DataCenter newDc) { @@ -335,123 +264,116 @@ public class MessageListener { // Note: DataCenter name and emission-related fields are no longer updated from the message // These are now managed via DataCenter CRUD operations - for (Project newProject : newDc.getProjects()) { - Optional existingProjOpt = dc.getProjects().stream() - .filter(p -> p.getName().equalsIgnoreCase(newProject.getName())) - .findFirst(); + // Ensure datacenter has initialized physical machines list + if (dc.getPhysicalMachines() == null) { + dc.setPhysicalMachines(new ArrayList<>()); + } - Project project; - if (existingProjOpt.isPresent()) { - project = existingProjOpt.get(); - project.setName(newProject.getName()); - System.out.println("✅ Updated existing project: " + project.getName()); - } else { - project = newProject; - project.setDataCenter(dc); - dc.getProjects().add(project); - System.out.println("✅ Created new project: " + project.getName()); + // Process Physical Machines directly from the message structure + for (PhysicalMachine newPm : newDc.getPhysicalMachines()) { + Optional existingPmOpt = dc.getPhysicalMachines().stream() + .filter(pm -> pm.getIp().equals(newPm.getIp())) // Match by IP instead of name + .findFirst(); + + PhysicalMachine pm; + if (existingPmOpt.isPresent()) { + // Update existing PM + pm = existingPmOpt.get(); + pm.setName(newPm.getName()); + pm.setIp(newPm.getIp()); + pm.setTag(newPm.getTag()); + pm.setPower(newPm.getPower()); + + System.out.println("✅ Updated existing PM: " + pm.getName() + " (IP: " + pm.getIp() + ")"); + } else { + // Create new PM + pm = newPm; + pm.setDataCenter(dc); + dc.getPhysicalMachines().add(pm); + + System.out.println("✅ Created new PM: " + pm.getName() + " (IP: " + pm.getIp() + ")"); + } + + // Process VMs that are already assigned to this PM + if (newPm.getVms() != null && !newPm.getVms().isEmpty()) { + System.out.println("🔍 Processing " + newPm.getVms().size() + " VMs for PM: " + newPm.getName()); + + // Ensure PM has VM list initialized + if (pm.getVms() == null) { + pm.setVms(new ArrayList<>()); } - - // Ensure project has initialized physical machines list - if (project.getPhysicalMachines() == null) { - project.setPhysicalMachines(new ArrayList<>()); - } - - // Process Physical Machines (VMs are already assigned to PMs from MainOptimizationSpace) - for (PhysicalMachine newPm : newProject.getPhysicalMachines()) { - Optional existingPmOpt = project.getPhysicalMachines().stream() - .filter(pm -> pm.getIp().equals(newPm.getIp())) // Match by IP instead of name - .findFirst(); - - PhysicalMachine pm; - if (existingPmOpt.isPresent()) { - // Update existing PM - pm = existingPmOpt.get(); - pm.setName(newPm.getName()); - pm.setIp(newPm.getIp()); - pm.setTag(newPm.getTag()); - pm.setPower(newPm.getPower()); - - System.out.println("✅ Updated existing PM: " + pm.getName() + " (IP: " + pm.getIp() + ")"); - } else { - // Create new PM - pm = newPm; - pm.setProject(project); - project.getPhysicalMachines().add(pm); - - System.out.println("✅ Created new PM: " + pm.getName() + " (IP: " + pm.getIp() + ")"); + + // Clear existing VMs to replace with new ones + pm.getVms().clear(); + + // Process each VM that's already assigned to this PM + for (VM newVm : newPm.getVms()) { + if (newVm == null) continue; + + // Find existing VM by vmName + Optional existingVmOpt = Optional.empty(); + String vmLookupName = newVm.getVmName(); + if (vmLookupName != null) { + existingVmOpt = vmRepo.findFirstByVmNameOrderByIdDesc(vmLookupName); } - - // Process VMs that are already assigned to this PM - if (newPm.getVms() != null && !newPm.getVms().isEmpty()) { - System.out.println("🔍 Processing " + newPm.getVms().size() + " VMs for PM: " + newPm.getName()); + + VM vm; + if (existingVmOpt.isPresent()) { + // Update existing VM + vm = existingVmOpt.get(); - // Ensure PM has VM list initialized - if (pm.getVms() == null) { - pm.setVms(new ArrayList<>()); + // IMPORTANT: Remove VM from its current Physical Machine first + if (vm.getPhysicalMachine() != null) { + PhysicalMachine currentPM = vm.getPhysicalMachine(); + if (currentPM.getVms() != null) { + currentPM.getVms().remove(vm); + System.out.println("🔄 Removed VM " + vm.getVmName() + " from previous PM: " + currentPM.getName()); + } } - // Clear existing VMs to replace with new ones - pm.getVms().clear(); + vm.setState(newVm.getState()); + vm.setVmName(newVm.getVmName()); + vm.setIp(newVm.getIp()); + vm.setPower(newVm.getPower()); + vm.setCalcOn(newVm.getCalcOn()); + vm.setHostingPm(newVm.getHostingPm()); + vm.setHost(newVm.getHost()); + vm.setFlavorName(newVm.getFlavorName()); + vm.setTag(newVm.getTag()); + vm.setEmissionSource(newVm.getEmissionSource()); + vm.setProject(newVm.getProject()); - // Process each VM that's already assigned to this PM - for (VM newVm : newPm.getVms()) { - if (newVm == null) continue; - - // Find existing VM by vmName - Optional existingVmOpt = Optional.empty(); - String vmLookupName = newVm.getVmName(); - if (vmLookupName != null) { - existingVmOpt = vmRepo.findFirstByVmNameOrderByIdDesc(vmLookupName); - } - - VM vm; - if (existingVmOpt.isPresent()) { - // Update existing VM - vm = existingVmOpt.get(); - vm.setState(newVm.getState()); - vm.setVmName(newVm.getVmName()); - vm.setIp(newVm.getIp()); - vm.setPower(newVm.getPower()); - vm.setCalcOn(newVm.getCalcOn()); - vm.setHostingPm(newVm.getHostingPm()); - 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 { - // Use new VM - vm = newVm; - - System.out.println("✅ Created new VM: " + vm.getVmName() + " (IP: " + vm.getIp() + ") - calcOn = " + vm.getCalcOn()); - } - - // Set physical machine relationship - vm.setPhysicalMachine(pm); - pm.getVms().add(vm); + System.out.println("✅ Updated existing VM: " + vm.getVmName() + " (IP: " + vm.getIp() + ") - calcOn = " + vm.getCalcOn()); + } else { + // Use new VM + vm = newVm; + + System.out.println("✅ Created new VM: " + vm.getVmName() + " (IP: " + vm.getIp() + ") - calcOn = " + vm.getCalcOn()); + } + + // Set physical machine relationship + vm.setPhysicalMachine(pm); + pm.getVms().add(vm); - // Update config - if (newVm.getConfig() != null) { - if (vm.getConfig() == null) { - vm.setConfig(newVm.getConfig()); - vm.getConfig().setVm(vm); - } else { - vm.getConfig().setCpu(newVm.getConfig().getCpu()); - vm.getConfig().setRam(newVm.getConfig().getRam()); - vm.getConfig().setDisk(newVm.getConfig().getDisk()); - } - } + // Update config + if (newVm.getConfig() != null) { + if (vm.getConfig() == null) { + vm.setConfig(newVm.getConfig()); + vm.getConfig().setVm(vm); + } else { + vm.getConfig().setCpu(newVm.getConfig().getCpu()); + vm.getConfig().setRam(newVm.getConfig().getRam()); + vm.getConfig().setDisk(newVm.getConfig().getDisk()); } } } } + } System.out.println("Before Save: DataCenter=" + dc.getDataCenter()); System.out.println("External ID=" + dc.getExternalId()); System.out.println("Number=" + dc.getNumber()); - System.out.println("Projects=" + (dc.getProjects() != null ? dc.getProjects().size() : 0)); + System.out.println("Physical Machines=" + (dc.getPhysicalMachines() != null ? dc.getPhysicalMachines().size() : 0)); DataCenter saved = dataCenterService.save(dc); System.out.println("✅ Saved: ID=" + saved.getId()); @@ -525,41 +447,29 @@ public class MessageListener { int failedCalculations = 0; int totalEmissionSources = 0; - for (Project project : dataCenter.getProjects()) { - for (PhysicalMachine pm : project.getPhysicalMachines()) { - if (pm.getVms() != null) { - // Calculate for all VMs (only those with calcOn = true) - for (VM vm : pm.getVms()) { - totalVMs++; - if (vm.getCalcOn() != null && vm.getCalcOn()) { - 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 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 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); + for (PhysicalMachine pm : dataCenter.getPhysicalMachines()) { + if (pm.getVms() != null) { + // Calculate for all VMs (only those with calcOn = true) + for (VM vm : pm.getVms()) { + totalVMs++; + if (vm.getCalcOn() != null && vm.getCalcOn()) { + 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 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 sourceEntry : emissionSources.entrySet()) { + String sourceName = sourceEntry.getKey(); + Integer percentage = sourceEntry.getValue(); + System.out.println(" - " + sourceName + ": " + percentage + "%"); + + boolean success = createVMEmissionRecordForSource(dataCenter, vm, pm, sourceName, percentage); if (success) { successfulCalculations++; } else { @@ -567,16 +477,26 @@ public class MessageListener { } } } else { - System.out.println("⚠️ Skipping VM " + vm.getVmName() + " (calcOn = true) - no power consumption data"); + // 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, pm); + if (success) { + successfulCalculations++; + } else { + failedCalculations++; + } } } else { - System.out.println("⏭️ Skipping VM " + vm.getVmName() + " - calcOn = " + vm.getCalcOn()); + System.out.println("⚠️ Skipping VM " + vm.getVmName() + " (calcOn = true) - no power consumption data"); } + } else { + System.out.println("⏭️ Skipping VM " + vm.getVmName() + " - calcOn = " + vm.getCalcOn()); } } } } - + System.out.println("🎯 VM Emission Calculation Summary:"); System.out.println(" Total VMs found: " + totalVMs); System.out.println(" VMs with calcOn = true: " + eligibleVMs); @@ -587,7 +507,7 @@ public class MessageListener { System.out.println(" Failed emission calculations: " + failedCalculations); } - private boolean createVMEmissionRecord(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm) { + private boolean createVMEmissionRecord(DataCenter dataCenter, VM vm, PhysicalMachine pm) { try { // Check if VM has an ID (is persisted) if (vm.getId() == null) { @@ -595,7 +515,7 @@ public class MessageListener { return false; } - MainDataTableCreateInput input = createVMMainDataTableInput(dataCenter, vm, project, pm); + MainDataTableCreateInput input = createVMMainDataTableInput(dataCenter, vm, pm); System.out.println("🔍 Creating emission record for VM: " + vm.getVmName() + " (Power: " + vm.getPower() + "W)"); MainDataTable result = callMainDataTableMutation(input); @@ -619,7 +539,7 @@ public class MessageListener { } } - private boolean createVMEmissionRecordForSource(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm, String emissionSourceName, Integer percentage) { + private boolean createVMEmissionRecordForSource(DataCenter dataCenter, VM vm, PhysicalMachine pm, String emissionSourceName, Integer percentage) { try { // Check if VM has an ID (is persisted) if (vm.getId() == null) { @@ -639,7 +559,13 @@ public class MessageListener { // 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); + MainDataTableCreateInput input = createVMMainDataTableInputForSource(dataCenter, vm, pm, emissionSource, sourceSpecificPower, percentage); + + if (input == null) { + System.err.println("❌ Failed to create input for VM emission calculation - skipping"); + return false; + } + System.out.println("🔍 Creating emission record for VM: " + vm.getVmName() + " - Source: " + emissionSourceName + " (" + percentage + "%) - Power: " + sourceSpecificPower + "W"); @@ -665,7 +591,7 @@ public class MessageListener { } } - private MainDataTableCreateInput createVMMainDataTableInput(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm) { + private MainDataTableCreateInput createVMMainDataTableInput(DataCenter dataCenter, VM vm, PhysicalMachine pm) { MainDataTableCreateInput input = new MainDataTableCreateInput(); // Copy datacenter-level information (if available) @@ -692,8 +618,15 @@ public class MessageListener { input.setSubSector(dataCenter.getSubSector().getId()); } - if (dataCenter.getEmissionSource() != null) { - input.setEmissionSource(dataCenter.getEmissionSource().getId()); + // Handle multiple emission sources - use the default one for emission calculations + if (dataCenter.getDataCenterEmissionSources() != null && !dataCenter.getDataCenterEmissionSources().isEmpty()) { + // Find the default emission source or use the first one + DataCenterEmissionSource defaultEmissionSource = dataCenter.getDataCenterEmissionSources().stream() + .filter(DataCenterEmissionSource::getIsDefault) + .findFirst() + .orElse(dataCenter.getDataCenterEmissionSources().get(0)); + + input.setEmissionSource(defaultEmissionSource.getEmissionSource().getId()); } else { // Fallback to default emission source for electricity try { @@ -711,8 +644,16 @@ public class MessageListener { input.setActivitySubUnit(dataCenter.getActivitySubUnit().getId()); } - if (dataCenter.getConsuptionUnit() != null) { - input.setConsuptionUnit(dataCenter.getConsuptionUnit().getId()); + // Handle consumption unit from emission sources - use the default one for VM calculations + if (dataCenter.getDataCenterEmissionSources() != null && !dataCenter.getDataCenterEmissionSources().isEmpty()) { + DataCenterEmissionSource defaultEmissionSource = dataCenter.getDataCenterEmissionSources().stream() + .filter(DataCenterEmissionSource::getIsDefault) + .findFirst() + .orElse(dataCenter.getDataCenterEmissionSources().get(0)); + + if (defaultEmissionSource.getConsuptionUnit() != null) { + input.setConsuptionUnit(defaultEmissionSource.getConsuptionUnit().getId()); + } } // Default to Kapsam-3 if no emission scope is set @@ -739,68 +680,134 @@ public class MessageListener { System.out.println(" VM Name: " + vm.getVmName()); System.out.println(" Power: " + vm.getPower() + "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 MainDataTableCreateInput createVMMainDataTableInputForSource(DataCenter dataCenter, VM vm, Project project, PhysicalMachine pm, EmissionSource emissionSource, double sourceSpecificPower, Integer percentage) { + private MainDataTableCreateInput createVMMainDataTableInputForSource(DataCenter dataCenter, VM vm, PhysicalMachine pm, EmissionSource emissionSource, double sourceSpecificPower, Integer percentage) { MainDataTableCreateInput input = new MainDataTableCreateInput(); // Copy datacenter-level information (if available) input.setYear("2025"); input.setMonth("07"); + // Validate required fields + if (dataCenter == null) { + System.err.println("❌ DataCenter is null - cannot create emission record"); + return null; + } + + if (vm == null) { + System.err.println("❌ VM is null - cannot create emission record"); + return null; + } + + if (emissionSource == null) { + System.err.println("❌ EmissionSource is null - cannot create emission record"); + return null; + } + // 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()); + System.out.println("🔍 Setting City: " + dataCenter.getArea().getCities().get(0).getId()); + } else { + System.out.println("⚠️ Warning: No city available for DataCenter"); } if (dataCenter.getArea() != null && !dataCenter.getArea().getDistricts().isEmpty()) { input.setDistrict(dataCenter.getArea().getDistricts().get(0).getId()); + System.out.println("🔍 Setting District: " + dataCenter.getArea().getDistricts().get(0).getId()); + } else { + System.out.println("⚠️ Warning: No district available for DataCenter"); } if (dataCenter.getSector() != null) { input.setSector(dataCenter.getSector().getId()); + System.out.println("🔍 Setting Sector: " + dataCenter.getSector().getId() + " (" + dataCenter.getSector().getTag() + ")"); } else { - System.out.println("⚠️ Warning: DataCenter has no sector set - emission calculation may fail"); + System.err.println("❌ Error: DataCenter has no sector set - this is required for emission calculation"); + return null; } if (dataCenter.getSubSector() != null) { input.setSubSector(dataCenter.getSubSector().getId()); + System.out.println("🔍 Setting SubSector: " + dataCenter.getSubSector().getId()); + } else { + System.out.println("⚠️ Warning: DataCenter has no subsector set"); } // Use the specific emission source for this calculation input.setEmissionSource(emissionSource.getId()); + System.out.println("🔍 Setting EmissionSource: " + emissionSource.getId() + " (" + emissionSource.getTag() + ")"); if (dataCenter.getActivitySubUnit() != null) { input.setActivitySubUnit(dataCenter.getActivitySubUnit().getId()); + System.out.println("🔍 Setting ActivitySubUnit: " + dataCenter.getActivitySubUnit().getId()); + } else { + System.out.println("⚠️ Warning: DataCenter has no activity sub unit set"); } - if (dataCenter.getConsuptionUnit() != null) { - input.setConsuptionUnit(dataCenter.getConsuptionUnit().getId()); + // Handle consumption unit from emission sources - use the emission source's unit + if (emissionSource != null) { + // Find the DataCenterEmissionSource that matches this emissionSource + System.out.println("🔍 Looking for consumption unit for emission source: " + emissionSource.getTag()); + + if (dataCenter.getDataCenterEmissionSources() == null || dataCenter.getDataCenterEmissionSources().isEmpty()) { + System.err.println("❌ Error: DataCenter has no emission sources configured - cannot find consumption unit"); + return null; + } + + boolean foundUnit = false; + for (DataCenterEmissionSource dces : dataCenter.getDataCenterEmissionSources()) { + if (dces.getEmissionSource() != null && dces.getEmissionSource().getId().equals(emissionSource.getId())) { + if (dces.getConsuptionUnit() != null) { + input.setConsuptionUnit(dces.getConsuptionUnit().getId()); + System.out.println("🔍 Setting ConsumptionUnit: " + dces.getConsuptionUnit().getId() + " (" + dces.getConsuptionUnit().getTag() + ")"); + foundUnit = true; + break; + } else { + System.err.println("❌ Error: DataCenterEmissionSource has no consumption unit set for emission source: " + emissionSource.getTag()); + return null; + } + } + } + + if (!foundUnit) { + System.err.println("❌ Error: Could not find matching DataCenterEmissionSource for emission source: " + emissionSource.getTag()); + return null; + } } // Default to Kapsam-3 if no emission scope is set input.setScope(dataCenter.getEmissionScope() != null ? dataCenter.getEmissionScope().getTag().equals("Kapsam-3") : true); + System.out.println("🔍 Setting Scope: " + (dataCenter.getEmissionScope() != null ? + dataCenter.getEmissionScope().getTag() : "Kapsam-3 (default)")); try { List organizations = organizationRepo.findAll(); if (!organizations.isEmpty()) { input.setOrganization(organizations.get(0).getId()); + System.out.println("🔍 Setting Organization: " + organizations.get(0).getId()); + } else { + System.err.println("❌ Error: No organizations found in database - this is required"); + return null; } } catch (Exception e) { System.err.println("❌ Error finding organization: " + e.getMessage()); + return null; } // Set VM-specific fields input.setVmId(vm.getId()); + System.out.println("🔍 Setting VM ID: " + vm.getId()); // Use the source-specific power consumption (percentage of total VM power) input.setConsuptionAmount(String.valueOf(sourceSpecificPower)); + System.out.println("🔍 Setting Consumption Amount: " + sourceSpecificPower + "W"); System.out.println("🔍 VM Emission Input for Source:"); System.out.println(" VM ID: " + vm.getId()); @@ -809,7 +816,6 @@ public class MessageListener { 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; @@ -828,6 +834,34 @@ public class MessageListener { try { System.out.println("🔄 Calling mainDataTableMutation.createMainDataTable..."); + // Validate input fields before making the call + if (input.getSector() == null) { + System.err.println("❌ Sector is null - cannot create emission record"); + return null; + } + + if (input.getEmissionSource() == null) { + System.err.println("❌ EmissionSource is null - cannot create emission record"); + return null; + } + + if (input.getConsuptionUnit() == null) { + System.err.println("❌ ConsumptionUnit is null - cannot create emission record"); + return null; + } + + if (input.getOrganization() == null) { + System.err.println("❌ Organization is null - cannot create emission record"); + return null; + } + + if (input.getVmId() == null) { + System.err.println("❌ VM ID is null - cannot create emission record"); + return null; + } + + System.out.println("🔍 Input validation passed - proceeding with mutation call"); + // Call the mutation method - pass null environment since we've already patched the logging MainDataTable result = mainDataTableMutation.createMainDataTable(input, null); diff --git a/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls index bae61e8..4c5cb3f 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/input.graphqls @@ -5,8 +5,10 @@ input DataCenterCreateInput { sectorId: ID subSectorId: ID activitySubUnitId: ID - emissionSourceId: ID - consuptionUnitId: ID + + # Multiple emission sources support - each with exactly one unit + dataCenterEmissionSources: [DataCenterEmissionSourceInput!] + consuptionAmount: Float areaId: ID number: Int @@ -23,8 +25,10 @@ input DataCenterUpdateInput { sectorId: ID subSectorId: ID activitySubUnitId: ID - emissionSourceId: ID - consuptionUnitId: ID + + # Multiple emission sources support - each with exactly one unit + dataCenterEmissionSources: [DataCenterEmissionSourceInput!] + consuptionAmount: Float areaId: ID number: Int @@ -33,3 +37,10 @@ input DataCenterUpdateInput { latitude: Float longitude: Float } + +input DataCenterEmissionSourceInput { + emissionSourceId: ID! + consuptionUnitId: ID! + isDefault: Boolean + percentage: Float +} diff --git a/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls index 76b327e..db03553 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls @@ -3,5 +3,5 @@ extend type Query{ dataCenters(criteria: DataCenterCriteria, sortBy: [SortBy!]): [DataCenter!] paginateDataCenters(pagination : Pagination!, criteria: DataCenterCriteria, sortBy:[SortBy!] ) : DataCenterPageable! getByNumber(number: Int!): DataCenter - physicalMachines(datacenterId: ID!, projectId: ID!): [PhysicalMachine!]! + physicalMachines(datacenterId: ID!): [PhysicalMachine!]! } \ No newline at end of file diff --git a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls index 9eee493..c6b5929 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls @@ -7,11 +7,13 @@ type DataCenter { sector: Sector subSector: SubSector activitySubUnit: ActivitySubUnit - emissionSource: EmissionSource - consuptionUnit: ConsuptionUnit + + # Multiple emission sources support - each with exactly one unit + dataCenterEmissionSources: [DataCenterEmissionSource] + consuptionAmount: Float - projects: [Project] + physicalMachines: [PhysicalMachine] area: Area number: Int @@ -21,11 +23,12 @@ type DataCenter { longitude: Float } -type Project { +type DataCenterEmissionSource { id: ID - name: String - physicalMachines: [PhysicalMachine] - dataCenter: DataCenter + emissionSource: EmissionSource + consuptionUnit: ConsuptionUnit + isDefault: Boolean + percentage: Float } type PhysicalMachine { @@ -33,12 +36,13 @@ type PhysicalMachine { name: String ip: String tag: String + cloudSystem: String power: Float - vms: [Vm] - project: Project + vms: [VM] + dataCenter: DataCenter } -type Vm { +type VM { id: ID state: String vmName: String @@ -49,6 +53,7 @@ type Vm { host: String flavorName: String tag: String + project: String emissionSource: EmissionSourceMap config: Config physicalMachine: PhysicalMachine diff --git a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls index d5cabde..0424e35 100644 --- a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls +++ b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls @@ -26,11 +26,11 @@ type MainDataTable { proteinAmount:Float burnOrOpenBurn:Boolean scopeCheck:Boolean - vm: Vm + vm: VM } -type Vm { +type VM { id: ID state: String vmName: String @@ -41,6 +41,7 @@ type Vm { host: String flavorName: String tag: String + project: String config: Config }