From 5e63dcba0ab16ed685a0fa32b6654e037d8b32fb Mon Sep 17 00:00:00 2001
From: Jessica Yuen <im.jessicayuen@gmail.com>
Date: Tue, 19 Sep 2017 10:38:37 -0700
Subject: [PATCH] Logging for env subcommands

This commit will add logging to all env subcommands 'list', 'set',
'add', and 'rm'. It adds both Info level and Debug level logging.

Fixes #137
---
 metadata/environment.go | 57 ++++++++++++++++++++++++++++++++++++-----
 pkg/kubecfg/env.go      |  3 +++
 2 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/metadata/environment.go b/metadata/environment.go
index 9eaa66bb..d0c2baab 100644
--- a/metadata/environment.go
+++ b/metadata/environment.go
@@ -23,6 +23,7 @@ import (
 	"regexp"
 	"strings"
 
+	log "github.com/sirupsen/logrus"
 	"github.com/spf13/afero"
 
 	"github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet"
@@ -53,15 +54,21 @@ type EnvironmentSpec struct {
 func (m *manager) CreateEnvironment(name, uri string, spec ClusterSpec) error {
 	extensionsLibData, k8sLibData, specData, err := m.generateKsonnetLibData(spec)
 	if err != nil {
+		log.Debugf("Failed to write '%s'", specFilename)
 		return err
 	}
 
-	return m.createEnvironment(name, uri, extensionsLibData, k8sLibData, specData)
+	err = m.createEnvironment(name, uri, extensionsLibData, k8sLibData, specData)
+	if err == nil {
+		log.Infof("Environment '%s' pointing to cluster at URI '%s' successfully created", name, uri)
+	}
+	return err
 }
 
 func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibData, specData []byte) error {
 	exists, err := m.environmentExists(name)
 	if err != nil {
+		log.Debug("Failed to check whether environment exists")
 		return err
 	}
 	if exists {
@@ -73,28 +80,38 @@ func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibD
 		return fmt.Errorf("Environment '%s' is not valid; must not contain punctuation or trailing slashes", name)
 	}
 
+	log.Infof("Creating environment '%s' with uri '%s'", name, uri)
+
 	envPath := appendToAbsPath(m.environmentsPath, name)
 	err = m.appFS.MkdirAll(string(envPath), defaultPermissions)
 	if err != nil {
 		return err
 	}
 
+	log.Infof("Generating environment metadata at path '%s'", envPath)
+
 	// Generate the schema file.
+	log.Debugf("Generating '%s', length: %d", schemaFilename, len(specData))
 	schemaPath := appendToAbsPath(envPath, schemaFilename)
 	err = afero.WriteFile(m.appFS, string(schemaPath), specData, defaultPermissions)
 	if err != nil {
+		log.Debugf("Failed to write '%s'", schemaFilename)
 		return err
 	}
 
+	log.Debugf("Generating '%s', length: %d", k8sLibFilename, len(k8sLibData))
 	k8sLibPath := appendToAbsPath(envPath, k8sLibFilename)
 	err = afero.WriteFile(m.appFS, string(k8sLibPath), k8sLibData, defaultPermissions)
 	if err != nil {
+		log.Debugf("Failed to write '%s'", k8sLibFilename)
 		return err
 	}
 
+	log.Debugf("Generating '%s', length: %d", extensionsLibFilename, len(extensionsLibData))
 	extensionsLibPath := appendToAbsPath(envPath, extensionsLibFilename)
 	err = afero.WriteFile(m.appFS, string(extensionsLibPath), extensionsLibData, defaultPermissions)
 	if err != nil {
+		log.Debugf("Failed to write '%s'", extensionsLibFilename)
 		return err
 	}
 
@@ -104,6 +121,7 @@ func (m *manager) createEnvironment(name, uri string, extensionsLibData, k8sLibD
 		return err
 	}
 
+	log.Debugf("Generating '%s', length: %d", specFilename, len(envSpecData))
 	envSpecPath := appendToAbsPath(envPath, specFilename)
 	return afero.WriteFile(m.appFS, string(envSpecPath), envSpecData, defaultPermissions)
 }
@@ -114,19 +132,24 @@ func (m *manager) DeleteEnvironment(name string) error {
 	// Check whether this environment exists
 	envExists, err := m.environmentExists(name)
 	if err != nil {
+		log.Debug("Failed to check whether environment exists")
 		return err
 	}
 	if !envExists {
 		return fmt.Errorf("Environment '%s' does not exist", name)
 	}
 
+	log.Infof("Deleting environment '%s' at path '%s'", name, envPath)
+
 	// Remove the directory and all files within the environment path.
 	err = m.appFS.RemoveAll(envPath)
 	if err != nil {
+		log.Debugf("Failed to remove environment directory at path '%s'", envPath)
 		return err
 	}
 
 	// Need to ensure empty parent directories are also removed.
+	log.Debug("Removing empty parent directories, if any")
 	parentDir := name
 	for parentDir != "." {
 		parentDir = filepath.Dir(parentDir)
@@ -134,9 +157,11 @@ func (m *manager) DeleteEnvironment(name string) error {
 
 		isEmpty, err := afero.IsEmpty(m.appFS, parentPath)
 		if err != nil {
+			log.Debugf("Failed to check whether parent directory at path '%s' is empty", parentPath)
 			return err
 		}
 		if isEmpty {
+			log.Debugf("Failed to remove parent directory at path '%s'", parentPath)
 			err := m.appFS.RemoveAll(parentPath)
 			if err != nil {
 				return err
@@ -144,15 +169,18 @@ func (m *manager) DeleteEnvironment(name string) error {
 		}
 	}
 
+	log.Infof("Successfully removed environment '%s'", name)
 	return nil
 }
 
 func (m *manager) GetEnvironments() ([]Environment, error) {
 	envs := []Environment{}
 
+	log.Info("Retrieving all environments")
 	err := afero.Walk(m.appFS, string(m.environmentsPath), func(path string, f os.FileInfo, err error) error {
 		isDir, err := afero.IsDir(m.appFS, path)
 		if err != nil {
+			log.Debugf("Failed to check whether the path at '%s' is a directory", path)
 			return err
 		}
 
@@ -161,20 +189,24 @@ func (m *manager) GetEnvironments() ([]Environment, error) {
 			specPath := filepath.Join(path, specFilename)
 			specFileExists, err := afero.Exists(m.appFS, specPath)
 			if err != nil {
+				log.Debugf("Failed to check whether spec file at '$s' exists", specPath)
 				return err
 			}
 			if specFileExists {
 				envName := filepath.Clean(strings.TrimPrefix(path, string(m.environmentsPath)+"/"))
 				specFile, err := afero.ReadFile(m.appFS, specPath)
 				if err != nil {
+					log.Debugf("Failed to read spec file at path '%s'", specPath)
 					return err
 				}
 				var envSpec EnvironmentSpec
 				err = json.Unmarshal(specFile, &envSpec)
 				if err != nil {
+					log.Debugf("Failed to convert the spec file at path '%s' to JSON", specPath)
 					return err
 				}
 
+				log.Debugf("Found environment '%s', with uri '%s", envName, envSpec.URI)
 				envs = append(envs, Environment{Name: envName, Path: path, URI: envSpec.URI})
 			}
 		}
@@ -193,16 +225,13 @@ func (m *manager) SetEnvironment(name string, desired Environment) error {
 	// Check whether this environment exists
 	envExists, err := m.environmentExists(name)
 	if err != nil {
+		log.Debugf("Failed to check whether '%s' exists", name)
 		return err
 	}
 	if !envExists {
 		return fmt.Errorf("Environment '%s' does not exist", name)
 	}
 
-	if name == desired.Name {
-		return nil
-	}
-
 	// ensure new environment name does not contain punctuation
 	if !isValidName(desired.Name) {
 		return fmt.Errorf("Environment '%s' is not valid; must not contain punctuation or trailing slashes", desired.Name)
@@ -210,10 +239,13 @@ func (m *manager) SetEnvironment(name string, desired Environment) error {
 
 	// If the name has changed, the directory location needs to be moved to
 	// reflect the change.
-	if len(desired.Name) != 0 {
+	if name != desired.Name && len(desired.Name) != 0 {
+		log.Infof("Setting environment name from '%s' to '%s'", name, desired.Name)
+
 		// Ensure not overwriting another environment
 		desiredExists, err := m.environmentExists(desired.Name)
 		if err != nil {
+			log.Debugf("Failed to check whether environment '%s' already exists", desired.Name)
 			return err
 		}
 		if desiredExists {
@@ -223,8 +255,10 @@ func (m *manager) SetEnvironment(name string, desired Environment) error {
 		// Move the directory
 		pathOld := string(appendToAbsPath(m.environmentsPath, name))
 		pathNew := string(appendToAbsPath(m.environmentsPath, desired.Name))
+		log.Debugf("Moving directory at path '%s' to '%s'", pathOld, pathNew)
 		err = m.appFS.Rename(pathOld, pathNew)
 		if err != nil {
+			log.Debugf("Failed to move path '%s' to '%s", pathOld, pathNew)
 			return err
 		}
 
@@ -233,16 +267,25 @@ func (m *manager) SetEnvironment(name string, desired Environment) error {
 
 	// Update fields in spec.json
 	if len(desired.URI) != 0 {
+		log.Infof("Setting environment URI to '%s'", desired.URI)
+
 		newSpec, err := generateSpecData(desired.URI)
 		if err != nil {
+			log.Debugf("Failed to generate %s with URI '%s'", specFilename, desired.URI)
 			return err
 		}
 
 		envPath := appendToAbsPath(m.environmentsPath, name)
 		specPath := appendToAbsPath(envPath, specFilename)
-		return afero.WriteFile(m.appFS, string(specPath), newSpec, defaultPermissions)
+
+		err = afero.WriteFile(m.appFS, string(specPath), newSpec, defaultPermissions)
+		if err != nil {
+			log.Debugf("Failed to write %s at path '%s'", specFilename, specPath)
+			return err
+		}
 	}
 
+	log.Infof("Successfully updated environment '%s'", name)
 	return nil
 }
 
diff --git a/pkg/kubecfg/env.go b/pkg/kubecfg/env.go
index d43592c7..7c86c2b8 100644
--- a/pkg/kubecfg/env.go
+++ b/pkg/kubecfg/env.go
@@ -21,6 +21,8 @@ import (
 	"sort"
 	"strings"
 
+	log "github.com/sirupsen/logrus"
+
 	"github.com/ksonnet/kubecfg/metadata"
 )
 
@@ -37,6 +39,7 @@ func NewEnvAddCmd(name, uri, specFlag string, rootPath metadata.AbsPath) (*EnvAd
 	if err != nil {
 		return nil, err
 	}
+	log.Debugf("Generating ksonnetLib data with spec: %s", specFlag)
 
 	return &EnvAddCmd{name: name, uri: uri, spec: spec, rootPath: rootPath}, nil
 }
-- 
GitLab