decoders.go 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108
  1. package source
  2. import (
  3. "time"
  4. "github.com/opencost/opencost/core/pkg/log"
  5. "github.com/opencost/opencost/core/pkg/util"
  6. )
  7. const (
  8. ProviderLabel = "provider"
  9. AccountIDLabel = "account_id"
  10. ClusterNameLabel = "cluster_name"
  11. RegionLabel = "region"
  12. ClusterIDLabel = "cluster_id"
  13. NamespaceLabel = "namespace"
  14. NamespaceUIDLabel = "namespace_uid"
  15. NodeLabel = "node"
  16. NodeUIDLabel = "node_uid"
  17. InstanceLabel = "instance"
  18. InstanceTypeLabel = "instance_type"
  19. ContainerLabel = "container"
  20. PodLabel = "pod"
  21. PodUIDLabel = "pod_uid"
  22. PodNameLabel = "pod_name"
  23. PodVolumeNameLabel = "pod_volume_name"
  24. ProviderIDLabel = "provider_id"
  25. DeviceLabel = "device"
  26. PVCLabel = "persistentvolumeclaim"
  27. PVCUIDLabel = "persistentvolumeclaim_uid"
  28. PVLabel = "persistentvolume"
  29. CSIVolumeHandleLabel = "csi_volume_handle"
  30. StorageClassLabel = "storageclass"
  31. VolumeNameLabel = "volumename"
  32. PVUIDLabel = "persistentvolume_uid"
  33. ServiceLabel = "service"
  34. ServiceNameLabel = "service_name"
  35. ServiceTypeLabel = "service_type"
  36. IngressIPLabel = "ingress_ip"
  37. ProvisionerNameLabel = "provisioner_name"
  38. UIDLabel = "uid"
  39. KubernetesNodeLabel = "kubernetes_node"
  40. ModeLabel = "mode"
  41. ModelNameLabel = "modelName"
  42. HostNameLabel = "Hostname"
  43. UUIDLabel = "UUID"
  44. ResourceLabel = "resource"
  45. DeploymentLabel = "deployment"
  46. StatefulSetLabel = "statefulSet"
  47. DaemonSetLabel = "daemonset"
  48. JobLabel = "job"
  49. CronJobLabel = "cronjob"
  50. ReplicaSetLabel = "replicaset"
  51. ResourceQuotaLabel = "resourcequota"
  52. OwnerNameLabel = "owner_name"
  53. OwnerKindLabel = "owner_kind"
  54. OwnerUIDLabel = "owner_uid"
  55. ControllerLabel = "controller"
  56. UnitLabel = "unit"
  57. InternetLabel = "internet"
  58. SameZoneLabel = "same_zone"
  59. SameRegionLabel = "same_region"
  60. NatGatewayLabel = "nat_gateway"
  61. )
  62. const (
  63. NoneLabelValue = "<none>"
  64. )
  65. // UptimeResult represents the first and last recorded sample timestamp within the query window
  66. type UptimeResult struct {
  67. UID string
  68. First time.Time
  69. Last time.Time
  70. }
  71. func (res *UptimeResult) GetStartEnd(windowStart, windowEnd time.Time, resolution time.Duration) (time.Time, time.Time) {
  72. return getStartEnd(res.First, res.Last, windowStart, windowEnd, resolution)
  73. }
  74. func DecodeUptimeResult(result *QueryResult) *UptimeResult {
  75. uid, _ := result.GetString(UIDLabel)
  76. first := time.Unix(int64(result.Values[0].Timestamp), 0).UTC()
  77. last := time.Unix(int64(result.Values[len(result.Values)-1].Timestamp), 0).UTC()
  78. return &UptimeResult{
  79. UID: uid,
  80. First: first,
  81. Last: last,
  82. }
  83. }
  84. // Container requires some special results because container name and pod UID is required to uniqly identify it
  85. type ContainerUptimeResult struct {
  86. UptimeResult
  87. Container string
  88. }
  89. func DecodeContainerUptimeResult(result *QueryResult) *ContainerUptimeResult {
  90. container, _ := result.GetString(ContainerLabel)
  91. ur := DecodeUptimeResult(result)
  92. return &ContainerUptimeResult{
  93. UptimeResult: *ur,
  94. Container: container,
  95. }
  96. }
  97. type ContainerResourceResult struct {
  98. ResourceResult
  99. Container string
  100. }
  101. func DecodeContainerResourceResult(result *QueryResult) *ContainerResourceResult {
  102. container, _ := result.GetString(ContainerLabel)
  103. rr := DecodeResourceResult(result)
  104. return &ContainerResourceResult{
  105. ResourceResult: *rr,
  106. Container: container,
  107. }
  108. }
  109. type LabelsResult struct {
  110. UID string
  111. Cluster string
  112. Labels map[string]string
  113. }
  114. func DecodeLabelsResult(result *QueryResult) *LabelsResult {
  115. uid, _ := result.GetString(UIDLabel)
  116. cluster, _ := result.GetCluster()
  117. labels := result.GetLabels()
  118. return &LabelsResult{
  119. UID: uid,
  120. Cluster: cluster,
  121. Labels: labels,
  122. }
  123. }
  124. type AnnotationsResult struct {
  125. UID string
  126. Cluster string
  127. Annotations map[string]string
  128. }
  129. func DecodeAnnotationsResult(result *QueryResult) *AnnotationsResult {
  130. uid, _ := result.GetString(UIDLabel)
  131. cluster, _ := result.GetCluster()
  132. annotations := result.GetAnnotations()
  133. return &AnnotationsResult{
  134. UID: uid,
  135. Cluster: cluster,
  136. Annotations: annotations,
  137. }
  138. }
  139. type PVResult struct {
  140. Cluster string
  141. PersistentVolume string
  142. }
  143. type PVUsedAvgResult struct {
  144. Cluster string
  145. Namespace string
  146. PersistentVolumeClaim string
  147. Data []*util.Vector
  148. }
  149. func DecodePVUsedAvgResult(result *QueryResult) *PVUsedAvgResult {
  150. cluster, _ := result.GetCluster()
  151. namespace, _ := result.GetNamespace()
  152. pvc, _ := result.GetString(PVCLabel)
  153. return &PVUsedAvgResult{
  154. Cluster: cluster,
  155. Namespace: namespace,
  156. PersistentVolumeClaim: pvc,
  157. Data: result.Values,
  158. }
  159. }
  160. type PVActiveMinutesResult struct {
  161. UID string
  162. Cluster string
  163. PersistentVolume string
  164. Data []*util.Vector
  165. }
  166. func DecodePVActiveMinutesResult(result *QueryResult) *PVActiveMinutesResult {
  167. uid, _ := result.GetString(UIDLabel)
  168. cluster, _ := result.GetCluster()
  169. pv, _ := result.GetString(PVLabel)
  170. return &PVActiveMinutesResult{
  171. UID: uid,
  172. Cluster: cluster,
  173. PersistentVolume: pv,
  174. Data: result.Values,
  175. }
  176. }
  177. type PVUsedMaxResult struct {
  178. Cluster string
  179. Namespace string
  180. PersistentVolumeClaim string
  181. Data []*util.Vector
  182. }
  183. func DecodePVUsedMaxResult(result *QueryResult) *PVUsedMaxResult {
  184. cluster, _ := result.GetCluster()
  185. namespace, _ := result.GetNamespace()
  186. pvc, _ := result.GetString(PVCLabel)
  187. return &PVUsedMaxResult{
  188. Cluster: cluster,
  189. Namespace: namespace,
  190. PersistentVolumeClaim: pvc,
  191. Data: result.Values,
  192. }
  193. }
  194. type LocalStorageActiveMinutesResult struct {
  195. Cluster string
  196. Node string
  197. ProviderID string
  198. Data []*util.Vector
  199. }
  200. func DecodeLocalStorageActiveMinutesResult(result *QueryResult) *LocalStorageActiveMinutesResult {
  201. cluster, _ := result.GetCluster()
  202. node, _ := result.GetNode()
  203. if node == "" {
  204. node, _ = result.GetInstance()
  205. }
  206. providerId, _ := result.GetProviderID()
  207. return &LocalStorageActiveMinutesResult{
  208. Cluster: cluster,
  209. Node: node,
  210. ProviderID: providerId,
  211. Data: result.Values,
  212. }
  213. }
  214. type LocalStorageCostResult struct {
  215. UID string
  216. Cluster string
  217. Instance string
  218. Device string
  219. Data []*util.Vector
  220. }
  221. func DecodeLocalStorageCostResult(result *QueryResult) *LocalStorageCostResult {
  222. uid, _ := result.GetString(UIDLabel)
  223. cluster, _ := result.GetCluster()
  224. instance, _ := result.GetInstance()
  225. device, _ := result.GetDevice()
  226. return &LocalStorageCostResult{
  227. UID: uid,
  228. Cluster: cluster,
  229. Instance: instance,
  230. Device: device,
  231. Data: result.Values,
  232. }
  233. }
  234. type LocalStorageUsedCostResult struct {
  235. UID string
  236. Cluster string
  237. Instance string
  238. Device string
  239. Data []*util.Vector
  240. }
  241. func DecodeLocalStorageUsedCostResult(result *QueryResult) *LocalStorageUsedCostResult {
  242. uid, _ := result.GetString(UIDLabel)
  243. cluster, _ := result.GetCluster()
  244. instance, _ := result.GetInstance()
  245. device, _ := result.GetDevice()
  246. return &LocalStorageUsedCostResult{
  247. UID: uid,
  248. Cluster: cluster,
  249. Instance: instance,
  250. Device: device,
  251. Data: result.Values,
  252. }
  253. }
  254. type LocalStorageUsedAvgResult struct {
  255. UID string
  256. Cluster string
  257. Instance string
  258. Device string
  259. Data []*util.Vector
  260. }
  261. func DecodeLocalStorageUsedAvgResult(result *QueryResult) *LocalStorageUsedAvgResult {
  262. uid, _ := result.GetString(UIDLabel)
  263. cluster, _ := result.GetCluster()
  264. instance, _ := result.GetInstance()
  265. device, _ := result.GetDevice()
  266. return &LocalStorageUsedAvgResult{
  267. UID: uid,
  268. Cluster: cluster,
  269. Instance: instance,
  270. Device: device,
  271. Data: result.Values,
  272. }
  273. }
  274. type LocalStorageUsedMaxResult struct {
  275. UID string
  276. Cluster string
  277. Instance string
  278. Device string
  279. Data []*util.Vector
  280. }
  281. func DecodeLocalStorageUsedMaxResult(result *QueryResult) *LocalStorageUsedMaxResult {
  282. uid, _ := result.GetString(UIDLabel)
  283. cluster, _ := result.GetCluster()
  284. instance, _ := result.GetInstance()
  285. device, _ := result.GetDevice()
  286. return &LocalStorageUsedMaxResult{
  287. UID: uid,
  288. Cluster: cluster,
  289. Instance: instance,
  290. Device: device,
  291. Data: result.Values,
  292. }
  293. }
  294. type LocalStorageBytesResult struct {
  295. UID string
  296. Cluster string
  297. Instance string
  298. Device string
  299. Data []*util.Vector
  300. }
  301. func DecodeLocalStorageBytesResult(result *QueryResult) *LocalStorageBytesResult {
  302. uid, _ := result.GetString(UIDLabel)
  303. cluster, _ := result.GetCluster()
  304. instance, _ := result.GetInstance()
  305. device, _ := result.GetDevice()
  306. return &LocalStorageBytesResult{
  307. UID: uid,
  308. Cluster: cluster,
  309. Instance: instance,
  310. Device: device,
  311. Data: result.Values,
  312. }
  313. }
  314. type NodeInfoResult struct {
  315. UID string
  316. Cluster string
  317. Node string
  318. ProviderID string
  319. InstanceType string
  320. }
  321. func DecodeNodeInfoResult(result *QueryResult) *NodeInfoResult {
  322. uid, _ := result.GetString(UIDLabel)
  323. cluster, _ := result.GetCluster()
  324. node, _ := result.GetNode()
  325. providerId, _ := result.GetProviderID()
  326. instanceType, _ := result.GetInstanceType()
  327. return &NodeInfoResult{
  328. UID: uid,
  329. Cluster: cluster,
  330. Node: node,
  331. ProviderID: providerId,
  332. InstanceType: instanceType,
  333. }
  334. }
  335. type NodeActiveMinutesResult struct {
  336. UID string
  337. Cluster string
  338. Node string
  339. ProviderID string
  340. Data []*util.Vector
  341. }
  342. func DecodeNodeActiveMinutesResult(result *QueryResult) *NodeActiveMinutesResult {
  343. uid, _ := result.GetString(UIDLabel)
  344. cluster, _ := result.GetCluster()
  345. node, _ := result.GetNode()
  346. providerId, _ := result.GetProviderID()
  347. return &NodeActiveMinutesResult{
  348. UID: uid,
  349. Cluster: cluster,
  350. Node: node,
  351. ProviderID: providerId,
  352. Data: result.Values,
  353. }
  354. }
  355. type NodeCPUCoresCapacityResult struct {
  356. UID string
  357. Cluster string
  358. Node string
  359. CPUCores float64
  360. }
  361. func DecodeNodeCPUCoresCapacityResult(result *QueryResult) *NodeCPUCoresCapacityResult {
  362. uid, _ := result.GetString(UIDLabel)
  363. cluster, _ := result.GetCluster()
  364. node, _ := result.GetNode()
  365. var value float64
  366. if len(result.Values) > 0 {
  367. value = result.Values[0].Value
  368. } else {
  369. log.Warnf("Error decoding node CPU cores capacity result for node '%s': empty value returned", uid)
  370. }
  371. return &NodeCPUCoresCapacityResult{
  372. UID: uid,
  373. Cluster: cluster,
  374. Node: node,
  375. CPUCores: value,
  376. }
  377. }
  378. type NodeCPUCoresAllocatableResult = NodeCPUCoresCapacityResult
  379. func DecodeNodeCPUCoresAllocatableResult(result *QueryResult) *NodeCPUCoresAllocatableResult {
  380. return DecodeNodeCPUCoresCapacityResult(result)
  381. }
  382. type NodeRAMBytesCapacityResult struct {
  383. UID string
  384. Cluster string
  385. Node string
  386. RAMBytes float64
  387. }
  388. func DecodeNodeRAMBytesCapacityResult(result *QueryResult) *NodeRAMBytesCapacityResult {
  389. uid, _ := result.GetString(UIDLabel)
  390. cluster, _ := result.GetCluster()
  391. node, _ := result.GetNode()
  392. var value float64
  393. if len(result.Values) > 0 {
  394. value = result.Values[0].Value
  395. } else {
  396. log.Warnf("Error decoding node RAM bytes capacity result for node '%s': empty value returned", uid)
  397. }
  398. return &NodeRAMBytesCapacityResult{
  399. UID: uid,
  400. Cluster: cluster,
  401. Node: node,
  402. RAMBytes: value,
  403. }
  404. }
  405. type NodeRAMBytesAllocatableResult = NodeRAMBytesCapacityResult
  406. func DecodeNodeRAMBytesAllocatableResult(result *QueryResult) *NodeRAMBytesAllocatableResult {
  407. return DecodeNodeRAMBytesCapacityResult(result)
  408. }
  409. type NodeGPUCountResult struct {
  410. UID string
  411. Cluster string
  412. Node string
  413. ProviderID string
  414. GPUCount float64
  415. }
  416. func DecodeNodeGPUCountResult(result *QueryResult) *NodeGPUCountResult {
  417. uid, _ := result.GetString(UIDLabel)
  418. cluster, _ := result.GetCluster()
  419. node, _ := result.GetNode()
  420. providerId, _ := result.GetProviderID()
  421. var value float64
  422. if len(result.Values) > 0 {
  423. value = result.Values[0].Value
  424. } else {
  425. log.Warnf("Error decoding node GPU count capacity result for node '%s': empty value returned", uid)
  426. }
  427. return &NodeGPUCountResult{
  428. UID: uid,
  429. Cluster: cluster,
  430. Node: node,
  431. ProviderID: providerId,
  432. GPUCount: value,
  433. }
  434. }
  435. type NodeCPUModeTotalResult struct {
  436. UID string
  437. Cluster string
  438. Node string
  439. Mode string
  440. Data []*util.Vector
  441. }
  442. func DecodeNodeCPUModeTotalResult(result *QueryResult) *NodeCPUModeTotalResult {
  443. uid, _ := result.GetString(UIDLabel)
  444. cluster, _ := result.GetCluster()
  445. node, _ := result.GetString(KubernetesNodeLabel)
  446. mode, _ := result.GetString(ModeLabel)
  447. return &NodeCPUModeTotalResult{
  448. UID: uid,
  449. Cluster: cluster,
  450. Node: node,
  451. Mode: mode,
  452. Data: result.Values,
  453. }
  454. }
  455. type NodeIsSpotResult struct {
  456. UID string
  457. Cluster string
  458. Node string
  459. ProviderID string
  460. Data []*util.Vector
  461. }
  462. func DecodeNodeIsSpotResult(result *QueryResult) *NodeIsSpotResult {
  463. uid, _ := result.GetString(UIDLabel)
  464. cluster, _ := result.GetCluster()
  465. node, _ := result.GetNode()
  466. providerId, _ := result.GetProviderID()
  467. return &NodeIsSpotResult{
  468. UID: uid,
  469. Cluster: cluster,
  470. Node: node,
  471. ProviderID: providerId,
  472. Data: result.Values,
  473. }
  474. }
  475. type NodeRAMSystemPercentResult struct {
  476. UID string
  477. Cluster string
  478. Instance string
  479. Data []*util.Vector
  480. }
  481. func DecodeNodeRAMSystemPercentResult(result *QueryResult) *NodeRAMSystemPercentResult {
  482. uid, _ := result.GetString(UIDLabel)
  483. cluster, _ := result.GetCluster()
  484. instance, _ := result.GetInstance()
  485. return &NodeRAMSystemPercentResult{
  486. UID: uid,
  487. Cluster: cluster,
  488. Instance: instance,
  489. Data: result.Values,
  490. }
  491. }
  492. type NodeRAMUserPercentResult = NodeRAMSystemPercentResult
  493. func DecodeNodeRAMUserPercentResult(result *QueryResult) *NodeRAMUserPercentResult {
  494. return DecodeNodeRAMSystemPercentResult(result)
  495. }
  496. type LBActiveMinutesResult struct {
  497. UID string
  498. Cluster string
  499. Namespace string
  500. Service string
  501. IngressIP string
  502. Data []*util.Vector
  503. }
  504. func DecodeLBActiveMinutesResult(result *QueryResult) *LBActiveMinutesResult {
  505. uid, _ := result.GetString(UIDLabel)
  506. cluster, _ := result.GetCluster()
  507. namespace, _ := result.GetNamespace()
  508. service, _ := result.GetString(ServiceNameLabel)
  509. ingressIp, _ := result.GetString(IngressIPLabel)
  510. return &LBActiveMinutesResult{
  511. UID: uid,
  512. Cluster: cluster,
  513. Namespace: namespace,
  514. Service: service,
  515. IngressIP: ingressIp,
  516. Data: result.Values,
  517. }
  518. }
  519. type LBPricePerHrResult = LBActiveMinutesResult
  520. func DecodeLBPricePerHrResult(result *QueryResult) *LBPricePerHrResult {
  521. return DecodeLBActiveMinutesResult(result)
  522. }
  523. type ClusterInfoResult struct {
  524. UID string
  525. Cluster string
  526. Provider string
  527. AccountID string
  528. Provisioner string
  529. Region string
  530. }
  531. func DecodeClusterInfoResult(result *QueryResult) *ClusterInfoResult {
  532. uid, _ := result.GetString(UIDLabel)
  533. cluster, _ := result.GetString(ClusterNameLabel)
  534. provider, _ := result.GetString(ProviderLabel)
  535. accountID, _ := result.GetString(AccountIDLabel)
  536. provisioner, _ := result.GetString(ProvisionerNameLabel)
  537. region, _ := result.GetString(RegionLabel)
  538. return &ClusterInfoResult{
  539. UID: uid,
  540. Cluster: cluster,
  541. Provider: provider,
  542. AccountID: accountID,
  543. Provisioner: provisioner,
  544. Region: region,
  545. }
  546. }
  547. type ClusterManagementDurationResult struct {
  548. UID string
  549. Cluster string
  550. Provisioner string
  551. Data []*util.Vector
  552. }
  553. func DecodeClusterManagementDurationResult(result *QueryResult) *ClusterManagementDurationResult {
  554. uid, _ := result.GetString(UIDLabel)
  555. cluster, _ := result.GetCluster()
  556. provisioner, _ := result.GetString(ProvisionerNameLabel)
  557. return &ClusterManagementDurationResult{
  558. UID: uid,
  559. Cluster: cluster,
  560. Provisioner: provisioner,
  561. Data: result.Values,
  562. }
  563. }
  564. type ClusterManagementPricePerHrResult = ClusterManagementDurationResult
  565. func DecodeClusterManagementPricePerHrResult(result *QueryResult) *ClusterManagementPricePerHrResult {
  566. return DecodeClusterManagementDurationResult(result)
  567. }
  568. type PodInfoResult struct {
  569. UID string
  570. Cluster string
  571. Pod string
  572. NamespaceUID string
  573. NodeUID string
  574. }
  575. func DecodePodInfoResult(result *QueryResult) *PodInfoResult {
  576. uid, _ := result.GetString(UIDLabel)
  577. cluster, _ := result.GetCluster()
  578. pod, _ := result.GetPod()
  579. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  580. nodeUID, _ := result.GetString(NodeUIDLabel)
  581. return &PodInfoResult{
  582. UID: uid,
  583. Cluster: cluster,
  584. Pod: pod,
  585. NamespaceUID: namespaceUID,
  586. NodeUID: nodeUID,
  587. }
  588. }
  589. type PodPVCVolumeResult struct {
  590. UID string
  591. Cluster string
  592. PVCUID string
  593. PodVolumeName string
  594. }
  595. func DecodePodPVCVolumeResult(result *QueryResult) *PodPVCVolumeResult {
  596. uid, _ := result.GetString(UIDLabel)
  597. cluster, _ := result.GetCluster()
  598. pvcUID, _ := result.GetString(PVCUIDLabel)
  599. podVolumeName, _ := result.GetString(PodVolumeNameLabel)
  600. return &PodPVCVolumeResult{
  601. UID: uid,
  602. Cluster: cluster,
  603. PVCUID: pvcUID,
  604. PodVolumeName: podVolumeName,
  605. }
  606. }
  607. type OwnerResult struct {
  608. UID string
  609. Cluster string
  610. OwnerUID string
  611. OwnerKind string
  612. Controller bool
  613. }
  614. func DecodeOwnerResult(result *QueryResult) *OwnerResult {
  615. uid, _ := result.GetString(UIDLabel)
  616. cluster, _ := result.GetCluster()
  617. ownerUID, _ := result.GetString(OwnerUIDLabel)
  618. ownerKind, _ := result.GetString(OwnerKindLabel)
  619. controller, _ := result.GetBool(ControllerLabel)
  620. return &OwnerResult{
  621. UID: uid,
  622. Cluster: cluster,
  623. OwnerUID: ownerUID,
  624. OwnerKind: ownerKind,
  625. Controller: controller,
  626. }
  627. }
  628. type PodsResult struct {
  629. UID string
  630. Cluster string
  631. Namespace string
  632. Pod string
  633. Data []*util.Vector
  634. }
  635. func DecodePodsResult(result *QueryResult) *PodsResult {
  636. uid, _ := result.GetString(UIDLabel)
  637. cluster, _ := result.GetCluster()
  638. namespace, _ := result.GetNamespace()
  639. pod, _ := result.GetPod()
  640. return &PodsResult{
  641. UID: uid,
  642. Cluster: cluster,
  643. Namespace: namespace,
  644. Pod: pod,
  645. Data: result.Values,
  646. }
  647. }
  648. type ContainerMetricResult struct {
  649. UID string
  650. Cluster string
  651. Node string
  652. Instance string
  653. Namespace string
  654. Pod string
  655. Container string
  656. Data []*util.Vector
  657. }
  658. func DecodeContainerMetricResult(result *QueryResult) *ContainerMetricResult {
  659. uid, _ := result.GetString(UIDLabel)
  660. cluster, _ := result.GetCluster()
  661. node, _ := result.GetNode()
  662. instance, _ := result.GetInstance()
  663. // NOTE: this addresses cases where the node isn't set, but the instance is,
  664. // NOTE: we just inherit the instance as the node
  665. if node == "" {
  666. node = instance
  667. }
  668. namespace, _ := result.GetNamespace()
  669. pod, _ := result.GetPod()
  670. container, _ := result.GetContainer()
  671. return &ContainerMetricResult{
  672. UID: uid,
  673. Cluster: cluster,
  674. Node: node,
  675. Instance: instance,
  676. Namespace: namespace,
  677. Pod: pod,
  678. Container: container,
  679. Data: result.Values,
  680. }
  681. }
  682. type RAMBytesAllocatedResult = ContainerMetricResult
  683. func DecodeRAMBytesAllocatedResult(result *QueryResult) *RAMBytesAllocatedResult {
  684. return DecodeContainerMetricResult(result)
  685. }
  686. type RAMRequestsResult = ContainerMetricResult
  687. func DecodeRAMRequestsResult(result *QueryResult) *RAMRequestsResult {
  688. return DecodeContainerMetricResult(result)
  689. }
  690. type RAMLimitsResult = ContainerMetricResult
  691. func DecodeRAMLimitsResult(result *QueryResult) *RAMLimitsResult {
  692. return DecodeContainerMetricResult(result)
  693. }
  694. type RAMUsageAvgResult = ContainerMetricResult
  695. func DecodeRAMUsageAvgResult(result *QueryResult) *RAMUsageAvgResult {
  696. return DecodeContainerMetricResult(result)
  697. }
  698. type RAMUsageMaxResult = ContainerMetricResult
  699. func DecodeRAMUsageMaxResult(result *QueryResult) *RAMUsageMaxResult {
  700. return DecodeContainerMetricResult(result)
  701. }
  702. type NodeRAMPricePerGiBHrResult struct {
  703. UID string
  704. Cluster string
  705. Node string
  706. InstanceType string
  707. ProviderID string
  708. Data []*util.Vector
  709. }
  710. func DecodeNodeRAMPricePerGiBHrResult(result *QueryResult) *NodeRAMPricePerGiBHrResult {
  711. uid, _ := result.GetString(UIDLabel)
  712. cluster, _ := result.GetCluster()
  713. node, _ := result.GetNode()
  714. instanceType, _ := result.GetInstanceType()
  715. providerId, _ := result.GetProviderID()
  716. return &NodeRAMPricePerGiBHrResult{
  717. UID: uid,
  718. Cluster: cluster,
  719. Node: node,
  720. InstanceType: instanceType,
  721. ProviderID: providerId,
  722. Data: result.Values,
  723. }
  724. }
  725. type CPUCoresAllocatedResult = ContainerMetricResult
  726. func DecodeCPUCoresAllocatedResult(result *QueryResult) *CPUCoresAllocatedResult {
  727. return DecodeContainerMetricResult(result)
  728. }
  729. type CPURequestsResult = ContainerMetricResult
  730. func DecodeCPURequestsResult(result *QueryResult) *CPURequestsResult {
  731. return DecodeContainerMetricResult(result)
  732. }
  733. type CPULimitsResult = ContainerMetricResult
  734. func DecodeCPULimitsResult(result *QueryResult) *CPULimitsResult {
  735. return DecodeContainerMetricResult(result)
  736. }
  737. type CPUUsageAvgResult = ContainerMetricResult
  738. func DecodeCPUUsageAvgResult(result *QueryResult) *CPUUsageAvgResult {
  739. return DecodeContainerMetricResult(result)
  740. }
  741. type CPUUsageMaxResult = ContainerMetricResult
  742. func DecodeCPUUsageMaxResult(result *QueryResult) *CPUUsageMaxResult {
  743. return DecodeContainerMetricResult(result)
  744. }
  745. type NodeCPUPricePerHrResult struct {
  746. UID string
  747. Cluster string
  748. Node string
  749. InstanceType string
  750. ProviderID string
  751. Data []*util.Vector
  752. }
  753. func DecodeNodeCPUPricePerHrResult(result *QueryResult) *NodeCPUPricePerHrResult {
  754. uid, _ := result.GetString(UIDLabel)
  755. cluster, _ := result.GetCluster()
  756. node, _ := result.GetNode()
  757. instanceType, _ := result.GetInstanceType()
  758. providerId, _ := result.GetProviderID()
  759. return &NodeCPUPricePerHrResult{
  760. UID: uid,
  761. Cluster: cluster,
  762. Node: node,
  763. InstanceType: instanceType,
  764. ProviderID: providerId,
  765. Data: result.Values,
  766. }
  767. }
  768. // type alias requested result to allocated result, as you can only request a full GPU
  769. type GPUsRequestedResult = GPUsAllocatedResult
  770. func DecodeGPUsRequestedResult(result *QueryResult) *GPUsRequestedResult {
  771. return DecodeGPUsAllocatedResult(result)
  772. }
  773. type GPUsAllocatedResult struct {
  774. UID string
  775. Cluster string
  776. Namespace string
  777. Pod string
  778. Container string
  779. Data []*util.Vector
  780. }
  781. func DecodeGPUsAllocatedResult(result *QueryResult) *GPUsAllocatedResult {
  782. uid, _ := result.GetString(UIDLabel)
  783. cluster, _ := result.GetCluster()
  784. namespace, _ := result.GetNamespace()
  785. pod, _ := result.GetPod()
  786. container, _ := result.GetContainer()
  787. return &GPUsAllocatedResult{
  788. UID: uid,
  789. Cluster: cluster,
  790. Namespace: namespace,
  791. Pod: pod,
  792. Container: container,
  793. Data: result.Values,
  794. }
  795. }
  796. type GPUsUsageAvgResult struct {
  797. UID string
  798. Cluster string
  799. Namespace string
  800. Pod string
  801. Container string
  802. Data []*util.Vector
  803. }
  804. func DecodeGPUsUsageAvgResult(result *QueryResult) *GPUsUsageAvgResult {
  805. uid, _ := result.GetString(PodUIDLabel)
  806. cluster, _ := result.GetCluster()
  807. namespace, _ := result.GetNamespace()
  808. pod, _ := result.GetPod()
  809. container, _ := result.GetContainer()
  810. return &GPUsUsageAvgResult{
  811. UID: uid,
  812. Cluster: cluster,
  813. Namespace: namespace,
  814. Pod: pod,
  815. Container: container,
  816. Data: result.Values,
  817. }
  818. }
  819. type GPUsUsageMaxResult struct {
  820. UID string
  821. Cluster string
  822. Namespace string
  823. Pod string
  824. Container string
  825. Data []*util.Vector
  826. }
  827. func DecodeGPUsUsageMaxResult(result *QueryResult) *GPUsUsageMaxResult {
  828. uid, _ := result.GetString(PodUIDLabel)
  829. cluster, _ := result.GetCluster()
  830. namespace, _ := result.GetNamespace()
  831. pod, _ := result.GetPod()
  832. container, _ := result.GetContainer()
  833. return &GPUsUsageMaxResult{
  834. UID: uid,
  835. Cluster: cluster,
  836. Namespace: namespace,
  837. Pod: pod,
  838. Container: container,
  839. Data: result.Values,
  840. }
  841. }
  842. type NodeGPUPricePerHrResult struct {
  843. UID string
  844. Cluster string
  845. Node string
  846. InstanceType string
  847. ProviderID string
  848. Data []*util.Vector
  849. }
  850. func DecodeNodeGPUPricePerHrResult(result *QueryResult) *NodeGPUPricePerHrResult {
  851. uid, _ := result.GetString(UIDLabel)
  852. cluster, _ := result.GetCluster()
  853. node, _ := result.GetNode()
  854. instanceType, _ := result.GetInstanceType()
  855. providerId, _ := result.GetProviderID()
  856. return &NodeGPUPricePerHrResult{
  857. UID: uid,
  858. Cluster: cluster,
  859. Node: node,
  860. InstanceType: instanceType,
  861. ProviderID: providerId,
  862. Data: result.Values,
  863. }
  864. }
  865. type GPUInfoResult struct {
  866. UID string
  867. Cluster string
  868. Namespace string
  869. Pod string
  870. Container string
  871. Device string
  872. ModelName string
  873. UUID string
  874. Data []*util.Vector
  875. }
  876. func DecodeGPUInfoResult(result *QueryResult) *GPUInfoResult {
  877. uid, _ := result.GetString(PodUIDLabel)
  878. cluster, _ := result.GetCluster()
  879. namespace, _ := result.GetNamespace()
  880. pod, _ := result.GetPod()
  881. container, _ := result.GetContainer()
  882. device, _ := result.GetString(DeviceLabel)
  883. modelName, _ := result.GetString(ModelNameLabel)
  884. uuid, _ := result.GetString(UUIDLabel)
  885. return &GPUInfoResult{
  886. UID: uid,
  887. Cluster: cluster,
  888. Namespace: namespace,
  889. Pod: pod,
  890. Container: container,
  891. Device: device,
  892. ModelName: modelName,
  893. UUID: uuid,
  894. Data: result.Values,
  895. }
  896. }
  897. type IsGPUSharedResult struct {
  898. UID string
  899. Cluster string
  900. Namespace string
  901. Pod string
  902. Container string
  903. Resource string
  904. Data []*util.Vector
  905. }
  906. func DecodeIsGPUSharedResult(result *QueryResult) *IsGPUSharedResult {
  907. uid, _ := result.GetString(UIDLabel)
  908. cluster, _ := result.GetCluster()
  909. namespace, _ := result.GetNamespace()
  910. pod, _ := result.GetPod()
  911. container, _ := result.GetContainer()
  912. resource, _ := result.GetString(ResourceLabel)
  913. return &IsGPUSharedResult{
  914. UID: uid,
  915. Cluster: cluster,
  916. Namespace: namespace,
  917. Pod: pod,
  918. Container: container,
  919. Resource: resource,
  920. Data: result.Values,
  921. }
  922. }
  923. type PodPVCAllocationResult struct {
  924. UID string
  925. Cluster string
  926. Namespace string
  927. Pod string
  928. PersistentVolume string
  929. PersistentVolumeClaim string
  930. Data []*util.Vector
  931. }
  932. func DecodePodPVCAllocationResult(result *QueryResult) *PodPVCAllocationResult {
  933. uid, _ := result.GetString(UIDLabel)
  934. cluster, _ := result.GetCluster()
  935. namespace, _ := result.GetNamespace()
  936. pod, _ := result.GetPod()
  937. pv, _ := result.GetString(PVLabel)
  938. pvc, _ := result.GetString(PVCLabel)
  939. return &PodPVCAllocationResult{
  940. UID: uid,
  941. Cluster: cluster,
  942. Namespace: namespace,
  943. Pod: pod,
  944. PersistentVolume: pv,
  945. PersistentVolumeClaim: pvc,
  946. Data: result.Values,
  947. }
  948. }
  949. type PVCBytesRequestedResult struct {
  950. UID string
  951. Cluster string
  952. Namespace string
  953. PersistentVolumeClaim string
  954. Data []*util.Vector
  955. }
  956. func DecodePVCBytesRequestedResult(result *QueryResult) *PVCBytesRequestedResult {
  957. uid, _ := result.GetString(UIDLabel)
  958. cluster, _ := result.GetCluster()
  959. namespace, _ := result.GetNamespace()
  960. pvc, _ := result.GetString(PVCLabel)
  961. return &PVCBytesRequestedResult{
  962. UID: uid,
  963. Cluster: cluster,
  964. Namespace: namespace,
  965. PersistentVolumeClaim: pvc,
  966. Data: result.Values,
  967. }
  968. }
  969. type PVCInfoResult struct {
  970. UID string
  971. Cluster string
  972. NamespaceUID string
  973. Namespace string
  974. VolumeName string
  975. PVUID string
  976. PersistentVolumeClaim string
  977. StorageClass string
  978. Data []*util.Vector
  979. }
  980. func DecodePVCInfoResult(result *QueryResult) *PVCInfoResult {
  981. uid, _ := result.GetString(UIDLabel)
  982. cluster, _ := result.GetCluster()
  983. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  984. namespace, _ := result.GetNamespace()
  985. pvUID, _ := result.GetString(PVUIDLabel)
  986. volumeName, _ := result.GetString(VolumeNameLabel)
  987. pvc, _ := result.GetString(PVCLabel)
  988. storageClass, _ := result.GetString(StorageClassLabel)
  989. return &PVCInfoResult{
  990. UID: uid,
  991. Cluster: cluster,
  992. NamespaceUID: namespaceUID,
  993. Namespace: namespace,
  994. PVUID: pvUID,
  995. VolumeName: volumeName,
  996. PersistentVolumeClaim: pvc,
  997. StorageClass: storageClass,
  998. Data: result.Values,
  999. }
  1000. }
  1001. type PVBytesResult struct {
  1002. UID string
  1003. Cluster string
  1004. PersistentVolume string
  1005. Value float64
  1006. }
  1007. func DecodePVBytesResult(result *QueryResult) *PVBytesResult {
  1008. uid, _ := result.GetString(UIDLabel)
  1009. cluster, _ := result.GetCluster()
  1010. pv, _ := result.GetString(PVLabel)
  1011. var value float64
  1012. if len(result.Values) > 0 {
  1013. value = result.Values[0].Value
  1014. } else {
  1015. log.Warnf("Error decoding PV bytes result for pv '%s': empty value returned", uid)
  1016. }
  1017. return &PVBytesResult{
  1018. UID: uid,
  1019. Cluster: cluster,
  1020. PersistentVolume: pv,
  1021. Value: value,
  1022. }
  1023. }
  1024. type PVPricePerGiBHourResult struct {
  1025. UID string
  1026. Cluster string
  1027. VolumeName string
  1028. PersistentVolume string
  1029. ProviderID string
  1030. Data []*util.Vector
  1031. }
  1032. func DecodePVPricePerGiBHourResult(result *QueryResult) *PVPricePerGiBHourResult {
  1033. uid, _ := result.GetString(UIDLabel)
  1034. cluster, _ := result.GetCluster()
  1035. volumeName, _ := result.GetString(VolumeNameLabel)
  1036. pv, _ := result.GetString(PVLabel)
  1037. providerId, _ := result.GetProviderID()
  1038. return &PVPricePerGiBHourResult{
  1039. UID: uid,
  1040. Cluster: cluster,
  1041. VolumeName: volumeName,
  1042. PersistentVolume: pv,
  1043. ProviderID: providerId,
  1044. Data: result.Values,
  1045. }
  1046. }
  1047. type PVInfoResult struct {
  1048. UID string
  1049. Cluster string
  1050. PersistentVolume string
  1051. StorageClass string
  1052. ProviderID string
  1053. CSIVolumeHandle string
  1054. Data []*util.Vector
  1055. }
  1056. func DecodePVInfoResult(result *QueryResult) *PVInfoResult {
  1057. uid, _ := result.GetString(UIDLabel)
  1058. cluster, _ := result.GetCluster()
  1059. storageClass, _ := result.GetString(StorageClassLabel)
  1060. providerId, _ := result.GetProviderID()
  1061. pv, _ := result.GetString(PVLabel)
  1062. csiVolumeHandle, _ := result.GetString(CSIVolumeHandleLabel)
  1063. return &PVInfoResult{
  1064. UID: uid,
  1065. Cluster: cluster,
  1066. PersistentVolume: pv,
  1067. StorageClass: storageClass,
  1068. ProviderID: providerId,
  1069. CSIVolumeHandle: csiVolumeHandle,
  1070. Data: result.Values,
  1071. }
  1072. }
  1073. type PodNetworkBytesResult struct {
  1074. UID string
  1075. Cluster string
  1076. Service string
  1077. Internet bool
  1078. SameRegion bool
  1079. SameZone bool
  1080. NatGateway bool
  1081. Value float64
  1082. }
  1083. func DecodePodNetworkBytesResult(result *QueryResult) *PodNetworkBytesResult {
  1084. uid, _ := result.GetString(UIDLabel)
  1085. cluster, _ := result.GetCluster()
  1086. service, _ := result.GetString(ServiceLabel)
  1087. internet, _ := result.GetBool(InternetLabel)
  1088. sameRegion, _ := result.GetBool(SameRegionLabel)
  1089. sameZone, _ := result.GetBool(SameZoneLabel)
  1090. natGateway, _ := result.GetBool(NatGatewayLabel)
  1091. var value float64
  1092. if len(result.Values) > 0 {
  1093. value = result.Values[0].Value
  1094. } else {
  1095. log.Warnf("Error decoding pod network bytes result for pod '%s': empty value returned", uid)
  1096. }
  1097. return &PodNetworkBytesResult{
  1098. UID: uid,
  1099. Cluster: cluster,
  1100. Service: service,
  1101. Internet: internet,
  1102. SameRegion: sameRegion,
  1103. SameZone: sameZone,
  1104. NatGateway: natGateway,
  1105. Value: value,
  1106. }
  1107. }
  1108. // Base type for network usage results
  1109. type NetworkGiBResult struct {
  1110. UID string
  1111. Cluster string
  1112. Namespace string
  1113. Pod string
  1114. Service string
  1115. Data []*util.Vector
  1116. }
  1117. func DecodeNetworkGiBResult(result *QueryResult) *NetworkGiBResult {
  1118. uid, _ := result.GetString(UIDLabel)
  1119. cluster, _ := result.GetCluster()
  1120. namespace, _ := result.GetNamespace()
  1121. pod, _ := result.GetPod()
  1122. service, _ := result.GetString(ServiceLabel)
  1123. return &NetworkGiBResult{
  1124. UID: uid,
  1125. Cluster: cluster,
  1126. Namespace: namespace,
  1127. Pod: pod,
  1128. Service: service,
  1129. Data: result.Values,
  1130. }
  1131. }
  1132. // Base type for network price results
  1133. type NetworkPricePerGiBResult struct {
  1134. UID string
  1135. Cluster string
  1136. Data []*util.Vector
  1137. }
  1138. func DecodeNetworkPricePerGiBResult(result *QueryResult) *NetworkPricePerGiBResult {
  1139. uid, _ := result.GetString(UIDLabel)
  1140. cluster, _ := result.GetCluster()
  1141. return &NetworkPricePerGiBResult{
  1142. UID: uid,
  1143. Cluster: cluster,
  1144. Data: result.Values,
  1145. }
  1146. }
  1147. // Type alias the specific network subclassification results AND price results
  1148. type NetZoneGiBResult = NetworkGiBResult
  1149. type NetZonePricePerGiBResult = NetworkPricePerGiBResult
  1150. type NetRegionGiBResult = NetworkGiBResult
  1151. type NetRegionPricePerGiBResult = NetworkPricePerGiBResult
  1152. type NetInternetGiBResult = NetworkGiBResult
  1153. type NetInternetPricePerGiBResult = NetworkPricePerGiBResult
  1154. type NetInternetServiceGiBResult = NetworkGiBResult
  1155. type NetNatGatewayPricePerGiBResult = NetworkPricePerGiBResult
  1156. type NetNatGatewayGiBResult = NetworkGiBResult
  1157. type NetZoneIngressGiBResult = NetworkGiBResult
  1158. type NetRegionIngressGiBResult = NetworkGiBResult
  1159. type NetInternetIngressGiBResult = NetworkGiBResult
  1160. type NetInternetServiceIngressGiBResult = NetworkGiBResult
  1161. type NetNatGatewayIngressGiBResult = NetworkGiBResult
  1162. func DecodeNetZoneGiBResult(result *QueryResult) *NetZoneGiBResult {
  1163. return DecodeNetworkGiBResult(result)
  1164. }
  1165. func DecodeNetZonePricePerGiBResult(result *QueryResult) *NetZonePricePerGiBResult {
  1166. return DecodeNetworkPricePerGiBResult(result)
  1167. }
  1168. func DecodeNetRegionGiBResult(result *QueryResult) *NetRegionGiBResult {
  1169. return DecodeNetworkGiBResult(result)
  1170. }
  1171. func DecodeNetRegionPricePerGiBResult(result *QueryResult) *NetRegionPricePerGiBResult {
  1172. return DecodeNetworkPricePerGiBResult(result)
  1173. }
  1174. func DecodeNetInternetGiBResult(result *QueryResult) *NetInternetGiBResult {
  1175. return DecodeNetworkGiBResult(result)
  1176. }
  1177. func DecodeNetInternetPricePerGiBResult(result *QueryResult) *NetInternetPricePerGiBResult {
  1178. return DecodeNetworkPricePerGiBResult(result)
  1179. }
  1180. func DecodeNetInternetServiceGiBResult(result *QueryResult) *NetInternetServiceGiBResult {
  1181. return DecodeNetworkGiBResult(result)
  1182. }
  1183. func DecodeNetNatGatewayPricePerGiBResult(result *QueryResult) *NetNatGatewayPricePerGiBResult {
  1184. return DecodeNetworkPricePerGiBResult(result)
  1185. }
  1186. func DecodeNetNatGatewayGiBResult(result *QueryResult) *NetNatGatewayGiBResult {
  1187. return DecodeNetworkGiBResult(result)
  1188. }
  1189. func DecodeNetZoneIngressGiBResult(result *QueryResult) *NetZoneIngressGiBResult {
  1190. return DecodeNetworkGiBResult(result)
  1191. }
  1192. func DecodeNetRegionIngressGiBResult(result *QueryResult) *NetRegionIngressGiBResult {
  1193. return DecodeNetworkGiBResult(result)
  1194. }
  1195. func DecodeNetInternetIngressGiBResult(result *QueryResult) *NetInternetIngressGiBResult {
  1196. return DecodeNetworkGiBResult(result)
  1197. }
  1198. func DecodeNetInternetServiceIngressGiBResult(result *QueryResult) *NetInternetServiceIngressGiBResult {
  1199. return DecodeNetworkGiBResult(result)
  1200. }
  1201. func DecodeNetNatGatewayIngressGiBResult(result *QueryResult) *NetNatGatewayIngressGiBResult {
  1202. return DecodeNetworkGiBResult(result)
  1203. }
  1204. type NetReceiveBytesResult struct {
  1205. UID string
  1206. Cluster string
  1207. Namespace string
  1208. Pod string
  1209. Container string
  1210. Data []*util.Vector
  1211. }
  1212. func DecodeNetReceiveBytesResult(result *QueryResult) *NetReceiveBytesResult {
  1213. uid, _ := result.GetString(UIDLabel)
  1214. cluster, _ := result.GetCluster()
  1215. namespace, _ := result.GetNamespace()
  1216. pod, _ := result.GetPod()
  1217. container, _ := result.GetContainer()
  1218. return &NetReceiveBytesResult{
  1219. UID: uid,
  1220. Cluster: cluster,
  1221. Namespace: namespace,
  1222. Pod: pod,
  1223. Container: container,
  1224. Data: result.Values,
  1225. }
  1226. }
  1227. type NetTransferBytesResult struct {
  1228. UID string
  1229. Cluster string
  1230. Namespace string
  1231. Pod string
  1232. Container string
  1233. Data []*util.Vector
  1234. }
  1235. func DecodeNetTransferBytesResult(result *QueryResult) *NetTransferBytesResult {
  1236. uid, _ := result.GetString(UIDLabel)
  1237. cluster, _ := result.GetCluster()
  1238. namespace, _ := result.GetNamespace()
  1239. pod, _ := result.GetPod()
  1240. container, _ := result.GetContainer()
  1241. return &NetTransferBytesResult{
  1242. UID: uid,
  1243. Cluster: cluster,
  1244. Namespace: namespace,
  1245. Pod: pod,
  1246. Container: container,
  1247. Data: result.Values,
  1248. }
  1249. }
  1250. type NamespaceAnnotationsResult struct {
  1251. UID string
  1252. Cluster string
  1253. Namespace string
  1254. Annotations map[string]string
  1255. Data []*util.Vector
  1256. }
  1257. func DecodeNamespaceAnnotationsResult(result *QueryResult) *NamespaceAnnotationsResult {
  1258. uid, _ := result.GetString(UIDLabel)
  1259. cluster, _ := result.GetCluster()
  1260. namespace, _ := result.GetNamespace()
  1261. annotations := result.GetAnnotations()
  1262. return &NamespaceAnnotationsResult{
  1263. UID: uid,
  1264. Cluster: cluster,
  1265. Namespace: namespace,
  1266. Annotations: annotations,
  1267. Data: result.Values,
  1268. }
  1269. }
  1270. type PodAnnotationsResult struct {
  1271. UID string
  1272. Cluster string
  1273. Namespace string
  1274. Pod string
  1275. Annotations map[string]string
  1276. Data []*util.Vector
  1277. }
  1278. func DecodePodAnnotationsResult(result *QueryResult) *PodAnnotationsResult {
  1279. uid, _ := result.GetString(UIDLabel)
  1280. cluster, _ := result.GetCluster()
  1281. namespace, _ := result.GetNamespace()
  1282. pod, _ := result.GetPod()
  1283. annotations := result.GetAnnotations()
  1284. return &PodAnnotationsResult{
  1285. UID: uid,
  1286. Cluster: cluster,
  1287. Namespace: namespace,
  1288. Pod: pod,
  1289. Annotations: annotations,
  1290. Data: result.Values,
  1291. }
  1292. }
  1293. type NodeLabelsResult struct {
  1294. UID string
  1295. Cluster string
  1296. Node string
  1297. Labels map[string]string
  1298. }
  1299. func DecodeNodeLabelsResult(result *QueryResult) *NodeLabelsResult {
  1300. uid, _ := result.GetString(UIDLabel)
  1301. cluster, _ := result.GetCluster()
  1302. node, _ := result.GetNode()
  1303. labels := result.GetLabels()
  1304. return &NodeLabelsResult{
  1305. UID: uid,
  1306. Cluster: cluster,
  1307. Node: node,
  1308. Labels: labels,
  1309. }
  1310. }
  1311. type NamespaceInfoResult struct {
  1312. UID string
  1313. Cluster string
  1314. Namespace string
  1315. }
  1316. func DecodeNamespaceInfoResult(result *QueryResult) *NamespaceInfoResult {
  1317. uid, _ := result.GetString(UIDLabel)
  1318. cluster, _ := result.GetCluster()
  1319. namespace, _ := result.GetNamespace()
  1320. return &NamespaceInfoResult{
  1321. UID: uid,
  1322. Cluster: cluster,
  1323. Namespace: namespace,
  1324. }
  1325. }
  1326. type NamespaceLabelsResult struct {
  1327. UID string
  1328. Cluster string
  1329. Namespace string
  1330. Labels map[string]string
  1331. Data []*util.Vector
  1332. }
  1333. func DecodeNamespaceLabelsResult(result *QueryResult) *NamespaceLabelsResult {
  1334. uid, _ := result.GetString(UIDLabel)
  1335. cluster, _ := result.GetCluster()
  1336. namespace, _ := result.GetNamespace()
  1337. labels := result.GetLabels()
  1338. return &NamespaceLabelsResult{
  1339. UID: uid,
  1340. Cluster: cluster,
  1341. Namespace: namespace,
  1342. Labels: labels,
  1343. Data: result.Values,
  1344. }
  1345. }
  1346. type PodLabelsResult struct {
  1347. UID string
  1348. Cluster string
  1349. Namespace string
  1350. Pod string
  1351. Labels map[string]string
  1352. Data []*util.Vector
  1353. }
  1354. func DecodePodLabelsResult(result *QueryResult) *PodLabelsResult {
  1355. uid, _ := result.GetString(UIDLabel)
  1356. cluster, _ := result.GetCluster()
  1357. namespace, _ := result.GetNamespace()
  1358. pod, _ := result.GetPod()
  1359. labels := result.GetLabels()
  1360. return &PodLabelsResult{
  1361. UID: uid,
  1362. Cluster: cluster,
  1363. Namespace: namespace,
  1364. Pod: pod,
  1365. Labels: labels,
  1366. Data: result.Values,
  1367. }
  1368. }
  1369. type ServiceLabelsResult struct {
  1370. UID string
  1371. Cluster string
  1372. Namespace string
  1373. Service string
  1374. Labels map[string]string
  1375. Data []*util.Vector
  1376. }
  1377. func DecodeServiceLabelsResult(result *QueryResult) *ServiceLabelsResult {
  1378. uid, _ := result.GetString(UIDLabel)
  1379. cluster, _ := result.GetCluster()
  1380. namespace, _ := result.GetNamespace()
  1381. service, _ := result.GetString(ServiceLabel)
  1382. labels := result.GetLabels()
  1383. return &ServiceLabelsResult{
  1384. UID: uid,
  1385. Cluster: cluster,
  1386. Namespace: namespace,
  1387. Service: service,
  1388. Labels: labels,
  1389. Data: result.Values,
  1390. }
  1391. }
  1392. type ServiceInfoResult struct {
  1393. UID string
  1394. Cluster string
  1395. NamespaceUID string
  1396. Service string
  1397. ServiceType string
  1398. }
  1399. func DecodeServiceInfoResult(result *QueryResult) *ServiceInfoResult {
  1400. uid, _ := result.GetString(UIDLabel)
  1401. cluster, _ := result.GetCluster()
  1402. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1403. service, _ := result.GetString(ServiceLabel)
  1404. serviceType, _ := result.GetString(ServiceTypeLabel)
  1405. return &ServiceInfoResult{
  1406. UID: uid,
  1407. Cluster: cluster,
  1408. NamespaceUID: namespaceUID,
  1409. Service: service,
  1410. ServiceType: serviceType,
  1411. }
  1412. }
  1413. type DeploymentInfoResult struct {
  1414. UID string
  1415. Cluster string
  1416. NamespaceUID string
  1417. Deployment string
  1418. }
  1419. func DecodeDeploymentInfoResult(result *QueryResult) *DeploymentInfoResult {
  1420. uid, _ := result.GetString(UIDLabel)
  1421. cluster, _ := result.GetCluster()
  1422. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1423. deployment, _ := result.GetString(DeploymentLabel)
  1424. return &DeploymentInfoResult{
  1425. UID: uid,
  1426. Cluster: cluster,
  1427. NamespaceUID: namespaceUID,
  1428. Deployment: deployment,
  1429. }
  1430. }
  1431. type DeploymentLabelsResult struct {
  1432. UID string
  1433. Cluster string
  1434. Namespace string
  1435. Deployment string
  1436. Labels map[string]string
  1437. Data []*util.Vector
  1438. }
  1439. func DecodeDeploymentLabelsResult(result *QueryResult) *DeploymentLabelsResult {
  1440. uid, _ := result.GetString(UIDLabel)
  1441. cluster, _ := result.GetCluster()
  1442. namespace, _ := result.GetNamespace()
  1443. deployment, _ := result.GetString(DeploymentLabel)
  1444. labels := result.GetLabels()
  1445. return &DeploymentLabelsResult{
  1446. UID: uid,
  1447. Cluster: cluster,
  1448. Namespace: namespace,
  1449. Deployment: deployment,
  1450. Labels: labels,
  1451. Data: result.Values,
  1452. }
  1453. }
  1454. type StatefulSetInfoResult struct {
  1455. UID string
  1456. Cluster string
  1457. NamespaceUID string
  1458. StatefulSet string
  1459. }
  1460. func DecodeStatefulSetInfoResult(result *QueryResult) *StatefulSetInfoResult {
  1461. uid, _ := result.GetString(UIDLabel)
  1462. cluster, _ := result.GetCluster()
  1463. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1464. statefulSet, _ := result.GetString(StatefulSetLabel)
  1465. return &StatefulSetInfoResult{
  1466. UID: uid,
  1467. Cluster: cluster,
  1468. NamespaceUID: namespaceUID,
  1469. StatefulSet: statefulSet,
  1470. }
  1471. }
  1472. type DaemonSetInfoResult struct {
  1473. UID string
  1474. Cluster string
  1475. NamespaceUID string
  1476. DaemonSet string
  1477. }
  1478. func DecodeDaemonSetInfoResult(result *QueryResult) *DaemonSetInfoResult {
  1479. uid, _ := result.GetString(UIDLabel)
  1480. cluster, _ := result.GetCluster()
  1481. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1482. daemonSet, _ := result.GetString(DaemonSetLabel)
  1483. return &DaemonSetInfoResult{
  1484. UID: uid,
  1485. Cluster: cluster,
  1486. NamespaceUID: namespaceUID,
  1487. DaemonSet: daemonSet,
  1488. }
  1489. }
  1490. type JobInfoResult struct {
  1491. UID string
  1492. Cluster string
  1493. NamespaceUID string
  1494. Job string
  1495. }
  1496. func DecodeJobInfoResult(result *QueryResult) *JobInfoResult {
  1497. uid, _ := result.GetString(UIDLabel)
  1498. cluster, _ := result.GetCluster()
  1499. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1500. job, _ := result.GetString(JobLabel)
  1501. return &JobInfoResult{
  1502. UID: uid,
  1503. Cluster: cluster,
  1504. NamespaceUID: namespaceUID,
  1505. Job: job,
  1506. }
  1507. }
  1508. type CronJobInfoResult struct {
  1509. UID string
  1510. Cluster string
  1511. NamespaceUID string
  1512. CronJob string
  1513. }
  1514. func DecodeCronJobInfoResult(result *QueryResult) *CronJobInfoResult {
  1515. uid, _ := result.GetString(UIDLabel)
  1516. cluster, _ := result.GetCluster()
  1517. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1518. cronJob, _ := result.GetString(CronJobLabel)
  1519. return &CronJobInfoResult{
  1520. UID: uid,
  1521. Cluster: cluster,
  1522. NamespaceUID: namespaceUID,
  1523. CronJob: cronJob,
  1524. }
  1525. }
  1526. type ReplicaSetInfoResult struct {
  1527. UID string
  1528. Cluster string
  1529. NamespaceUID string
  1530. ReplicaSet string
  1531. }
  1532. func DecodeReplicaSetInfoResult(result *QueryResult) *ReplicaSetInfoResult {
  1533. uid, _ := result.GetString(UIDLabel)
  1534. cluster, _ := result.GetCluster()
  1535. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1536. replicaSet, _ := result.GetString(ReplicaSetLabel)
  1537. return &ReplicaSetInfoResult{
  1538. UID: uid,
  1539. Cluster: cluster,
  1540. NamespaceUID: namespaceUID,
  1541. ReplicaSet: replicaSet,
  1542. }
  1543. }
  1544. type StatefulSetLabelsResult struct {
  1545. UID string
  1546. Cluster string
  1547. Namespace string
  1548. StatefulSet string
  1549. Labels map[string]string
  1550. Data []*util.Vector
  1551. }
  1552. func DecodeStatefulSetLabelsResult(result *QueryResult) *StatefulSetLabelsResult {
  1553. uid, _ := result.GetString(UIDLabel)
  1554. cluster, _ := result.GetCluster()
  1555. namespace, _ := result.GetNamespace()
  1556. statefulSet, _ := result.GetString(StatefulSetLabel)
  1557. labels := result.GetLabels()
  1558. return &StatefulSetLabelsResult{
  1559. UID: uid,
  1560. Cluster: cluster,
  1561. Namespace: namespace,
  1562. StatefulSet: statefulSet,
  1563. Labels: labels,
  1564. Data: result.Values,
  1565. }
  1566. }
  1567. type PodsWithDaemonSetOwnerResult struct {
  1568. UID string
  1569. Cluster string
  1570. Namespace string
  1571. Pod string
  1572. DaemonSet string
  1573. }
  1574. func DecodePodsWithDaemonSetOwnerResult(result *QueryResult) *PodsWithDaemonSetOwnerResult {
  1575. uid, _ := result.GetString(UIDLabel)
  1576. cluster, _ := result.GetCluster()
  1577. namespace, _ := result.GetNamespace()
  1578. pod, _ := result.GetPod()
  1579. daemonSet, _ := result.GetString(OwnerNameLabel)
  1580. return &PodsWithDaemonSetOwnerResult{
  1581. UID: uid,
  1582. Cluster: cluster,
  1583. Namespace: namespace,
  1584. Pod: pod,
  1585. DaemonSet: daemonSet,
  1586. }
  1587. }
  1588. type PodsWithJobOwnerResult struct {
  1589. UID string
  1590. Cluster string
  1591. Namespace string
  1592. Pod string
  1593. Job string
  1594. }
  1595. func DecodePodsWithJobOwnerResult(result *QueryResult) *PodsWithJobOwnerResult {
  1596. uid, _ := result.GetString(UIDLabel)
  1597. cluster, _ := result.GetCluster()
  1598. namespace, _ := result.GetNamespace()
  1599. pod, _ := result.GetPod()
  1600. job, _ := result.GetString(OwnerNameLabel)
  1601. return &PodsWithJobOwnerResult{
  1602. UID: uid,
  1603. Cluster: cluster,
  1604. Namespace: namespace,
  1605. Pod: pod,
  1606. Job: job,
  1607. }
  1608. }
  1609. type PodsWithReplicaSetOwnerResult struct {
  1610. UID string
  1611. Cluster string
  1612. Namespace string
  1613. Pod string
  1614. ReplicaSet string
  1615. Data []*util.Vector
  1616. }
  1617. func DecodePodsWithReplicaSetOwnerResult(result *QueryResult) *PodsWithReplicaSetOwnerResult {
  1618. uid, _ := result.GetString(UIDLabel)
  1619. cluster, _ := result.GetCluster()
  1620. namespace, _ := result.GetNamespace()
  1621. replicaSet, _ := result.GetString(OwnerNameLabel)
  1622. pod, _ := result.GetPod()
  1623. return &PodsWithReplicaSetOwnerResult{
  1624. UID: uid,
  1625. Cluster: cluster,
  1626. Namespace: namespace,
  1627. Pod: pod,
  1628. ReplicaSet: replicaSet,
  1629. Data: result.Values,
  1630. }
  1631. }
  1632. type ReplicaSetsWithoutOwnersResult struct {
  1633. UID string
  1634. Cluster string
  1635. Namespace string
  1636. ReplicaSet string
  1637. Data []*util.Vector
  1638. }
  1639. func DecodeReplicaSetsWithoutOwnersResult(result *QueryResult) *ReplicaSetsWithoutOwnersResult {
  1640. uid, _ := result.GetString(UIDLabel)
  1641. return &ReplicaSetsWithoutOwnersResult{
  1642. UID: uid,
  1643. Data: result.Values,
  1644. }
  1645. }
  1646. type ReplicaSetsWithRolloutResult struct {
  1647. UID string
  1648. Cluster string
  1649. Namespace string
  1650. ReplicaSet string
  1651. OwnerName string
  1652. OwnerKind string
  1653. Data []*util.Vector
  1654. }
  1655. func DecodeReplicaSetsWithRolloutResult(result *QueryResult) *ReplicaSetsWithRolloutResult {
  1656. uid, _ := result.GetString(UIDLabel)
  1657. cluster, _ := result.GetCluster()
  1658. namespace, _ := result.GetNamespace()
  1659. replicaSet, _ := result.GetString(ReplicaSetLabel)
  1660. ownerName, _ := result.GetString(OwnerNameLabel)
  1661. ownerKind, _ := result.GetString(OwnerKindLabel)
  1662. return &ReplicaSetsWithRolloutResult{
  1663. UID: uid,
  1664. Cluster: cluster,
  1665. Namespace: namespace,
  1666. ReplicaSet: replicaSet,
  1667. OwnerName: ownerName,
  1668. OwnerKind: ownerKind,
  1669. Data: result.Values,
  1670. }
  1671. }
  1672. type ResourceQuotaInfoResult struct {
  1673. UID string
  1674. NamespaceUID string
  1675. ResourceQuota string
  1676. }
  1677. func DecodeResourceQuotaInfoResult(result *QueryResult) *ResourceQuotaInfoResult {
  1678. uid, _ := result.GetString(UIDLabel)
  1679. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1680. resourceQuota, _ := result.GetString(ResourceQuotaLabel)
  1681. return &ResourceQuotaInfoResult{
  1682. UID: uid,
  1683. NamespaceUID: namespaceUID,
  1684. ResourceQuota: resourceQuota,
  1685. }
  1686. }
  1687. type ResourceResult struct {
  1688. UID string
  1689. Resource string
  1690. Unit string
  1691. Value float64
  1692. }
  1693. func DecodeResourceResult(result *QueryResult) *ResourceResult {
  1694. uid, _ := result.GetString(UIDLabel)
  1695. resource, _ := result.GetString(ResourceLabel)
  1696. unit, _ := result.GetString(UnitLabel)
  1697. var value float64
  1698. if len(result.Values) > 0 {
  1699. value = result.Values[0].Value
  1700. } else {
  1701. log.Warnf("Error decoding resource for uid '%s': empty value returned", uid)
  1702. }
  1703. return &ResourceResult{
  1704. UID: uid,
  1705. Resource: resource,
  1706. Unit: unit,
  1707. Value: value,
  1708. }
  1709. }
  1710. // DCGM needs specialized results because it uses UUID instead of the uid label that we use.
  1711. type DCGMDeviceInfoResult struct {
  1712. UUID string
  1713. Device string
  1714. ModelName string
  1715. HostName string
  1716. }
  1717. func DecodeDCGMDeviceInfoResult(result *QueryResult) *DCGMDeviceInfoResult {
  1718. uuid, _ := result.GetString(UUIDLabel)
  1719. device, _ := result.GetString(DeviceLabel)
  1720. modelName, _ := result.GetString(ModelNameLabel)
  1721. hostName, _ := result.GetString(HostNameLabel)
  1722. return &DCGMDeviceInfoResult{
  1723. UUID: uuid,
  1724. Device: device,
  1725. ModelName: modelName,
  1726. HostName: hostName,
  1727. }
  1728. }
  1729. type DCGMDeviceUptimeResult struct {
  1730. UUID string
  1731. First time.Time
  1732. Last time.Time
  1733. }
  1734. func (res *DCGMDeviceUptimeResult) GetStartEnd(windowStart, windowEnd time.Time, resolution time.Duration) (time.Time, time.Time) {
  1735. return getStartEnd(res.First, res.Last, windowStart, windowEnd, resolution)
  1736. }
  1737. func getStartEnd(first, last, windowStart, windowEnd time.Time, resolution time.Duration) (time.Time, time.Time) {
  1738. // The only corner-case here is what to do if you only get one timestamp.
  1739. // This dilemma still requires the use of the resolution, and can be
  1740. // clamped using the window. In this case, we want to honor the existence
  1741. // of the pod by giving "one resolution" worth of duration, half on each
  1742. // side of the given timestamp.
  1743. if first.Equal(last) {
  1744. first = first.Add(-1 * resolution / time.Duration(2))
  1745. last = last.Add(resolution / time.Duration(2))
  1746. }
  1747. if first.Before(windowStart) {
  1748. first = windowStart
  1749. }
  1750. if last.After(windowEnd) {
  1751. last = windowEnd
  1752. }
  1753. // prevent end times in the future
  1754. now := time.Now().UTC()
  1755. if last.After(now) {
  1756. last = now
  1757. }
  1758. return first, last
  1759. }
  1760. func DecodeDCGMDeviceUptimeResult(result *QueryResult) *DCGMDeviceUptimeResult {
  1761. uuid, _ := result.GetString(UUIDLabel)
  1762. first := time.Unix(int64(result.Values[0].Timestamp), 0).UTC()
  1763. last := time.Unix(int64(result.Values[len(result.Values)-1].Timestamp), 0).UTC()
  1764. return &DCGMDeviceUptimeResult{
  1765. UUID: uuid,
  1766. First: first,
  1767. Last: last,
  1768. }
  1769. }
  1770. type DCGMDeviceContainerUsageResult struct {
  1771. UUID string
  1772. PodUID string
  1773. Container string
  1774. Value float64
  1775. }
  1776. func DecodeDCGMDeviceContainerUsageResult(result *QueryResult) *DCGMDeviceContainerUsageResult {
  1777. uuid, _ := result.GetString(UUIDLabel)
  1778. podUID, _ := result.GetString(PodUIDLabel)
  1779. container, _ := result.GetString(ContainerLabel)
  1780. var value float64
  1781. if len(result.Values) > 0 {
  1782. value = result.Values[0].Value
  1783. } else {
  1784. log.Warnf("Error decoding DCGM Device Container Udage Result for device '%s': empty value returned", uuid)
  1785. }
  1786. return &DCGMDeviceContainerUsageResult{
  1787. UUID: uuid,
  1788. PodUID: podUID,
  1789. Container: container,
  1790. Value: value,
  1791. }
  1792. }
  1793. func DecodeAll[T any](results []*QueryResult, decode ResultDecoder[T]) []*T {
  1794. decoded := make([]*T, 0, len(results))
  1795. for _, result := range results {
  1796. decoded = append(decoded, decode(result))
  1797. }
  1798. return decoded
  1799. }