Skip to content

Commit 1a534ca

Browse files
Peng Hui JiangPeng Hui Jiang
Peng Hui Jiang
authored and
Peng Hui Jiang
committed
Support hmc client to get energy consumption from IBM System Z
Signed-off-by: Peng Hui Jiang <[email protected]>
1 parent 3d5d046 commit 1a534ca

File tree

4 files changed

+151
-11
lines changed

4 files changed

+151
-11
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ require (
1919
github.com/prometheus/client_model v0.5.0
2020
github.com/prometheus/common v0.44.0
2121
github.com/prometheus/prometheus v0.40.3
22+
github.com/zhmcclient/golang-zhmcclient v0.2.1-0.20231017092628-6bb10a7dd31e
2223
golang.org/x/sys v0.13.0
2324
k8s.io/api v0.25.3
2425
k8s.io/apimachinery v0.25.3
@@ -68,6 +69,8 @@ require (
6869
github.com/prometheus/procfs v0.11.1 // indirect
6970
github.com/sirupsen/logrus v1.9.0 // indirect
7071
github.com/spf13/pflag v1.0.5 // indirect
72+
go.uber.org/multierr v1.10.0 // indirect
73+
go.uber.org/zap v1.26.0 // indirect
7174
golang.org/x/net v0.17.0 // indirect
7275
golang.org/x/oauth2 v0.8.0 // indirect
7376
golang.org/x/term v0.13.0 // indirect

go.sum

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry
3838
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
3939
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
4040
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
41+
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
4142
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
4243
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
4344
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
@@ -141,6 +142,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
141142
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
142143
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
143144
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
145+
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
146+
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
144147
github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
145148
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
146149
github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c=
@@ -180,6 +183,13 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
180183
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
181184
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
182185
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
186+
github.com/zhmcclient/golang-zhmcclient v0.2.1-0.20231017092628-6bb10a7dd31e h1:YhJu8iZ3alKXCd25WCmjlXXkUZZsf6ioEYc9hRqjp0g=
187+
github.com/zhmcclient/golang-zhmcclient v0.2.1-0.20231017092628-6bb10a7dd31e/go.mod h1:adYy8E34m1Z0SW4YVtYVj6mSLZkFXLTk0HAap9ViE+Y=
188+
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
189+
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
190+
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
191+
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
192+
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
183193
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
184194
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
185195
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -277,6 +287,7 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
277287
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
278288
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
279289
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
290+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
280291
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
281292
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
282293
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

pkg/power/platform/source/hmc.go

Lines changed: 120 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
/*
2-
Copyright 2022.
3-
2+
Copyright 2023.
43
Licensed under the Apache License, Version 2.0 (the "License");
54
you may not use this file except in compliance with the License.
65
You may obtain a copy of the License at
7-
86
http://www.apache.org/licenses/LICENSE-2.0
9-
107
Unless required by applicable law or agreed to in writing, software
118
distributed under the License is distributed on an "AS IS" BASIS,
129
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,17 +13,129 @@ limitations under the License.
1613

1714
package source
1815

19-
type PowerHMC struct{}
16+
import (
17+
"os"
18+
"strconv"
19+
20+
"k8s.io/klog/v2"
21+
22+
"github.com/sustainable-computing-io/kepler/pkg/power/components/source"
23+
"github.com/zhmcclient/golang-zhmcclient/pkg/zhmcclient"
24+
)
25+
26+
const (
27+
hmcSensorID string = "hmc"
28+
)
29+
30+
type PowerHMC struct {
31+
}
32+
33+
var hmcManager *zhmcclient.ZhmcManager
34+
35+
func (r *PowerHMC) GetHMCManager() *zhmcclient.ZhmcManager {
36+
if hmcManager == nil {
37+
endpoint := os.Getenv("HMC_ENDPOINT")
38+
username := os.Getenv("HMC_USERNAME")
39+
password := os.Getenv("HMC_PASSWORD")
40+
cacert := os.Getenv("CA_CERT")
41+
skipCert := os.Getenv("SKIP_CERT")
42+
isSkipCert, _ := strconv.ParseBool(skipCert)
43+
44+
creds := &zhmcclient.Options{Username: username, Password: password, CaCert: cacert, SkipCert: isSkipCert, Trace: false}
45+
client, err := zhmcclient.NewClient(endpoint, creds, nil)
46+
if err != nil {
47+
klog.V(1).Infof("Error getting client connection %v", err.Message)
48+
}
49+
if client != nil {
50+
zhmcAPI := zhmcclient.NewManagerFromClient(client)
51+
hmcManager, _ := zhmcAPI.(*zhmcclient.ZhmcManager)
52+
return hmcManager
53+
}
54+
}
55+
return hmcManager
56+
}
57+
58+
func (r *PowerHMC) GetEnergyFromLpar() (uint64, error) {
59+
hmcManager := r.GetHMCManager()
60+
lparURI := "api/logical-partitions/" + os.Getenv("LPAR_ID")
61+
props := &zhmcclient.EnergyRequestPayload{
62+
Range: "last-day",
63+
Resolution: "fifteen-minutes",
64+
}
65+
energy, _, err := hmcManager.GetEnergyDetailsforLPAR(lparURI, props)
66+
if err != nil {
67+
klog.V(1).Infof("Error getting energy data: %v", err.Message)
68+
}
69+
klog.V(1).Infof("Get energy data successfully")
70+
return energy, err
71+
}
72+
73+
func (r *PowerHMC) GetLiveEnergyFromLpar() (uint64, error) {
74+
hmcManager := r.GetHMCManager()
75+
lparURI := "/api/logical-partitions/" + os.Getenv("LPAR_ID")
76+
energy, _, err := hmcManager.GetLiveEnergyDetailsforLPAR(lparURI)
77+
if err != nil {
78+
klog.V(1).Infof("Error getting energy data: %v", err.Message)
79+
} else {
80+
klog.V(1).Infof("Get energy data successfully with power: %v", energy)
81+
}
82+
return energy, err
83+
}
84+
85+
func (r *PowerHMC) IsSystemCollectionSupported() bool {
86+
return true
87+
}
88+
89+
func (r *PowerHMC) StopPower() {
90+
}
91+
92+
func (r *PowerHMC) GetEnergyFromDram() (uint64, error) {
93+
return 0, nil
94+
}
95+
96+
func (r *PowerHMC) GetEnergyFromCore() (uint64, error) {
97+
return 0, nil
98+
}
99+
100+
func (r *PowerHMC) GetEnergyFromUncore() (uint64, error) {
101+
return 0, nil
102+
}
103+
104+
func (r *PowerHMC) GetEnergyFromPackage() (uint64, error) {
105+
return 0, nil
106+
}
107+
108+
func (r *PowerHMC) GetNodeComponentsEnergy() map[int]source.NodeComponentsEnergy {
109+
pkgEnergy, _ := r.GetLiveEnergyFromLpar()
110+
pkgEnergy = pkgEnergy * 3
111+
coreEnergy := uint64(0)
112+
dramEnergy := uint64(0)
113+
uncoreEnergy := uint64(0)
114+
componentsEnergies := make(map[int]source.NodeComponentsEnergy)
115+
componentsEnergies[0] = source.NodeComponentsEnergy{
116+
Core: coreEnergy,
117+
DRAM: dramEnergy,
118+
Uncore: uncoreEnergy,
119+
Pkg: pkgEnergy,
120+
}
121+
return componentsEnergies
122+
}
20123

21-
func (a *PowerHMC) StopPower() {
124+
func (r *PowerHMC) GetPlatformEnergy() map[string]float64 {
125+
pkgEnergy, _ := r.GetLiveEnergyFromLpar()
126+
platformEnergies := make(map[string]float64)
127+
platformEnergies[hmcSensorID] = float64(pkgEnergy) * 3
128+
return platformEnergies
22129
}
23130

24-
func (a *PowerHMC) IsSystemCollectionSupported() bool {
25-
return false
131+
func (r *PowerHMC) IsPlatformCollectionSupported() bool {
132+
return true
26133
}
27134

28135
// GetEnergyFromHost returns the accumulated energy consumption
29-
func (a *PowerHMC) GetAbsEnergyFromPlatform() (map[string]float64, error) {
30-
power := map[string]float64{}
31-
return power, nil
136+
func (r *PowerHMC) GetAbsEnergyFromPlatform() (map[string]float64, error) {
137+
pkgEnergy, _ := r.GetLiveEnergyFromLpar()
138+
platformEnergies := make(map[string]float64)
139+
platformEnergies[hmcSensorID] = float64(pkgEnergy) * 3
140+
return platformEnergies, nil
32141
}

vendor/modules.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,23 @@ github.com/sirupsen/logrus
279279
# github.com/spf13/pflag v1.0.5
280280
## explicit; go 1.12
281281
github.com/spf13/pflag
282+
# github.com/zhmcclient/golang-zhmcclient v0.2.1-0.20231017092628-6bb10a7dd31e
283+
## explicit; go 1.20
284+
github.com/zhmcclient/golang-zhmcclient/pkg/zhmcclient
285+
# go.uber.org/multierr v1.10.0
286+
## explicit; go 1.19
287+
go.uber.org/multierr
288+
# go.uber.org/zap v1.26.0
289+
## explicit; go 1.19
290+
go.uber.org/zap
291+
go.uber.org/zap/buffer
292+
go.uber.org/zap/internal
293+
go.uber.org/zap/internal/bufferpool
294+
go.uber.org/zap/internal/color
295+
go.uber.org/zap/internal/exit
296+
go.uber.org/zap/internal/pool
297+
go.uber.org/zap/internal/stacktrace
298+
go.uber.org/zap/zapcore
282299
# golang.org/x/net v0.17.0
283300
## explicit; go 1.17
284301
golang.org/x/net/context

0 commit comments

Comments
 (0)