[VOL-2356]core log_level command line argument should take log level names not int value

- StringToInt method returns an error message when invalid loglevel is passed.

Change-Id: If567c0a6800da91a77e8be205de8c01b4f22271b
diff --git a/VERSION b/VERSION
index a909317..d5401ed 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.0.10
+3.0.11-dev
diff --git a/pkg/log/log.go b/pkg/log/log.go
index 43567e3..6b07693 100644
--- a/pkg/log/log.go
+++ b/pkg/log/log.go
@@ -50,9 +50,11 @@
 	"strings"
 )
 
+type LogLevel int8
+
 const (
 	// DebugLevel logs a message at debug level
-	DebugLevel = iota
+	DebugLevel = LogLevel(iota)
 	// InfoLevel logs a message at info level
 	InfoLevel
 	// WarnLevel logs a message at warning level
@@ -109,7 +111,7 @@
 	V(l int) bool
 
 	//Returns the log level of this specific logger
-	GetLogLevel() int
+	GetLogLevel() LogLevel
 }
 
 // Fields is used as key-value pairs for structured logging
@@ -127,7 +129,7 @@
 	packageName string
 }
 
-func intToAtomicLevel(l int) zp.AtomicLevel {
+func logLevelToAtomicLevel(l LogLevel) zp.AtomicLevel {
 	switch l {
 	case DebugLevel:
 		return zp.NewAtomicLevelAt(zc.DebugLevel)
@@ -143,7 +145,7 @@
 	return zp.NewAtomicLevelAt(zc.ErrorLevel)
 }
 
-func intToLevel(l int) zc.Level {
+func logLevelToLevel(l LogLevel) zc.Level {
 	switch l {
 	case DebugLevel:
 		return zc.DebugLevel
@@ -159,7 +161,7 @@
 	return zc.ErrorLevel
 }
 
-func levelToInt(l zc.Level) int {
+func levelToLogLevel(l zc.Level) LogLevel {
 	switch l {
 	case zc.DebugLevel:
 		return DebugLevel
@@ -175,25 +177,25 @@
 	return ErrorLevel
 }
 
-func StringToInt(l string) int {
-	switch l {
+func StringToLogLevel(l string) (LogLevel, error) {
+	switch strings.ToUpper(l) {
 	case "DEBUG":
-		return DebugLevel
+		return DebugLevel, nil
 	case "INFO":
-		return InfoLevel
+		return InfoLevel, nil
 	case "WARN":
-		return WarnLevel
+		return WarnLevel, nil
 	case "ERROR":
-		return ErrorLevel
+		return ErrorLevel, nil
 	case "FATAL":
-		return FatalLevel
+		return FatalLevel, nil
 	}
-	return ErrorLevel
+	return 0, errors.New("Given LogLevel is invalid : " + l)
 }
 
-func getDefaultConfig(outputType string, level int, defaultFields Fields) zp.Config {
+func getDefaultConfig(outputType string, level LogLevel, defaultFields Fields) zp.Config {
 	return zp.Config{
-		Level:            intToAtomicLevel(level),
+		Level:            logLevelToAtomicLevel(level),
 		Encoding:         outputType,
 		Development:      true,
 		OutputPaths:      []string{"stdout"},
@@ -215,7 +217,7 @@
 
 // SetLogger needs to be invoked before the logger API can be invoked.  This function
 // initialize the default logger (zap's sugaredlogger)
-func SetDefaultLogger(outputType string, level int, defaultFields Fields) (Logger, error) {
+func SetDefaultLogger(outputType string, level LogLevel, defaultFields Fields) (Logger, error) {
 	// Build a custom config using zap
 	cfg = getDefaultConfig(outputType, level, defaultFields)
 
@@ -241,7 +243,7 @@
 // be available to it, notably log tracing with filename.functionname.linenumber annotation.
 //
 // pkgNames parameter should be used for testing only as this function detects the caller's package.
-func AddPackage(outputType string, level int, defaultFields Fields, pkgNames ...string) (Logger, error) {
+func AddPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (Logger, error) {
 	if cfgs == nil {
 		cfgs = make(map[string]zp.Config)
 	}
@@ -347,7 +349,7 @@
 	return loggers[pkgName], nil
 }
 
-func setLevel(cfg zp.Config, level int) {
+func setLevel(cfg zp.Config, level LogLevel) {
 	switch level {
 	case DebugLevel:
 		cfg.Level.SetLevel(zc.DebugLevel)
@@ -366,7 +368,7 @@
 
 //SetPackageLogLevel dynamically sets the log level of a given package to level.  This is typically invoked at an
 // application level during debugging
-func SetPackageLogLevel(packageName string, level int) {
+func SetPackageLogLevel(packageName string, level LogLevel) {
 	// Get proper config
 	if cfg, ok := cfgs[packageName]; ok {
 		setLevel(cfg, level)
@@ -374,7 +376,7 @@
 }
 
 //SetAllLogLevel sets the log level of all registered packages to level
-func SetAllLogLevel(level int) {
+func SetAllLogLevel(level LogLevel) {
 	// Get proper config
 	for _, cfg := range cfgs {
 		setLevel(cfg, level)
@@ -382,7 +384,7 @@
 }
 
 //GetPackageLogLevel returns the current log level of a package.
-func GetPackageLogLevel(packageName ...string) (int, error) {
+func GetPackageLogLevel(packageName ...string) (LogLevel, error) {
 	var name string
 	if len(packageName) == 1 {
 		name = packageName[0]
@@ -390,18 +392,18 @@
 		name, _, _, _ = getCallerInfo()
 	}
 	if cfg, ok := cfgs[name]; ok {
-		return levelToInt(cfg.Level.Level()), nil
+		return levelToLogLevel(cfg.Level.Level()), nil
 	}
 	return 0, errors.New(fmt.Sprintf("unknown-package-%s", name))
 }
 
 //GetDefaultLogLevel gets the log level used for packages that don't have specific loggers
-func GetDefaultLogLevel() int {
-	return levelToInt(cfg.Level.Level())
+func GetDefaultLogLevel() LogLevel {
+	return levelToLogLevel(cfg.Level.Level())
 }
 
 //SetLogLevel sets the log level for the logger corresponding to the caller's package
-func SetLogLevel(level int) error {
+func SetLogLevel(level LogLevel) error {
 	pkgName, _, _, _ := getCallerInfo()
 	if _, exist := cfgs[pkgName]; !exist {
 		return errors.New(fmt.Sprintf("unregistered-package-%s", pkgName))
@@ -412,7 +414,7 @@
 }
 
 //SetDefaultLogLevel sets the log level used for packages that don't have specific loggers
-func SetDefaultLogLevel(level int) {
+func SetDefaultLogLevel(level LogLevel) {
 	setLevel(cfg, level)
 }
 
@@ -642,12 +644,12 @@
 
 // V reports whether verbosity level l is at least the requested verbose level.
 func (l logger) V(level int) bool {
-	return l.parent.Core().Enabled(intToLevel(level))
+	return l.parent.Core().Enabled(logLevelToLevel(LogLevel(level)))
 }
 
 // GetLogLevel returns the current level of the logger
-func (l logger) GetLogLevel() int {
-	return levelToInt(cfgs[l.packageName].Level.Level())
+func (l logger) GetLogLevel() LogLevel {
+	return levelToLogLevel(cfgs[l.packageName].Level.Level())
 }
 
 // With returns a logger initialized with the key-value pairs
@@ -781,6 +783,6 @@
 }
 
 //GetLogLevel returns the log level of the invoking package
-func GetLogLevel() int {
+func GetLogLevel() LogLevel {
 	return getPackageLevelLogger().GetLogLevel()
 }
diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go
index f32c55e..84a91d1 100644
--- a/pkg/log/log_test.go
+++ b/pkg/log/log_test.go
@@ -35,7 +35,7 @@
 }
 
 func verifyLogLevel(t *testing.T, minimumLevel int) {
-	SetAllLogLevel(minimumLevel)
+	SetAllLogLevel(LogLevel(minimumLevel))
 	var success bool
 	for i := 0; i < 5; i++ {
 		success = testLogger.V(i)
@@ -87,14 +87,14 @@
 	levels := []int{0, 1, 2, 3, 4}
 	for _, expectedLevel := range levels {
 		for _, name := range pkgNames {
-			SetPackageLogLevel(name, expectedLevel)
+			SetPackageLogLevel(name, LogLevel(expectedLevel))
 			l, err := GetPackageLogLevel(name)
 			assert.Nil(t, err)
-			assert.Equal(t, l, expectedLevel)
+			assert.Equal(t, l, LogLevel(expectedLevel))
 			// Get the package log level by invoking the specific logger created for this package
 			// This is a less expensive operation that the GetPackageLogLevel() request
 			level := myLoggers[name].GetLogLevel()
-			assert.Equal(t, level, expectedLevel)
+			assert.Equal(t, level, LogLevel(expectedLevel))
 			// Check the verbosity level
 			for _, level := range levels {
 				toDisplay := myLoggers[name].V(level)
@@ -108,13 +108,13 @@
 	}
 	//Test set all package level
 	for _, expectedLevel := range levels {
-		SetAllLogLevel(expectedLevel)
+		SetAllLogLevel(LogLevel(expectedLevel))
 		for _, name := range pkgNames {
 			l, err := GetPackageLogLevel(name)
 			assert.Nil(t, err)
-			assert.Equal(t, l, expectedLevel)
+			assert.Equal(t, l, LogLevel(expectedLevel))
 			level := myLoggers[name].GetLogLevel()
-			assert.Equal(t, level, expectedLevel)
+			assert.Equal(t, level, LogLevel(expectedLevel))
 			// Check the verbosity level
 			for _, level := range levels {
 				toDisplay := myLoggers[name].V(level)