decoders.go 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097
  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. controllerStr, _ := result.GetString(ControllerLabel)
  605. controller := false
  606. if controllerStr == "true" {
  607. controller = true
  608. }
  609. return &OwnerResult{
  610. UID: uid,
  611. Cluster: cluster,
  612. OwnerUID: ownerUID,
  613. OwnerKind: ownerKind,
  614. Controller: controller,
  615. }
  616. }
  617. type PodsResult struct {
  618. UID string
  619. Cluster string
  620. Namespace string
  621. Pod string
  622. Data []*util.Vector
  623. }
  624. func DecodePodsResult(result *QueryResult) *PodsResult {
  625. uid, _ := result.GetString(UIDLabel)
  626. cluster, _ := result.GetCluster()
  627. namespace, _ := result.GetNamespace()
  628. pod, _ := result.GetPod()
  629. return &PodsResult{
  630. UID: uid,
  631. Cluster: cluster,
  632. Namespace: namespace,
  633. Pod: pod,
  634. Data: result.Values,
  635. }
  636. }
  637. type ContainerMetricResult struct {
  638. UID string
  639. Cluster string
  640. Node string
  641. Instance string
  642. Namespace string
  643. Pod string
  644. Container string
  645. Data []*util.Vector
  646. }
  647. func DecodeContainerMetricResult(result *QueryResult) *ContainerMetricResult {
  648. uid, _ := result.GetString(UIDLabel)
  649. cluster, _ := result.GetCluster()
  650. node, _ := result.GetNode()
  651. instance, _ := result.GetInstance()
  652. // NOTE: this addresses cases where the node isn't set, but the instance is,
  653. // NOTE: we just inherit the instance as the node
  654. if node == "" {
  655. node = instance
  656. }
  657. namespace, _ := result.GetNamespace()
  658. pod, _ := result.GetPod()
  659. container, _ := result.GetContainer()
  660. return &ContainerMetricResult{
  661. UID: uid,
  662. Cluster: cluster,
  663. Node: node,
  664. Instance: instance,
  665. Namespace: namespace,
  666. Pod: pod,
  667. Container: container,
  668. Data: result.Values,
  669. }
  670. }
  671. type RAMBytesAllocatedResult = ContainerMetricResult
  672. func DecodeRAMBytesAllocatedResult(result *QueryResult) *RAMBytesAllocatedResult {
  673. return DecodeContainerMetricResult(result)
  674. }
  675. type RAMRequestsResult = ContainerMetricResult
  676. func DecodeRAMRequestsResult(result *QueryResult) *RAMRequestsResult {
  677. return DecodeContainerMetricResult(result)
  678. }
  679. type RAMLimitsResult = ContainerMetricResult
  680. func DecodeRAMLimitsResult(result *QueryResult) *RAMLimitsResult {
  681. return DecodeContainerMetricResult(result)
  682. }
  683. type RAMUsageAvgResult = ContainerMetricResult
  684. func DecodeRAMUsageAvgResult(result *QueryResult) *RAMUsageAvgResult {
  685. return DecodeContainerMetricResult(result)
  686. }
  687. type RAMUsageMaxResult = ContainerMetricResult
  688. func DecodeRAMUsageMaxResult(result *QueryResult) *RAMUsageMaxResult {
  689. return DecodeContainerMetricResult(result)
  690. }
  691. type NodeRAMPricePerGiBHrResult struct {
  692. UID string
  693. Cluster string
  694. Node string
  695. InstanceType string
  696. ProviderID string
  697. Data []*util.Vector
  698. }
  699. func DecodeNodeRAMPricePerGiBHrResult(result *QueryResult) *NodeRAMPricePerGiBHrResult {
  700. uid, _ := result.GetString(UIDLabel)
  701. cluster, _ := result.GetCluster()
  702. node, _ := result.GetNode()
  703. instanceType, _ := result.GetInstanceType()
  704. providerId, _ := result.GetProviderID()
  705. return &NodeRAMPricePerGiBHrResult{
  706. UID: uid,
  707. Cluster: cluster,
  708. Node: node,
  709. InstanceType: instanceType,
  710. ProviderID: providerId,
  711. Data: result.Values,
  712. }
  713. }
  714. type CPUCoresAllocatedResult = ContainerMetricResult
  715. func DecodeCPUCoresAllocatedResult(result *QueryResult) *CPUCoresAllocatedResult {
  716. return DecodeContainerMetricResult(result)
  717. }
  718. type CPURequestsResult = ContainerMetricResult
  719. func DecodeCPURequestsResult(result *QueryResult) *CPURequestsResult {
  720. return DecodeContainerMetricResult(result)
  721. }
  722. type CPULimitsResult = ContainerMetricResult
  723. func DecodeCPULimitsResult(result *QueryResult) *CPULimitsResult {
  724. return DecodeContainerMetricResult(result)
  725. }
  726. type CPUUsageAvgResult = ContainerMetricResult
  727. func DecodeCPUUsageAvgResult(result *QueryResult) *CPUUsageAvgResult {
  728. return DecodeContainerMetricResult(result)
  729. }
  730. type CPUUsageMaxResult = ContainerMetricResult
  731. func DecodeCPUUsageMaxResult(result *QueryResult) *CPUUsageMaxResult {
  732. return DecodeContainerMetricResult(result)
  733. }
  734. type NodeCPUPricePerHrResult struct {
  735. UID string
  736. Cluster string
  737. Node string
  738. InstanceType string
  739. ProviderID string
  740. Data []*util.Vector
  741. }
  742. func DecodeNodeCPUPricePerHrResult(result *QueryResult) *NodeCPUPricePerHrResult {
  743. uid, _ := result.GetString(UIDLabel)
  744. cluster, _ := result.GetCluster()
  745. node, _ := result.GetNode()
  746. instanceType, _ := result.GetInstanceType()
  747. providerId, _ := result.GetProviderID()
  748. return &NodeCPUPricePerHrResult{
  749. UID: uid,
  750. Cluster: cluster,
  751. Node: node,
  752. InstanceType: instanceType,
  753. ProviderID: providerId,
  754. Data: result.Values,
  755. }
  756. }
  757. // type alias requested result to allocated result, as you can only request a full GPU
  758. type GPUsRequestedResult = GPUsAllocatedResult
  759. func DecodeGPUsRequestedResult(result *QueryResult) *GPUsRequestedResult {
  760. return DecodeGPUsAllocatedResult(result)
  761. }
  762. type GPUsAllocatedResult struct {
  763. UID string
  764. Cluster string
  765. Namespace string
  766. Pod string
  767. Container string
  768. Data []*util.Vector
  769. }
  770. func DecodeGPUsAllocatedResult(result *QueryResult) *GPUsAllocatedResult {
  771. uid, _ := result.GetString(UIDLabel)
  772. cluster, _ := result.GetCluster()
  773. namespace, _ := result.GetNamespace()
  774. pod, _ := result.GetPod()
  775. container, _ := result.GetContainer()
  776. return &GPUsAllocatedResult{
  777. UID: uid,
  778. Cluster: cluster,
  779. Namespace: namespace,
  780. Pod: pod,
  781. Container: container,
  782. Data: result.Values,
  783. }
  784. }
  785. type GPUsUsageAvgResult struct {
  786. UID string
  787. Cluster string
  788. Namespace string
  789. Pod string
  790. Container string
  791. Data []*util.Vector
  792. }
  793. func DecodeGPUsUsageAvgResult(result *QueryResult) *GPUsUsageAvgResult {
  794. uid, _ := result.GetString(PodUIDLabel)
  795. cluster, _ := result.GetCluster()
  796. namespace, _ := result.GetNamespace()
  797. pod, _ := result.GetPod()
  798. container, _ := result.GetContainer()
  799. return &GPUsUsageAvgResult{
  800. UID: uid,
  801. Cluster: cluster,
  802. Namespace: namespace,
  803. Pod: pod,
  804. Container: container,
  805. Data: result.Values,
  806. }
  807. }
  808. type GPUsUsageMaxResult struct {
  809. UID string
  810. Cluster string
  811. Namespace string
  812. Pod string
  813. Container string
  814. Data []*util.Vector
  815. }
  816. func DecodeGPUsUsageMaxResult(result *QueryResult) *GPUsUsageMaxResult {
  817. uid, _ := result.GetString(PodUIDLabel)
  818. cluster, _ := result.GetCluster()
  819. namespace, _ := result.GetNamespace()
  820. pod, _ := result.GetPod()
  821. container, _ := result.GetContainer()
  822. return &GPUsUsageMaxResult{
  823. UID: uid,
  824. Cluster: cluster,
  825. Namespace: namespace,
  826. Pod: pod,
  827. Container: container,
  828. Data: result.Values,
  829. }
  830. }
  831. type NodeGPUPricePerHrResult struct {
  832. UID string
  833. Cluster string
  834. Node string
  835. InstanceType string
  836. ProviderID string
  837. Data []*util.Vector
  838. }
  839. func DecodeNodeGPUPricePerHrResult(result *QueryResult) *NodeGPUPricePerHrResult {
  840. uid, _ := result.GetString(UIDLabel)
  841. cluster, _ := result.GetCluster()
  842. node, _ := result.GetNode()
  843. instanceType, _ := result.GetInstanceType()
  844. providerId, _ := result.GetProviderID()
  845. return &NodeGPUPricePerHrResult{
  846. UID: uid,
  847. Cluster: cluster,
  848. Node: node,
  849. InstanceType: instanceType,
  850. ProviderID: providerId,
  851. Data: result.Values,
  852. }
  853. }
  854. type GPUInfoResult struct {
  855. UID string
  856. Cluster string
  857. Namespace string
  858. Pod string
  859. Container string
  860. Device string
  861. ModelName string
  862. UUID string
  863. Data []*util.Vector
  864. }
  865. func DecodeGPUInfoResult(result *QueryResult) *GPUInfoResult {
  866. uid, _ := result.GetString(PodUIDLabel)
  867. cluster, _ := result.GetCluster()
  868. namespace, _ := result.GetNamespace()
  869. pod, _ := result.GetPod()
  870. container, _ := result.GetContainer()
  871. device, _ := result.GetString(DeviceLabel)
  872. modelName, _ := result.GetString(ModelNameLabel)
  873. uuid, _ := result.GetString(UUIDLabel)
  874. return &GPUInfoResult{
  875. UID: uid,
  876. Cluster: cluster,
  877. Namespace: namespace,
  878. Pod: pod,
  879. Container: container,
  880. Device: device,
  881. ModelName: modelName,
  882. UUID: uuid,
  883. Data: result.Values,
  884. }
  885. }
  886. type IsGPUSharedResult struct {
  887. UID string
  888. Cluster string
  889. Namespace string
  890. Pod string
  891. Container string
  892. Resource string
  893. Data []*util.Vector
  894. }
  895. func DecodeIsGPUSharedResult(result *QueryResult) *IsGPUSharedResult {
  896. uid, _ := result.GetString(UIDLabel)
  897. cluster, _ := result.GetCluster()
  898. namespace, _ := result.GetNamespace()
  899. pod, _ := result.GetPod()
  900. container, _ := result.GetContainer()
  901. resource, _ := result.GetString(ResourceLabel)
  902. return &IsGPUSharedResult{
  903. UID: uid,
  904. Cluster: cluster,
  905. Namespace: namespace,
  906. Pod: pod,
  907. Container: container,
  908. Resource: resource,
  909. Data: result.Values,
  910. }
  911. }
  912. type PodPVCAllocationResult struct {
  913. UID string
  914. Cluster string
  915. Namespace string
  916. Pod string
  917. PersistentVolume string
  918. PersistentVolumeClaim string
  919. Data []*util.Vector
  920. }
  921. func DecodePodPVCAllocationResult(result *QueryResult) *PodPVCAllocationResult {
  922. uid, _ := result.GetString(UIDLabel)
  923. cluster, _ := result.GetCluster()
  924. namespace, _ := result.GetNamespace()
  925. pod, _ := result.GetPod()
  926. pv, _ := result.GetString(PVLabel)
  927. pvc, _ := result.GetString(PVCLabel)
  928. return &PodPVCAllocationResult{
  929. UID: uid,
  930. Cluster: cluster,
  931. Namespace: namespace,
  932. Pod: pod,
  933. PersistentVolume: pv,
  934. PersistentVolumeClaim: pvc,
  935. Data: result.Values,
  936. }
  937. }
  938. type PVCBytesRequestedResult struct {
  939. UID string
  940. Cluster string
  941. Namespace string
  942. PersistentVolumeClaim string
  943. Data []*util.Vector
  944. }
  945. func DecodePVCBytesRequestedResult(result *QueryResult) *PVCBytesRequestedResult {
  946. uid, _ := result.GetString(UIDLabel)
  947. cluster, _ := result.GetCluster()
  948. namespace, _ := result.GetNamespace()
  949. pvc, _ := result.GetString(PVCLabel)
  950. return &PVCBytesRequestedResult{
  951. UID: uid,
  952. Cluster: cluster,
  953. Namespace: namespace,
  954. PersistentVolumeClaim: pvc,
  955. Data: result.Values,
  956. }
  957. }
  958. type PVCInfoResult struct {
  959. UID string
  960. Cluster string
  961. NamespaceUID string
  962. Namespace string
  963. VolumeName string
  964. PVUID string
  965. PersistentVolumeClaim string
  966. StorageClass string
  967. Data []*util.Vector
  968. }
  969. func DecodePVCInfoResult(result *QueryResult) *PVCInfoResult {
  970. uid, _ := result.GetString(UIDLabel)
  971. cluster, _ := result.GetCluster()
  972. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  973. namespace, _ := result.GetNamespace()
  974. pvUID, _ := result.GetString(PVUIDLabel)
  975. volumeName, _ := result.GetString(VolumeNameLabel)
  976. pvc, _ := result.GetString(PVCLabel)
  977. storageClass, _ := result.GetString(StorageClassLabel)
  978. return &PVCInfoResult{
  979. UID: uid,
  980. Cluster: cluster,
  981. NamespaceUID: namespaceUID,
  982. Namespace: namespace,
  983. PVUID: pvUID,
  984. VolumeName: volumeName,
  985. PersistentVolumeClaim: pvc,
  986. StorageClass: storageClass,
  987. Data: result.Values,
  988. }
  989. }
  990. type PVBytesResult struct {
  991. UID string
  992. Cluster string
  993. PersistentVolume string
  994. Value float64
  995. }
  996. func DecodePVBytesResult(result *QueryResult) *PVBytesResult {
  997. uid, _ := result.GetString(UIDLabel)
  998. cluster, _ := result.GetCluster()
  999. pv, _ := result.GetString(PVLabel)
  1000. var value float64
  1001. if len(result.Values) > 0 {
  1002. value = result.Values[0].Value
  1003. } else {
  1004. log.Warnf("Error decoding PV bytes result for pv '%s': empty value returned", uid)
  1005. }
  1006. return &PVBytesResult{
  1007. UID: uid,
  1008. Cluster: cluster,
  1009. PersistentVolume: pv,
  1010. Value: value,
  1011. }
  1012. }
  1013. type PVPricePerGiBHourResult struct {
  1014. UID string
  1015. Cluster string
  1016. VolumeName string
  1017. PersistentVolume string
  1018. ProviderID string
  1019. Data []*util.Vector
  1020. }
  1021. func DecodePVPricePerGiBHourResult(result *QueryResult) *PVPricePerGiBHourResult {
  1022. uid, _ := result.GetString(UIDLabel)
  1023. cluster, _ := result.GetCluster()
  1024. volumeName, _ := result.GetString(VolumeNameLabel)
  1025. pv, _ := result.GetString(PVLabel)
  1026. providerId, _ := result.GetProviderID()
  1027. return &PVPricePerGiBHourResult{
  1028. UID: uid,
  1029. Cluster: cluster,
  1030. VolumeName: volumeName,
  1031. PersistentVolume: pv,
  1032. ProviderID: providerId,
  1033. Data: result.Values,
  1034. }
  1035. }
  1036. type PVInfoResult struct {
  1037. UID string
  1038. Cluster string
  1039. PersistentVolume string
  1040. StorageClass string
  1041. ProviderID string
  1042. CSIVolumeHandle string
  1043. Data []*util.Vector
  1044. }
  1045. func DecodePVInfoResult(result *QueryResult) *PVInfoResult {
  1046. uid, _ := result.GetString(UIDLabel)
  1047. cluster, _ := result.GetCluster()
  1048. storageClass, _ := result.GetString(StorageClassLabel)
  1049. providerId, _ := result.GetProviderID()
  1050. pv, _ := result.GetString(PVLabel)
  1051. csiVolumeHandle, _ := result.GetString(CSIVolumeHandleLabel)
  1052. return &PVInfoResult{
  1053. UID: uid,
  1054. Cluster: cluster,
  1055. PersistentVolume: pv,
  1056. StorageClass: storageClass,
  1057. ProviderID: providerId,
  1058. CSIVolumeHandle: csiVolumeHandle,
  1059. Data: result.Values,
  1060. }
  1061. }
  1062. type PodNetworkBytesResult struct {
  1063. UID string
  1064. Cluster string
  1065. Service string
  1066. Internet bool
  1067. SameRegion bool
  1068. SameZone bool
  1069. NatGateway bool
  1070. Value float64
  1071. }
  1072. func DecodePodNetworkBytesResult(result *QueryResult) *PodNetworkBytesResult {
  1073. uid, _ := result.GetString(UIDLabel)
  1074. cluster, _ := result.GetCluster()
  1075. service, _ := result.GetString(ServiceLabel)
  1076. internet, _ := result.GetString(InternetLabel)
  1077. sameRegion, _ := result.GetString(SameRegionLabel)
  1078. sameZone, _ := result.GetString(SameZoneLabel)
  1079. natGateway, _ := result.GetString(NatGatewayLabel)
  1080. var value float64
  1081. if len(result.Values) > 0 {
  1082. value = result.Values[0].Value
  1083. } else {
  1084. log.Warnf("Error decoding pod network bytes result for pod '%s': empty value returned", uid)
  1085. }
  1086. return &PodNetworkBytesResult{
  1087. UID: uid,
  1088. Cluster: cluster,
  1089. Service: service,
  1090. Internet: internet == "true",
  1091. SameRegion: sameRegion == "true",
  1092. SameZone: sameZone == "true",
  1093. NatGateway: natGateway == "true",
  1094. Value: value,
  1095. }
  1096. }
  1097. // Base type for network usage results
  1098. type NetworkGiBResult struct {
  1099. UID string
  1100. Cluster string
  1101. Namespace string
  1102. Pod string
  1103. Service string
  1104. Data []*util.Vector
  1105. }
  1106. func DecodeNetworkGiBResult(result *QueryResult) *NetworkGiBResult {
  1107. uid, _ := result.GetString(UIDLabel)
  1108. cluster, _ := result.GetCluster()
  1109. namespace, _ := result.GetNamespace()
  1110. pod, _ := result.GetPod()
  1111. service, _ := result.GetString(ServiceLabel)
  1112. return &NetworkGiBResult{
  1113. UID: uid,
  1114. Cluster: cluster,
  1115. Namespace: namespace,
  1116. Pod: pod,
  1117. Service: service,
  1118. Data: result.Values,
  1119. }
  1120. }
  1121. // Base type for network price results
  1122. type NetworkPricePerGiBResult struct {
  1123. UID string
  1124. Cluster string
  1125. Data []*util.Vector
  1126. }
  1127. func DecodeNetworkPricePerGiBResult(result *QueryResult) *NetworkPricePerGiBResult {
  1128. uid, _ := result.GetString(UIDLabel)
  1129. cluster, _ := result.GetCluster()
  1130. return &NetworkPricePerGiBResult{
  1131. UID: uid,
  1132. Cluster: cluster,
  1133. Data: result.Values,
  1134. }
  1135. }
  1136. // Type alias the specific network subclassification results AND price results
  1137. type NetZoneGiBResult = NetworkGiBResult
  1138. type NetZonePricePerGiBResult = NetworkPricePerGiBResult
  1139. type NetRegionGiBResult = NetworkGiBResult
  1140. type NetRegionPricePerGiBResult = NetworkPricePerGiBResult
  1141. type NetInternetGiBResult = NetworkGiBResult
  1142. type NetInternetPricePerGiBResult = NetworkPricePerGiBResult
  1143. type NetInternetServiceGiBResult = NetworkGiBResult
  1144. type NetNatGatewayPricePerGiBResult = NetworkPricePerGiBResult
  1145. type NetNatGatewayGiBResult = NetworkGiBResult
  1146. type NetZoneIngressGiBResult = NetworkGiBResult
  1147. type NetRegionIngressGiBResult = NetworkGiBResult
  1148. type NetInternetIngressGiBResult = NetworkGiBResult
  1149. type NetInternetServiceIngressGiBResult = NetworkGiBResult
  1150. type NetNatGatewayIngressGiBResult = NetworkGiBResult
  1151. func DecodeNetZoneGiBResult(result *QueryResult) *NetZoneGiBResult {
  1152. return DecodeNetworkGiBResult(result)
  1153. }
  1154. func DecodeNetZonePricePerGiBResult(result *QueryResult) *NetZonePricePerGiBResult {
  1155. return DecodeNetworkPricePerGiBResult(result)
  1156. }
  1157. func DecodeNetRegionGiBResult(result *QueryResult) *NetRegionGiBResult {
  1158. return DecodeNetworkGiBResult(result)
  1159. }
  1160. func DecodeNetRegionPricePerGiBResult(result *QueryResult) *NetRegionPricePerGiBResult {
  1161. return DecodeNetworkPricePerGiBResult(result)
  1162. }
  1163. func DecodeNetInternetGiBResult(result *QueryResult) *NetInternetGiBResult {
  1164. return DecodeNetworkGiBResult(result)
  1165. }
  1166. func DecodeNetInternetPricePerGiBResult(result *QueryResult) *NetInternetPricePerGiBResult {
  1167. return DecodeNetworkPricePerGiBResult(result)
  1168. }
  1169. func DecodeNetInternetServiceGiBResult(result *QueryResult) *NetInternetServiceGiBResult {
  1170. return DecodeNetworkGiBResult(result)
  1171. }
  1172. func DecodeNetNatGatewayPricePerGiBResult(result *QueryResult) *NetNatGatewayPricePerGiBResult {
  1173. return DecodeNetworkPricePerGiBResult(result)
  1174. }
  1175. func DecodeNetNatGatewayGiBResult(result *QueryResult) *NetNatGatewayGiBResult {
  1176. return DecodeNetworkGiBResult(result)
  1177. }
  1178. func DecodeNetZoneIngressGiBResult(result *QueryResult) *NetZoneIngressGiBResult {
  1179. return DecodeNetworkGiBResult(result)
  1180. }
  1181. func DecodeNetRegionIngressGiBResult(result *QueryResult) *NetRegionIngressGiBResult {
  1182. return DecodeNetworkGiBResult(result)
  1183. }
  1184. func DecodeNetInternetIngressGiBResult(result *QueryResult) *NetInternetIngressGiBResult {
  1185. return DecodeNetworkGiBResult(result)
  1186. }
  1187. func DecodeNetInternetServiceIngressGiBResult(result *QueryResult) *NetInternetServiceIngressGiBResult {
  1188. return DecodeNetworkGiBResult(result)
  1189. }
  1190. func DecodeNetNatGatewayIngressGiBResult(result *QueryResult) *NetNatGatewayIngressGiBResult {
  1191. return DecodeNetworkGiBResult(result)
  1192. }
  1193. type NetReceiveBytesResult struct {
  1194. UID string
  1195. Cluster string
  1196. Namespace string
  1197. Pod string
  1198. Container string
  1199. Data []*util.Vector
  1200. }
  1201. func DecodeNetReceiveBytesResult(result *QueryResult) *NetReceiveBytesResult {
  1202. uid, _ := result.GetString(UIDLabel)
  1203. cluster, _ := result.GetCluster()
  1204. namespace, _ := result.GetNamespace()
  1205. pod, _ := result.GetPod()
  1206. container, _ := result.GetContainer()
  1207. return &NetReceiveBytesResult{
  1208. UID: uid,
  1209. Cluster: cluster,
  1210. Namespace: namespace,
  1211. Pod: pod,
  1212. Container: container,
  1213. Data: result.Values,
  1214. }
  1215. }
  1216. type NetTransferBytesResult struct {
  1217. UID string
  1218. Cluster string
  1219. Namespace string
  1220. Pod string
  1221. Container string
  1222. Data []*util.Vector
  1223. }
  1224. func DecodeNetTransferBytesResult(result *QueryResult) *NetTransferBytesResult {
  1225. uid, _ := result.GetString(UIDLabel)
  1226. cluster, _ := result.GetCluster()
  1227. namespace, _ := result.GetNamespace()
  1228. pod, _ := result.GetPod()
  1229. container, _ := result.GetContainer()
  1230. return &NetTransferBytesResult{
  1231. UID: uid,
  1232. Cluster: cluster,
  1233. Namespace: namespace,
  1234. Pod: pod,
  1235. Container: container,
  1236. Data: result.Values,
  1237. }
  1238. }
  1239. type NamespaceAnnotationsResult struct {
  1240. UID string
  1241. Cluster string
  1242. Namespace string
  1243. Annotations map[string]string
  1244. Data []*util.Vector
  1245. }
  1246. func DecodeNamespaceAnnotationsResult(result *QueryResult) *NamespaceAnnotationsResult {
  1247. uid, _ := result.GetString(UIDLabel)
  1248. cluster, _ := result.GetCluster()
  1249. namespace, _ := result.GetNamespace()
  1250. annotations := result.GetAnnotations()
  1251. return &NamespaceAnnotationsResult{
  1252. UID: uid,
  1253. Cluster: cluster,
  1254. Namespace: namespace,
  1255. Annotations: annotations,
  1256. Data: result.Values,
  1257. }
  1258. }
  1259. type PodAnnotationsResult struct {
  1260. UID string
  1261. Cluster string
  1262. Namespace string
  1263. Pod string
  1264. Annotations map[string]string
  1265. Data []*util.Vector
  1266. }
  1267. func DecodePodAnnotationsResult(result *QueryResult) *PodAnnotationsResult {
  1268. uid, _ := result.GetString(UIDLabel)
  1269. cluster, _ := result.GetCluster()
  1270. namespace, _ := result.GetNamespace()
  1271. pod, _ := result.GetPod()
  1272. annotations := result.GetAnnotations()
  1273. return &PodAnnotationsResult{
  1274. UID: uid,
  1275. Cluster: cluster,
  1276. Namespace: namespace,
  1277. Pod: pod,
  1278. Annotations: annotations,
  1279. Data: result.Values,
  1280. }
  1281. }
  1282. type NodeLabelsResult struct {
  1283. UID string
  1284. Cluster string
  1285. Node string
  1286. Labels map[string]string
  1287. }
  1288. func DecodeNodeLabelsResult(result *QueryResult) *NodeLabelsResult {
  1289. uid, _ := result.GetString(UIDLabel)
  1290. cluster, _ := result.GetCluster()
  1291. node, _ := result.GetNode()
  1292. labels := result.GetLabels()
  1293. return &NodeLabelsResult{
  1294. UID: uid,
  1295. Cluster: cluster,
  1296. Node: node,
  1297. Labels: labels,
  1298. }
  1299. }
  1300. type NamespaceInfoResult struct {
  1301. UID string
  1302. Cluster string
  1303. Namespace string
  1304. }
  1305. func DecodeNamespaceInfoResult(result *QueryResult) *NamespaceInfoResult {
  1306. uid, _ := result.GetString(UIDLabel)
  1307. cluster, _ := result.GetCluster()
  1308. namespace, _ := result.GetNamespace()
  1309. return &NamespaceInfoResult{
  1310. UID: uid,
  1311. Cluster: cluster,
  1312. Namespace: namespace,
  1313. }
  1314. }
  1315. type NamespaceLabelsResult struct {
  1316. UID string
  1317. Cluster string
  1318. Namespace string
  1319. Labels map[string]string
  1320. Data []*util.Vector
  1321. }
  1322. func DecodeNamespaceLabelsResult(result *QueryResult) *NamespaceLabelsResult {
  1323. uid, _ := result.GetString(UIDLabel)
  1324. cluster, _ := result.GetCluster()
  1325. namespace, _ := result.GetNamespace()
  1326. labels := result.GetLabels()
  1327. return &NamespaceLabelsResult{
  1328. UID: uid,
  1329. Cluster: cluster,
  1330. Namespace: namespace,
  1331. Labels: labels,
  1332. Data: result.Values,
  1333. }
  1334. }
  1335. type PodLabelsResult struct {
  1336. UID string
  1337. Cluster string
  1338. Namespace string
  1339. Pod string
  1340. Labels map[string]string
  1341. Data []*util.Vector
  1342. }
  1343. func DecodePodLabelsResult(result *QueryResult) *PodLabelsResult {
  1344. uid, _ := result.GetString(UIDLabel)
  1345. cluster, _ := result.GetCluster()
  1346. namespace, _ := result.GetNamespace()
  1347. pod, _ := result.GetPod()
  1348. labels := result.GetLabels()
  1349. return &PodLabelsResult{
  1350. UID: uid,
  1351. Cluster: cluster,
  1352. Namespace: namespace,
  1353. Pod: pod,
  1354. Labels: labels,
  1355. Data: result.Values,
  1356. }
  1357. }
  1358. type ServiceLabelsResult struct {
  1359. UID string
  1360. Cluster string
  1361. Namespace string
  1362. Service string
  1363. Labels map[string]string
  1364. Data []*util.Vector
  1365. }
  1366. func DecodeServiceLabelsResult(result *QueryResult) *ServiceLabelsResult {
  1367. uid, _ := result.GetString(UIDLabel)
  1368. cluster, _ := result.GetCluster()
  1369. namespace, _ := result.GetNamespace()
  1370. service, _ := result.GetString(ServiceLabel)
  1371. labels := result.GetLabels()
  1372. return &ServiceLabelsResult{
  1373. UID: uid,
  1374. Cluster: cluster,
  1375. Namespace: namespace,
  1376. Service: service,
  1377. Labels: labels,
  1378. Data: result.Values,
  1379. }
  1380. }
  1381. type ServiceInfoResult struct {
  1382. UID string
  1383. Cluster string
  1384. NamespaceUID string
  1385. Service string
  1386. ServiceType string
  1387. }
  1388. func DecodeServiceInfoResult(result *QueryResult) *ServiceInfoResult {
  1389. uid, _ := result.GetString(UIDLabel)
  1390. cluster, _ := result.GetCluster()
  1391. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1392. service, _ := result.GetString(ServiceLabel)
  1393. serviceType, _ := result.GetString(ServiceTypeLabel)
  1394. return &ServiceInfoResult{
  1395. UID: uid,
  1396. Cluster: cluster,
  1397. NamespaceUID: namespaceUID,
  1398. Service: service,
  1399. ServiceType: serviceType,
  1400. }
  1401. }
  1402. type DeploymentInfoResult struct {
  1403. UID string
  1404. Cluster string
  1405. NamespaceUID string
  1406. Deployment string
  1407. }
  1408. func DecodeDeploymentInfoResult(result *QueryResult) *DeploymentInfoResult {
  1409. uid, _ := result.GetString(UIDLabel)
  1410. cluster, _ := result.GetCluster()
  1411. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1412. deployment, _ := result.GetString(DeploymentLabel)
  1413. return &DeploymentInfoResult{
  1414. UID: uid,
  1415. Cluster: cluster,
  1416. NamespaceUID: namespaceUID,
  1417. Deployment: deployment,
  1418. }
  1419. }
  1420. type DeploymentLabelsResult struct {
  1421. UID string
  1422. Cluster string
  1423. Namespace string
  1424. Deployment string
  1425. Labels map[string]string
  1426. Data []*util.Vector
  1427. }
  1428. func DecodeDeploymentLabelsResult(result *QueryResult) *DeploymentLabelsResult {
  1429. uid, _ := result.GetString(UIDLabel)
  1430. cluster, _ := result.GetCluster()
  1431. namespace, _ := result.GetNamespace()
  1432. deployment, _ := result.GetString(DeploymentLabel)
  1433. labels := result.GetLabels()
  1434. return &DeploymentLabelsResult{
  1435. UID: uid,
  1436. Cluster: cluster,
  1437. Namespace: namespace,
  1438. Deployment: deployment,
  1439. Labels: labels,
  1440. Data: result.Values,
  1441. }
  1442. }
  1443. type StatefulSetInfoResult struct {
  1444. UID string
  1445. Cluster string
  1446. NamespaceUID string
  1447. StatefulSet string
  1448. }
  1449. func DecodeStatefulSetInfoResult(result *QueryResult) *StatefulSetInfoResult {
  1450. uid, _ := result.GetString(UIDLabel)
  1451. cluster, _ := result.GetCluster()
  1452. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1453. statefulSet, _ := result.GetString(StatefulSetLabel)
  1454. return &StatefulSetInfoResult{
  1455. UID: uid,
  1456. Cluster: cluster,
  1457. NamespaceUID: namespaceUID,
  1458. StatefulSet: statefulSet,
  1459. }
  1460. }
  1461. type DaemonSetInfoResult struct {
  1462. UID string
  1463. Cluster string
  1464. NamespaceUID string
  1465. DaemonSet string
  1466. }
  1467. func DecodeDaemonSetInfoResult(result *QueryResult) *DaemonSetInfoResult {
  1468. uid, _ := result.GetString(UIDLabel)
  1469. cluster, _ := result.GetCluster()
  1470. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1471. daemonSet, _ := result.GetString(DaemonSetLabel)
  1472. return &DaemonSetInfoResult{
  1473. UID: uid,
  1474. Cluster: cluster,
  1475. NamespaceUID: namespaceUID,
  1476. DaemonSet: daemonSet,
  1477. }
  1478. }
  1479. type JobInfoResult struct {
  1480. UID string
  1481. Cluster string
  1482. NamespaceUID string
  1483. Job string
  1484. }
  1485. func DecodeJobInfoResult(result *QueryResult) *JobInfoResult {
  1486. uid, _ := result.GetString(UIDLabel)
  1487. cluster, _ := result.GetCluster()
  1488. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1489. job, _ := result.GetString(JobLabel)
  1490. return &JobInfoResult{
  1491. UID: uid,
  1492. Cluster: cluster,
  1493. NamespaceUID: namespaceUID,
  1494. Job: job,
  1495. }
  1496. }
  1497. type CronJobInfoResult struct {
  1498. UID string
  1499. Cluster string
  1500. NamespaceUID string
  1501. CronJob string
  1502. }
  1503. func DecodeCronJobInfoResult(result *QueryResult) *CronJobInfoResult {
  1504. uid, _ := result.GetString(UIDLabel)
  1505. cluster, _ := result.GetCluster()
  1506. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1507. cronJob, _ := result.GetString(CronJobLabel)
  1508. return &CronJobInfoResult{
  1509. UID: uid,
  1510. Cluster: cluster,
  1511. NamespaceUID: namespaceUID,
  1512. CronJob: cronJob,
  1513. }
  1514. }
  1515. type ReplicaSetInfoResult struct {
  1516. UID string
  1517. Cluster string
  1518. NamespaceUID string
  1519. ReplicaSet string
  1520. }
  1521. func DecodeReplicaSetInfoResult(result *QueryResult) *ReplicaSetInfoResult {
  1522. uid, _ := result.GetString(UIDLabel)
  1523. cluster, _ := result.GetCluster()
  1524. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1525. replicaSet, _ := result.GetString(ReplicaSetLabel)
  1526. return &ReplicaSetInfoResult{
  1527. UID: uid,
  1528. Cluster: cluster,
  1529. NamespaceUID: namespaceUID,
  1530. ReplicaSet: replicaSet,
  1531. }
  1532. }
  1533. type StatefulSetLabelsResult struct {
  1534. UID string
  1535. Cluster string
  1536. Namespace string
  1537. StatefulSet string
  1538. Labels map[string]string
  1539. Data []*util.Vector
  1540. }
  1541. func DecodeStatefulSetLabelsResult(result *QueryResult) *StatefulSetLabelsResult {
  1542. uid, _ := result.GetString(UIDLabel)
  1543. cluster, _ := result.GetCluster()
  1544. namespace, _ := result.GetNamespace()
  1545. statefulSet, _ := result.GetString(StatefulSetLabel)
  1546. labels := result.GetLabels()
  1547. return &StatefulSetLabelsResult{
  1548. UID: uid,
  1549. Cluster: cluster,
  1550. Namespace: namespace,
  1551. StatefulSet: statefulSet,
  1552. Labels: labels,
  1553. Data: result.Values,
  1554. }
  1555. }
  1556. type PodsWithDaemonSetOwnerResult struct {
  1557. UID string
  1558. Cluster string
  1559. Namespace string
  1560. Pod string
  1561. DaemonSet string
  1562. }
  1563. func DecodePodsWithDaemonSetOwnerResult(result *QueryResult) *PodsWithDaemonSetOwnerResult {
  1564. uid, _ := result.GetString(UIDLabel)
  1565. cluster, _ := result.GetCluster()
  1566. namespace, _ := result.GetNamespace()
  1567. pod, _ := result.GetPod()
  1568. daemonSet, _ := result.GetString(OwnerNameLabel)
  1569. return &PodsWithDaemonSetOwnerResult{
  1570. UID: uid,
  1571. Cluster: cluster,
  1572. Namespace: namespace,
  1573. Pod: pod,
  1574. DaemonSet: daemonSet,
  1575. }
  1576. }
  1577. type PodsWithJobOwnerResult struct {
  1578. UID string
  1579. Cluster string
  1580. Namespace string
  1581. Pod string
  1582. Job string
  1583. }
  1584. func DecodePodsWithJobOwnerResult(result *QueryResult) *PodsWithJobOwnerResult {
  1585. uid, _ := result.GetString(UIDLabel)
  1586. cluster, _ := result.GetCluster()
  1587. namespace, _ := result.GetNamespace()
  1588. pod, _ := result.GetPod()
  1589. job, _ := result.GetString(OwnerNameLabel)
  1590. return &PodsWithJobOwnerResult{
  1591. UID: uid,
  1592. Cluster: cluster,
  1593. Namespace: namespace,
  1594. Pod: pod,
  1595. Job: job,
  1596. }
  1597. }
  1598. type PodsWithReplicaSetOwnerResult struct {
  1599. UID string
  1600. Cluster string
  1601. Namespace string
  1602. Pod string
  1603. ReplicaSet string
  1604. Data []*util.Vector
  1605. }
  1606. func DecodePodsWithReplicaSetOwnerResult(result *QueryResult) *PodsWithReplicaSetOwnerResult {
  1607. uid, _ := result.GetString(UIDLabel)
  1608. cluster, _ := result.GetCluster()
  1609. namespace, _ := result.GetNamespace()
  1610. replicaSet, _ := result.GetString(OwnerNameLabel)
  1611. pod, _ := result.GetPod()
  1612. return &PodsWithReplicaSetOwnerResult{
  1613. UID: uid,
  1614. Cluster: cluster,
  1615. Namespace: namespace,
  1616. Pod: pod,
  1617. ReplicaSet: replicaSet,
  1618. Data: result.Values,
  1619. }
  1620. }
  1621. type ReplicaSetsWithoutOwnersResult struct {
  1622. UID string
  1623. Cluster string
  1624. Namespace string
  1625. ReplicaSet string
  1626. Data []*util.Vector
  1627. }
  1628. func DecodeReplicaSetsWithoutOwnersResult(result *QueryResult) *ReplicaSetsWithoutOwnersResult {
  1629. uid, _ := result.GetString(UIDLabel)
  1630. return &ReplicaSetsWithoutOwnersResult{
  1631. UID: uid,
  1632. Data: result.Values,
  1633. }
  1634. }
  1635. type ReplicaSetsWithRolloutResult struct {
  1636. UID string
  1637. Cluster string
  1638. Namespace string
  1639. ReplicaSet string
  1640. OwnerName string
  1641. OwnerKind string
  1642. Data []*util.Vector
  1643. }
  1644. func DecodeReplicaSetsWithRolloutResult(result *QueryResult) *ReplicaSetsWithRolloutResult {
  1645. uid, _ := result.GetString(UIDLabel)
  1646. cluster, _ := result.GetCluster()
  1647. namespace, _ := result.GetNamespace()
  1648. replicaSet, _ := result.GetString(ReplicaSetLabel)
  1649. ownerName, _ := result.GetString(OwnerNameLabel)
  1650. ownerKind, _ := result.GetString(OwnerKindLabel)
  1651. return &ReplicaSetsWithRolloutResult{
  1652. UID: uid,
  1653. Cluster: cluster,
  1654. Namespace: namespace,
  1655. ReplicaSet: replicaSet,
  1656. OwnerName: ownerName,
  1657. OwnerKind: ownerKind,
  1658. Data: result.Values,
  1659. }
  1660. }
  1661. type ResourceQuotaInfoResult struct {
  1662. UID string
  1663. NamespaceUID string
  1664. ResourceQuota string
  1665. }
  1666. func DecodeResourceQuotaInfoResult(result *QueryResult) *ResourceQuotaInfoResult {
  1667. uid, _ := result.GetString(UIDLabel)
  1668. namespaceUID, _ := result.GetString(NamespaceUIDLabel)
  1669. resourceQuota, _ := result.GetString(ResourceQuotaLabel)
  1670. return &ResourceQuotaInfoResult{
  1671. UID: uid,
  1672. NamespaceUID: namespaceUID,
  1673. ResourceQuota: resourceQuota,
  1674. }
  1675. }
  1676. type ResourceResult struct {
  1677. UID string
  1678. Resource string
  1679. Unit string
  1680. Value float64
  1681. }
  1682. func DecodeResourceResult(result *QueryResult) *ResourceResult {
  1683. uid, _ := result.GetString(UIDLabel)
  1684. resource, _ := result.GetString(ResourceLabel)
  1685. unit, _ := result.GetString(UnitLabel)
  1686. var value float64
  1687. if len(result.Values) > 0 {
  1688. value = result.Values[0].Value
  1689. } else {
  1690. log.Warnf("Error decoding resource for uid '%s': empty value returned", uid)
  1691. }
  1692. return &ResourceResult{
  1693. UID: uid,
  1694. Resource: resource,
  1695. Unit: unit,
  1696. Value: value,
  1697. }
  1698. }
  1699. // DCGM needs specialized results because it uses UUID instead of the uid label that we use.
  1700. type DCGMDeviceInfoResult struct {
  1701. UUID string
  1702. Device string
  1703. ModelName string
  1704. HostName string
  1705. }
  1706. func DecodeDCGMDeviceInfoResult(result *QueryResult) *DCGMDeviceInfoResult {
  1707. uuid, _ := result.GetString(UUIDLabel)
  1708. device, _ := result.GetString(DeviceLabel)
  1709. modelName, _ := result.GetString(ModelNameLabel)
  1710. hostName, _ := result.GetString(HostNameLabel)
  1711. return &DCGMDeviceInfoResult{
  1712. UUID: uuid,
  1713. Device: device,
  1714. ModelName: modelName,
  1715. HostName: hostName,
  1716. }
  1717. }
  1718. type DCGMDeviceUptimeResult struct {
  1719. UUID string
  1720. First time.Time
  1721. Last time.Time
  1722. }
  1723. func (res *DCGMDeviceUptimeResult) GetStartEnd(windowStart, windowEnd time.Time, resolution time.Duration) (time.Time, time.Time) {
  1724. return getStartEnd(res.First, res.Last, windowStart, windowEnd, resolution)
  1725. }
  1726. func getStartEnd(first, last, windowStart, windowEnd time.Time, resolution time.Duration) (time.Time, time.Time) {
  1727. // The only corner-case here is what to do if you only get one timestamp.
  1728. // This dilemma still requires the use of the resolution, and can be
  1729. // clamped using the window. In this case, we want to honor the existence
  1730. // of the pod by giving "one resolution" worth of duration, half on each
  1731. // side of the given timestamp.
  1732. if first.Equal(last) {
  1733. first = first.Add(-1 * resolution / time.Duration(2))
  1734. last = last.Add(resolution / time.Duration(2))
  1735. }
  1736. if first.Before(windowStart) {
  1737. first = windowStart
  1738. }
  1739. if last.After(windowEnd) {
  1740. last = windowEnd
  1741. }
  1742. // prevent end times in the future
  1743. now := time.Now().UTC()
  1744. if last.After(now) {
  1745. last = now
  1746. }
  1747. return first, last
  1748. }
  1749. func DecodeDCGMDeviceUptimeResult(result *QueryResult) *DCGMDeviceUptimeResult {
  1750. uuid, _ := result.GetString(UUIDLabel)
  1751. first := time.Unix(int64(result.Values[0].Timestamp), 0).UTC()
  1752. last := time.Unix(int64(result.Values[len(result.Values)-1].Timestamp), 0).UTC()
  1753. return &DCGMDeviceUptimeResult{
  1754. UUID: uuid,
  1755. First: first,
  1756. Last: last,
  1757. }
  1758. }
  1759. type DCGMDeviceContainerUsageResult struct {
  1760. UUID string
  1761. PodUID string
  1762. Container string
  1763. Value float64
  1764. }
  1765. func DecodeDCGMDeviceContainerUsageResult(result *QueryResult) *DCGMDeviceContainerUsageResult {
  1766. uuid, _ := result.GetString(UUIDLabel)
  1767. podUID, _ := result.GetString(PodUIDLabel)
  1768. container, _ := result.GetString(ContainerLabel)
  1769. var value float64
  1770. if len(result.Values) > 0 {
  1771. value = result.Values[0].Value
  1772. } else {
  1773. log.Warnf("Error decoding DCGM Device Container Udage Result for device '%s': empty value returned", uuid)
  1774. }
  1775. return &DCGMDeviceContainerUsageResult{
  1776. UUID: uuid,
  1777. PodUID: podUID,
  1778. Container: container,
  1779. Value: value,
  1780. }
  1781. }
  1782. func DecodeAll[T any](results []*QueryResult, decode ResultDecoder[T]) []*T {
  1783. decoded := make([]*T, 0, len(results))
  1784. for _, result := range results {
  1785. decoded = append(decoded, decode(result))
  1786. }
  1787. return decoded
  1788. }