Skip to content

Commit d996e11

Browse files
committed
Move WMI service functions to cim package
1 parent 9ad5f3f commit d996e11

File tree

3 files changed

+114
-83
lines changed

3 files changed

+114
-83
lines changed

pkg/cim/system.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@ import (
1010
"github.com/microsoft/wmi/server2019/root/cimv2"
1111
)
1212

13+
var (
14+
BIOSSelectorList = []string{"SerialNumber"}
15+
ServiceSelectorList = []string{"DisplayName", "State", "StartMode"}
16+
)
17+
18+
type ServiceInterface interface {
19+
GetPropertyName() (string, error)
20+
GetPropertyDisplayName() (string, error)
21+
GetPropertyState() (string, error)
22+
GetPropertyStartMode() (string, error)
23+
GetDependents() ([]ServiceInterface, error)
24+
StartService() (result uint32, err error)
25+
StopService() (result uint32, err error)
26+
}
27+
1328
// QueryBIOSElement retrieves the BIOS element.
1429
//
1530
// The equivalent WMI query is:
@@ -33,6 +48,11 @@ func QueryBIOSElement(selectorList []string) (*cimv2.CIM_BIOSElement, error) {
3348
return bios, err
3449
}
3550

51+
// GetBIOSSerialNumber returns the BIOS serial number.
52+
func GetBIOSSerialNumber(bios *cimv2.CIM_BIOSElement) (string, error) {
53+
return bios.GetPropertySerialNumber()
54+
}
55+
3656
// QueryServiceByName retrieves a specific service by its name.
3757
//
3858
// The equivalent WMI query is:
@@ -55,3 +75,60 @@ func QueryServiceByName(name string, selectorList []string) (*cimv2.Win32_Servic
5575

5676
return service, err
5777
}
78+
79+
// GetServiceName returns the name of a service.
80+
func GetServiceName(service ServiceInterface) (string, error) {
81+
return service.GetPropertyName()
82+
}
83+
84+
// GetServiceDisplayName returns the display name of a service.
85+
func GetServiceDisplayName(service ServiceInterface) (string, error) {
86+
return service.GetPropertyDisplayName()
87+
}
88+
89+
// GetServiceState returns the state of a service.
90+
func GetServiceState(service ServiceInterface) (string, error) {
91+
return service.GetPropertyState()
92+
}
93+
94+
// GetServiceStartMode returns the start mode of a service.
95+
func GetServiceStartMode(service ServiceInterface) (string, error) {
96+
return service.GetPropertyStartMode()
97+
}
98+
99+
// Win32Service wraps the WMI class Win32_Service (mainly for testing)
100+
type Win32Service struct {
101+
*cimv2.Win32_Service
102+
}
103+
104+
func (s *Win32Service) GetDependents() ([]ServiceInterface, error) {
105+
collection, err := s.GetAssociated("Win32_DependentService", "Win32_Service", "Dependent", "Antecedent")
106+
if err != nil {
107+
return nil, err
108+
}
109+
110+
var result []ServiceInterface
111+
for _, coll := range collection {
112+
service, err := cimv2.NewWin32_ServiceEx1(coll)
113+
if err != nil {
114+
return nil, err
115+
}
116+
117+
result = append(result, &Win32Service{
118+
service,
119+
})
120+
}
121+
return result, nil
122+
}
123+
124+
type Win32ServiceFactory struct {
125+
}
126+
127+
func (impl Win32ServiceFactory) GetService(name string) (ServiceInterface, error) {
128+
service, err := QueryServiceByName(name, ServiceSelectorList)
129+
if err != nil {
130+
return nil, err
131+
}
132+
133+
return &Win32Service{Win32_Service: service}, nil
134+
}

pkg/os/system/api.go

Lines changed: 20 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"github.com/kubernetes-csi/csi-proxy/pkg/cim"
88
"github.com/kubernetes-csi/csi-proxy/pkg/server/system/impl"
99
wmierrors "github.com/microsoft/wmi/pkg/errors"
10-
"github.com/microsoft/wmi/server2019/root/cimv2"
1110
)
1211

1312
// Implements the System OS API calls. All code here should be very simple
@@ -26,8 +25,8 @@ type ServiceInfo struct {
2625
Status uint32 `json:"Status"`
2726
}
2827

29-
type stateCheckFunc func() (bool, string, ServiceInterface, error)
30-
type stateTransitionFunc func(ServiceInterface) error
28+
type stateCheckFunc func() (bool, string, cim.ServiceInterface, error)
29+
type stateTransitionFunc func(cim.ServiceInterface) error
3130

3231
const (
3332
// startServiceErrorCodeAccepted indicates the request is accepted
@@ -81,23 +80,13 @@ func serviceState(status string) uint32 {
8180
return stateMappings[status]
8281
}
8382

84-
type ServiceInterface interface {
85-
GetPropertyName() (string, error)
86-
GetPropertyDisplayName() (string, error)
87-
GetPropertyState() (string, error)
88-
GetPropertyStartMode() (string, error)
89-
GetDependents() ([]ServiceInterface, error)
90-
StartService() (result uint32, err error)
91-
StopService() (result uint32, err error)
92-
}
93-
9483
type ServiceManager interface {
9584
WaitUntilServiceState(stateTransition stateTransitionFunc, stateCheck stateCheckFunc, interval time.Duration, timeout time.Duration) (string, error)
9685
GetDependentsForService(name string) ([]string, error)
9786
}
9887

9988
type ServiceFactory interface {
100-
GetService(name string) (ServiceInterface, error)
89+
GetService(name string) (cim.ServiceInterface, error)
10190
}
10291

10392
type APIImplementor struct {
@@ -106,7 +95,7 @@ type APIImplementor struct {
10695
}
10796

10897
func New() APIImplementor {
109-
serviceFactory := Win32ServiceFactory{}
98+
serviceFactory := cim.Win32ServiceFactory{}
11099
return APIImplementor{
111100
serviceFactory: serviceFactory,
112101
serviceManager: ServiceManagerImpl{
@@ -116,36 +105,36 @@ func New() APIImplementor {
116105
}
117106

118107
func (APIImplementor) GetBIOSSerialNumber() (string, error) {
119-
bios, err := cim.QueryBIOSElement([]string{"SerialNumber"})
108+
bios, err := cim.QueryBIOSElement(cim.BIOSSelectorList)
120109
if err != nil {
121110
return "", fmt.Errorf("failed to get BIOS element: %w", err)
122111
}
123112

124-
sn, err := bios.GetPropertySerialNumber()
113+
sn, err := cim.GetBIOSSerialNumber(bios)
125114
if err != nil {
126115
return "", fmt.Errorf("failed to get BIOS serial number property: %w", err)
127116
}
128117

129118
return sn, nil
130119
}
131120

132-
func (APIImplementor) GetService(name string) (*ServiceInfo, error) {
133-
service, err := cim.QueryServiceByName(name, []string{"DisplayName", "State", "StartMode"})
121+
func (impl APIImplementor) GetService(name string) (*ServiceInfo, error) {
122+
service, err := impl.serviceFactory.GetService(name)
134123
if err != nil {
135124
return nil, fmt.Errorf("failed to get service %s: %w", name, err)
136125
}
137126

138-
displayName, err := service.GetPropertyDisplayName()
127+
displayName, err := cim.GetServiceDisplayName(service)
139128
if err != nil {
140129
return nil, fmt.Errorf("failed to get displayName property of service %s: %w", name, err)
141130
}
142131

143-
state, err := service.GetPropertyState()
132+
state, err := cim.GetServiceState(service)
144133
if err != nil {
145134
return nil, fmt.Errorf("failed to get state property of service %s: %w", name, err)
146135
}
147136

148-
startMode, err := service.GetPropertyStartMode()
137+
startMode, err := cim.GetServiceStartMode(service)
149138
if err != nil {
150139
return nil, fmt.Errorf("failed to get startMode property of service %s: %w", name, err)
151140
}
@@ -158,20 +147,20 @@ func (APIImplementor) GetService(name string) (*ServiceInfo, error) {
158147
}
159148

160149
func (impl APIImplementor) StartService(name string) error {
161-
startService := func(service ServiceInterface) error {
150+
startService := func(service cim.ServiceInterface) error {
162151
retVal, err := service.StartService()
163152
if err != nil || (retVal != startServiceErrorCodeAccepted && retVal != startServiceErrorCodeAlreadyRunning) {
164153
return fmt.Errorf("error starting service name %s. return value: %d, error: %v", name, retVal, err)
165154
}
166155
return nil
167156
}
168-
serviceRunningCheck := func() (bool, string, ServiceInterface, error) {
157+
serviceRunningCheck := func() (bool, string, cim.ServiceInterface, error) {
169158
service, err := impl.serviceFactory.GetService(name)
170159
if err != nil {
171160
return false, "", nil, err
172161
}
173162

174-
state, err := service.GetPropertyState()
163+
state, err := cim.GetServiceState(service)
175164
if err != nil {
176165
return false, state, service, err
177166
}
@@ -193,7 +182,7 @@ func (impl APIImplementor) StartService(name string) error {
193182

194183
func (impl APIImplementor) stopSingleService(name string) (bool, error) {
195184
var dependentRunning bool
196-
stopService := func(service ServiceInterface) error {
185+
stopService := func(service cim.ServiceInterface) error {
197186
retVal, err := service.StopService()
198187
if err != nil || (retVal != stopServiceErrorCodeAccepted && retVal != stopServiceErrorCodeStopPending) {
199188
if retVal == stopServiceErrorCodeDependentRunning {
@@ -204,13 +193,13 @@ func (impl APIImplementor) stopSingleService(name string) (bool, error) {
204193
}
205194
return nil
206195
}
207-
serviceStoppedCheck := func() (bool, string, ServiceInterface, error) {
196+
serviceStoppedCheck := func() (bool, string, cim.ServiceInterface, error) {
208197
service, err := impl.serviceFactory.GetService(name)
209198
if err != nil {
210199
return false, "", nil, err
211200
}
212201

213-
state, err := service.GetPropertyState()
202+
state, err := cim.GetServiceState(service)
214203
if err != nil {
215204
return false, state, service, err
216205
}
@@ -251,42 +240,6 @@ func (impl APIImplementor) StopService(name string, force bool) error {
251240
return nil
252241
}
253242

254-
type Win32Service struct {
255-
*cimv2.Win32_Service
256-
}
257-
258-
func (s *Win32Service) GetDependents() ([]ServiceInterface, error) {
259-
collection, err := s.GetAssociated("Win32_DependentService", "Win32_Service", "Dependent", "Antecedent")
260-
if err != nil {
261-
return nil, err
262-
}
263-
264-
var result []ServiceInterface
265-
for _, coll := range collection {
266-
service, err := cimv2.NewWin32_ServiceEx1(coll)
267-
if err != nil {
268-
return nil, err
269-
}
270-
271-
result = append(result, &Win32Service{
272-
service,
273-
})
274-
}
275-
return result, nil
276-
}
277-
278-
type Win32ServiceFactory struct {
279-
}
280-
281-
func (impl Win32ServiceFactory) GetService(name string) (ServiceInterface, error) {
282-
service, err := cim.QueryServiceByName(name, nil)
283-
if err != nil {
284-
return nil, err
285-
}
286-
287-
return &Win32Service{Win32_Service: service}, nil
288-
}
289-
290243
type ServiceManagerImpl struct {
291244
serviceFactory ServiceFactory
292245
}
@@ -329,7 +282,7 @@ func (impl ServiceManagerImpl) WaitUntilServiceState(stateTransition stateTransi
329282

330283
func (impl ServiceManagerImpl) GetDependentsForService(name string) ([]string, error) {
331284
var serviceNames []string
332-
var servicesToCheck []ServiceInterface
285+
var servicesToCheck []cim.ServiceInterface
333286
servicesByName := map[string]string{}
334287

335288
service, err := impl.serviceFactory.GetService(name)
@@ -343,12 +296,12 @@ func (impl ServiceManagerImpl) GetDependentsForService(name string) ([]string, e
343296
service = servicesToCheck[i]
344297
i += 1
345298

346-
serviceName, err := service.GetPropertyName()
299+
serviceName, err := cim.GetServiceName(service)
347300
if err != nil {
348301
return serviceNames, err
349302
}
350303

351-
currentState, err := service.GetPropertyState()
304+
currentState, err := cim.GetServiceState(service)
352305
if err != nil {
353306
return serviceNames, err
354307
}

0 commit comments

Comments
 (0)