blob: 0ad067226b1b4d3863033134187c89121216c8b6 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package sdscompare
import (
"encoding/json"
"fmt"
"io"
"strings"
"text/tabwriter"
)
// SDSWriter takes lists of SecretItem or SecretItemDiff and prints them through supplied output writer
type SDSWriter interface {
PrintSecretItems([]SecretItem) error
PrintDiffs([]SecretItemDiff) error
}
type Format int
const (
JSON Format = iota
TABULAR
)
// NewSDSWriter generates a new instance which conforms to SDSWriter interface
func NewSDSWriter(w io.Writer, format Format) SDSWriter {
return &sdsWriter{
w: w,
output: format,
}
}
// sdsWriter is provided concrete implementation of SDSWriter
type sdsWriter struct {
w io.Writer
output Format
}
// PrintSecretItems uses the user supplied output format to determine how to display the diffed secrets
func (w *sdsWriter) PrintSecretItems(secrets []SecretItem) error {
var err error
switch w.output {
case JSON:
err = w.printSecretItemsJSON(secrets)
case TABULAR:
err = w.printSecretItemsTabular(secrets)
}
return err
}
var (
secretItemColumns = []string{"RESOURCE NAME", "TYPE", "STATUS", "VALID CERT", "SERIAL NUMBER", "NOT AFTER", "NOT BEFORE"}
secretDiffColumns = []string{"RESOURCE NAME", "TYPE", "VALID CERT", "NODE AGENT", "PROXY", "SERIAL NUMBER", "NOT AFTER", "NOT BEFORE"}
)
// printSecretItemsTabular prints the secret in table format
func (w *sdsWriter) printSecretItemsTabular(secrets []SecretItem) error {
if len(secrets) == 0 {
fmt.Fprintln(w.w, "No secret items to show.")
return nil
}
tw := new(tabwriter.Writer).Init(w.w, 0, 5, 5, ' ', 0)
fmt.Fprintln(tw, strings.Join(secretItemColumns, "\t"))
for _, s := range secrets {
fmt.Fprintf(tw, "%s\t%s\t%s\t%t\t%s\t%s\t%s\n",
s.Name, s.Type, s.State, s.Valid, s.SerialNumber, s.NotAfter, s.NotBefore)
}
return tw.Flush()
}
// printSecretItemsJSON prints secret in JSON format, and dumps the raw certificate data with the output
func (w *sdsWriter) printSecretItemsJSON(secrets []SecretItem) error {
out, err := json.MarshalIndent(secrets, "", " ")
if err != nil {
return err
}
_, err = w.w.Write(out)
if err != nil {
return err
}
return nil
}
// PrintDiffs uses the user supplied output format to determine how to display the diffed secrets
func (w *sdsWriter) PrintDiffs(statuses []SecretItemDiff) error {
var err error
switch w.output {
case JSON:
err = w.printDiffsJSON(statuses)
case TABULAR:
err = w.printDiffsTabular(statuses)
}
return err
}
// printsDiffsTabular prints the secret in table format
func (w *sdsWriter) printDiffsTabular(statuses []SecretItemDiff) error {
if len(statuses) == 0 {
fmt.Fprintln(w.w, "No secrets found to diff.")
return nil
}
tw := new(tabwriter.Writer).Init(w.w, 0, 5, 5, ' ', 0)
fmt.Fprintln(tw, strings.Join(secretDiffColumns, "\t"))
for _, status := range statuses {
fmt.Fprintf(tw, "%s\t%s\t%t\t%s\t%s\t%s\t%s\t%s\n",
status.Name, status.Type, status.Valid, status.Source, status.Proxy, status.SerialNumber, status.NotAfter, status.NotBefore)
}
return tw.Flush()
}
// printDiffsJSON prints secret in JSON format, and dumps the raw certificate data with the output
func (w *sdsWriter) printDiffsJSON(statuses []SecretItemDiff) error {
out, err := json.MarshalIndent(statuses, "", " ")
if err != nil {
return err
}
_, err = w.w.Write(out)
if err != nil {
return err
}
return nil
}