[VOL-2899] Added loglevel listpackage command to voltctl for
displaying list of configured log packages.

Also added support for auto-complete of component name

Change-Id: I8c3dedd2f62eeed3da6e37de2e070683795ed8c2
diff --git a/VERSION b/VERSION
index ff365e0..0aec50e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.1.3
+3.1.4
diff --git a/pkg/config/configmanager.go b/pkg/config/configmanager.go
index 724ad32..0dafc7a 100644
--- a/pkg/config/configmanager.go
+++ b/pkg/config/configmanager.go
@@ -36,11 +36,12 @@
 
 const (
 	ConfigTypeLogLevel ConfigType = iota
+	ConfigTypeMetadata
 	ConfigTypeKafka
 )
 
 func (c ConfigType) String() string {
-	return [...]string{"loglevel", "kafka"}[c]
+	return [...]string{"loglevel", "metadata", "kafka"}[c]
 }
 
 // ChangeEvent represents the event recieved from watch
diff --git a/pkg/config/logcontroller.go b/pkg/config/logcontroller.go
index 9c36241..b00569f 100644
--- a/pkg/config/logcontroller.go
+++ b/pkg/config/logcontroller.go
@@ -28,13 +28,15 @@
 	"errors"
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 	"os"
+	"sort"
 	"strings"
 )
 
 const (
-	defaultLogLevelKey                = "default" // kvstore key containing default loglevel
-	globalConfigRootNode              = "global"  // Root Node in kvstore containing global config
-	initialGlobalDefaultLogLevelValue = "WARN"    // Hard-coded Global Default loglevel pushed at PoD startup
+	defaultLogLevelKey                = "default"          // kvstore key containing default loglevel
+	globalConfigRootNode              = "global"           // Root Node in kvstore containing global config
+	initialGlobalDefaultLogLevelValue = "WARN"             // Hard-coded Global Default loglevel pushed at PoD startup
+	logPackagesListKey                = "log_package_list" // kvstore key containing list of allowed log packages
 )
 
 // ComponentLogController represents a Configuration for Logging Config of specific Voltha component type
@@ -92,6 +94,8 @@
 
 	cc.persistInitialDefaultLogConfigs(ctx)
 
+	cc.persistRegisteredLogPackageList(ctx)
+
 	cc.processLogConfig(ctx)
 }
 
@@ -120,6 +124,28 @@
 	}
 }
 
+// Method to save list of all registered packages for component into config kvstore. A single string
+// is constructed with comma-separated package names in sorted order and persisted
+func (c *ComponentLogController) persistRegisteredLogPackageList(ctx context.Context) {
+
+	componentMetadataConfig := c.configManager.InitComponentConfig(c.ComponentName, ConfigTypeMetadata)
+	logger.Debugw("component-metadata-config", log.Fields{"component-metadata-config": componentMetadataConfig})
+
+	packageList := log.GetPackageNames()
+	packageList = append(packageList, defaultLogLevelKey)
+	sort.Strings(packageList)
+
+	packageNames, err := json.Marshal(packageList)
+	if err != nil {
+		logger.Errorw("failed-to-marshal-log-package-list-for-storage", log.Fields{"error": err, "packageList": packageList})
+		return
+	}
+
+	if err := componentMetadataConfig.Save(ctx, logPackagesListKey, string(packageNames)); err != nil {
+		logger.Errorw("failed-to-persist-component-registered-log-package-list-at-startup", log.Fields{"error": err, "packageNames": packageNames})
+	}
+}
+
 // ProcessLogConfig will first load and apply log config and then start waiting on component config and global config
 // channels for any changes. Event channel will be recieved from Backend for valid change type
 // Then data for componentn log config and global log config will be retrieved from Backend and stored in updatedLogConfig in precedence order