Skip to content

Commit e8e9f28

Browse files
Merge pull request #4330 from pmtk/go-healthcheck/fix-lvms-conditions
USHIFT-5219: microshift healthcheck - extend the decision for expecting LVMS
2 parents 6c47289 + 903cf45 commit e8e9f28

File tree

2 files changed

+83
-8
lines changed

2 files changed

+83
-8
lines changed

pkg/cmd/healthcheck.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"context"
55
"fmt"
6+
"os"
67
"time"
78

89
"github.com/openshift/microshift/pkg/healthcheck"
@@ -39,6 +40,10 @@ Checking health of a custom workloads can be achieved in two ways:
3940
`,
4041

4142
RunE: func(cmd *cobra.Command, args []string) error {
43+
if os.Geteuid() > 0 {
44+
return fmt.Errorf("command must be run with root privileges")
45+
}
46+
4247
if namespace != "" && custom != "" {
4348
return fmt.Errorf("only --namespace or --custom can be provided")
4449
}

pkg/healthcheck/microshift_core_workloads.go

Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package healthcheck
22

33
import (
4+
"bytes"
5+
"encoding/json"
6+
"os/exec"
7+
48
"github.com/openshift/microshift/pkg/config"
9+
"github.com/openshift/microshift/pkg/util"
510
"k8s.io/klog/v2"
611
)
712

@@ -14,9 +19,6 @@ func getCoreMicroShiftWorkloads() (map[string]NamespaceWorkloads, error) {
1419
}
1520

1621
workloads := map[string]NamespaceWorkloads{
17-
"openshift-ovn-kubernetes": {
18-
DaemonSets: []string{"ovnkube-master", "ovnkube-node"},
19-
},
2022
"openshift-service-ca": {
2123
Deployments: []string{"service-ca"},
2224
},
@@ -30,15 +32,82 @@ func getCoreMicroShiftWorkloads() (map[string]NamespaceWorkloads, error) {
3032
},
3133
},
3234
}
33-
fillOptionalWorkloadsIfApplicable(cfg, workloads)
35+
if cfg.Network.IsEnabled() {
36+
workloads["openshift-ovn-kubernetes"] = NamespaceWorkloads{
37+
DaemonSets: []string{"ovnkube-master", "ovnkube-node"},
38+
}
39+
}
40+
if err := fillOptionalWorkloadsIfApplicable(cfg, workloads); err != nil {
41+
return nil, err
42+
}
3443

3544
return workloads, nil
3645
}
3746

38-
func fillOptionalWorkloadsIfApplicable(cfg *config.Config, workloads map[string]NamespaceWorkloads) {
39-
klog.V(2).Infof("Configured storage driver value: %q", string(cfg.Storage.Driver))
40-
if cfg.Storage.IsEnabled() {
41-
klog.Infof("LVMS is enabled")
47+
func lvmsIsExpected(cfg *config.Config) (bool, error) {
48+
cfgFile := "/etc/microshift/lvmd.yaml"
49+
if exists, err := util.PathExists(cfgFile); err != nil {
50+
return false, err
51+
} else if exists {
52+
klog.Infof("%s exists - expecting LVMS to be deployed", cfgFile)
53+
return true, nil
54+
}
55+
56+
if !cfg.Storage.IsEnabled() {
57+
klog.Infof("LVMS is disabled via config. Configured value: %q", string(cfg.Storage.Driver))
58+
return false, nil
59+
}
60+
61+
cmd := exec.Command("vgs", "--readonly", "--options=name", "--reportformat=json")
62+
output, err := cmd.Output()
63+
if err != nil {
64+
return false, err
65+
}
66+
out := &bytes.Buffer{}
67+
err = json.Compact(out, output)
68+
if err != nil {
69+
klog.Errorf("Failed to compact 'vgs' output: %s", string(output))
70+
} else {
71+
klog.V(2).Infof("vgs reported: %s", out.String())
72+
}
73+
74+
report := struct {
75+
Report []struct {
76+
VGs []struct {
77+
VGName string `json:"vg_name"`
78+
} `json:"vg"`
79+
} `json:"report"`
80+
}{}
81+
82+
err = json.Unmarshal(output, &report)
83+
if err != nil {
84+
return false, err
85+
}
86+
87+
if len(report.Report) == 0 || len(report.Report[0].VGs) == 0 {
88+
klog.Infof("Detected 0 volume groups - LVMS is not expected")
89+
return false, nil
90+
}
91+
92+
if len(report.Report[0].VGs) == 1 {
93+
klog.Infof("Detected 1 volume group (%s) - LVMS is expected", report.Report[0].VGs[0].VGName)
94+
return true, nil
95+
}
96+
97+
for _, vg := range report.Report[0].VGs {
98+
if vg.VGName == "microshift" {
99+
klog.Infof("Found volume group named 'microshift' - LVMS is expected")
100+
return true, nil
101+
}
102+
}
103+
104+
return false, nil
105+
}
106+
107+
func fillOptionalWorkloadsIfApplicable(cfg *config.Config, workloads map[string]NamespaceWorkloads) error {
108+
if expected, err := lvmsIsExpected(cfg); err != nil {
109+
return err
110+
} else if expected {
42111
workloads["openshift-storage"] = NamespaceWorkloads{
43112
DaemonSets: []string{"vg-manager"},
44113
Deployments: []string{"lvms-operator"},
@@ -50,6 +119,7 @@ func fillOptionalWorkloadsIfApplicable(cfg *config.Config, workloads map[string]
50119
Deployments: comps,
51120
}
52121
}
122+
return nil
53123
}
54124

55125
func getExpectedCSIComponents(cfg *config.Config) []string {

0 commit comments

Comments
 (0)