decoders.go 51 KB

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