Skip to content

Commit c3460fc

Browse files
authored
Add "k3s certificate check" clause for better test coverage (#11485)
* Add "k3s certificate check" clause for better test coverage Signed-off-by: Derek Nola <[email protected]> * Add table support to cert check Signed-off-by: Derek Nola <[email protected]> --------- Signed-off-by: Derek Nola <[email protected]>
1 parent 2f432a1 commit c3460fc

File tree

3 files changed

+71
-22
lines changed

3 files changed

+71
-22
lines changed

Diff for: pkg/cli/cert/cert.go

+51-17
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77
"path/filepath"
88
"strings"
9+
"text/tabwriter"
910
"time"
1011

1112
"github.com/k3s-io/k3s/pkg/agent/util"
@@ -92,27 +93,60 @@ func check(app *cli.Context, cfg *cmds.Server) error {
9293

9394
now := time.Now()
9495
warn := now.Add(time.Hour * 24 * config.CertificateRenewDays)
95-
96-
for service, files := range fileMap {
97-
logrus.Info("Checking certificates for " + service)
98-
for _, file := range files {
99-
// ignore errors, as some files may not exist, or may not contain certs.
100-
// Only check whatever exists and has certs.
101-
certs, _ := certutil.CertsFromFile(file)
102-
for _, cert := range certs {
103-
if now.Before(cert.NotBefore) {
104-
logrus.Errorf("%s: certificate %s is not valid before %s", file, cert.Subject, cert.NotBefore.Format(time.RFC3339))
105-
} else if now.After(cert.NotAfter) {
106-
logrus.Errorf("%s: certificate %s expired at %s", file, cert.Subject, cert.NotAfter.Format(time.RFC3339))
107-
} else if warn.After(cert.NotAfter) {
108-
logrus.Warnf("%s: certificate %s will expire within %d days at %s", file, cert.Subject, config.CertificateRenewDays, cert.NotAfter.Format(time.RFC3339))
109-
} else {
110-
logrus.Infof("%s: certificate %s is ok, expires at %s", file, cert.Subject, cert.NotAfter.Format(time.RFC3339))
96+
outFmt := app.String("output")
97+
switch outFmt {
98+
case "text":
99+
for service, files := range fileMap {
100+
logrus.Info("Checking certificates for " + service)
101+
for _, file := range files {
102+
// ignore errors, as some files may not exist, or may not contain certs.
103+
// Only check whatever exists and has certs.
104+
certs, _ := certutil.CertsFromFile(file)
105+
for _, cert := range certs {
106+
if now.Before(cert.NotBefore) {
107+
logrus.Errorf("%s: certificate %s is not valid before %s", file, cert.Subject, cert.NotBefore.Format(time.RFC3339))
108+
} else if now.After(cert.NotAfter) {
109+
logrus.Errorf("%s: certificate %s expired at %s", file, cert.Subject, cert.NotAfter.Format(time.RFC3339))
110+
} else if warn.After(cert.NotAfter) {
111+
logrus.Warnf("%s: certificate %s will expire within %d days at %s", file, cert.Subject, config.CertificateRenewDays, cert.NotAfter.Format(time.RFC3339))
112+
} else {
113+
logrus.Infof("%s: certificate %s is ok, expires at %s", file, cert.Subject, cert.NotAfter.Format(time.RFC3339))
114+
}
111115
}
112116
}
113117
}
118+
case "table":
119+
var tabBuffer bytes.Buffer
120+
w := tabwriter.NewWriter(&tabBuffer, 0, 0, 2, ' ', 0)
121+
fmt.Fprintf(w, "\n")
122+
fmt.Fprintf(w, "CERTIFICATE\tSUBJECT\tSTATUS\tEXPIRES\n")
123+
fmt.Fprintf(w, "-----------\t-------\t------\t-------")
124+
for _, files := range fileMap {
125+
for _, file := range files {
126+
certs, _ := certutil.CertsFromFile(file)
127+
for _, cert := range certs {
128+
baseName := filepath.Base(file)
129+
var status string
130+
expiration := cert.NotAfter.Format(time.RFC3339)
131+
if now.Before(cert.NotBefore) {
132+
status = "NOT YET VALID"
133+
expiration = cert.NotBefore.Format(time.RFC3339)
134+
} else if now.After(cert.NotAfter) {
135+
status = "EXPIRED"
136+
} else if warn.After(cert.NotAfter) {
137+
status = "WARNING"
138+
} else {
139+
status = "OK"
140+
}
141+
fmt.Fprintf(w, "\n%s\t%s\t%s\t%s", baseName, cert.Subject, status, expiration)
142+
}
143+
}
144+
}
145+
w.Flush()
146+
fmt.Println(tabBuffer.String())
147+
default:
148+
return fmt.Errorf("invalid output format %s", outFmt)
114149
}
115-
116150
return nil
117151
}
118152

Diff for: pkg/cli/cmds/certs.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ func NewCertCommands(check, rotate, rotateCA func(ctx *cli.Context) error) cli.C
6363
SkipFlagParsing: false,
6464
SkipArgReorder: true,
6565
Action: check,
66-
Flags: CertRotateCommandFlags,
66+
Flags: append(CertRotateCommandFlags, &cli.StringFlag{
67+
Name: "output,o",
68+
Usage: "Format output. Options: text, table",
69+
Value: "text",
70+
}),
6771
},
6872
{
6973
Name: "rotate",

Diff for: tests/integration/certrotation/certrotation_int_test.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ var _ = Describe("certificate rotation", Ordered, func() {
4646
certHash, err = testutil.RunCommand("md5sum " + tmpdDataDir + "/server/tls/serving-kube-apiserver.crt | cut -f 1 -d' '")
4747
Expect(err).ToNot(HaveOccurred())
4848
})
49-
It("stop k3s", func() {
49+
It("stops k3s", func() {
5050
Expect(testutil.K3sKillServer(server)).To(Succeed())
5151
})
52-
It("certificate rotate", func() {
52+
It("rotates certificates", func() {
5353
_, err := testutil.K3sCmd("certificate", "rotate", "-d", tmpdDataDir)
5454
Expect(err).ToNot(HaveOccurred())
5555

5656
})
57-
It("start k3s server", func() {
57+
It("starts k3s server", func() {
5858
var err error
5959
server2, err = testutil.K3sStartServer(serverArgs...)
6060
Expect(err).ToNot(HaveOccurred())
@@ -64,7 +64,18 @@ var _ = Describe("certificate rotation", Ordered, func() {
6464
return testutil.K3sDefaultDeployments()
6565
}, "360s", "5s").Should(Succeed())
6666
})
67-
It("get certificate hash", func() {
67+
It("checks the certificate status", func() {
68+
res, err := testutil.K3sCmd("certificate", "check", "-d", tmpdDataDir)
69+
Expect(err).ToNot(HaveOccurred())
70+
for i, line := range strings.Split(res, "\n") {
71+
// First line is just server info
72+
if i == 0 || line == "" {
73+
continue
74+
}
75+
Expect(line).To(MatchRegexp("certificate.*is ok|Checking certificates"), res)
76+
}
77+
})
78+
It("gets certificate hash", func() {
6879
// get md5sum of the CA certs
6980
var err error
7081
caCertHashAfter, err := testutil.RunCommand("md5sum " + tmpdDataDir + "/server/tls/client-ca.crt | cut -f 1 -d' '")

0 commit comments

Comments
 (0)