From 2f3811aeb8a3299a84a19bdac503a6155549c676 Mon Sep 17 00:00:00 2001
From: capossele <angelocapossele@gmail.com>
Date: Thu, 20 Feb 2020 17:34:30 +0000
Subject: [PATCH] :sparkles: adds config plugin

---
 packages/binary/tangle/tangle.go      | 11 ++---
 packages/binary/tangle/tangle_test.go | 16 ++++++-
 plugins/config/config.go              | 64 +++++++++++++++++++++++++++
 plugins/config/plugin.go              | 12 +++++
 4 files changed, 96 insertions(+), 7 deletions(-)
 create mode 100644 plugins/config/config.go
 create mode 100644 plugins/config/plugin.go

diff --git a/packages/binary/tangle/tangle.go b/packages/binary/tangle/tangle.go
index 9033cfdd..18593704 100644
--- a/packages/binary/tangle/tangle.go
+++ b/packages/binary/tangle/tangle.go
@@ -4,6 +4,7 @@ import (
 	"container/list"
 	"time"
 
+	"github.com/dgraph-io/badger/v2"
 	"github.com/iotaledger/hive.go/types"
 
 	"github.com/iotaledger/goshimmer/packages/binary/storageprefix"
@@ -37,13 +38,13 @@ type Tangle struct {
 }
 
 // Constructor for the tangle.
-func New(storageId []byte) (result *Tangle) {
+func New(badgerInstance *badger.DB, storageId []byte) (result *Tangle) {
 	result = &Tangle{
 		storageId:                  storageId,
-		transactionStorage:         objectstorage.New(append(storageId, storageprefix.TangleTransaction...), transaction.FromStorage),
-		transactionMetadataStorage: objectstorage.New(append(storageId, storageprefix.TangleTransactionMetadata...), transactionmetadata.FromStorage),
-		approverStorage:            objectstorage.New(append(storageId, storageprefix.TangleApprovers...), approver.FromStorage, objectstorage.PartitionKey(transaction.IdLength, transaction.IdLength)),
-		missingTransactionsStorage: objectstorage.New(append(storageId, storageprefix.TangleMissingTransaction...), missingtransaction.FromStorage),
+		transactionStorage:         objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleTransaction...), transaction.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)),
+		transactionMetadataStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleTransactionMetadata...), transactionmetadata.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)),
+		approverStorage:            objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleApprovers...), approver.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.PartitionKey(transaction.IdLength, transaction.IdLength), objectstorage.LeakDetectionEnabled(false)),
+		missingTransactionsStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleMissingTransaction...), missingtransaction.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)),
 
 		Events: *newEvents(),
 	}
diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go
index 33420e87..c8ff887c 100644
--- a/packages/binary/tangle/tangle_test.go
+++ b/packages/binary/tangle/tangle_test.go
@@ -5,16 +5,28 @@ import (
 	"testing"
 	"time"
 
+	"github.com/dgraph-io/badger/v2"
 	"github.com/iotaledger/hive.go/events"
 
+	"github.com/iotaledger/hive.go/database"
+
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
+	"github.com/iotaledger/goshimmer/plugins/config"
 )
 
+var testDatabase *badger.DB
+
+var _ = config.PLUGIN
+
+func init() {
+	testDatabase = database.GetBadgerInstance()
+}
+
 func BenchmarkTangle_AttachTransaction(b *testing.B) {
-	tangle := New([]byte("TEST_BINARY_TANGLE"))
+	tangle := New(testDatabase, []byte("TEST_BINARY_TANGLE"))
 	if err := tangle.Prune(); err != nil {
 		b.Error(err)
 
@@ -39,7 +51,7 @@ func BenchmarkTangle_AttachTransaction(b *testing.B) {
 }
 
 func TestTangle_AttachTransaction(t *testing.T) {
-	tangle := New([]byte("TEST_BINARY_TANGLE"))
+	tangle := New(testDatabase, []byte("TEST_BINARY_TANGLE"))
 	if err := tangle.Prune(); err != nil {
 		t.Error(err)
 
diff --git a/plugins/config/config.go b/plugins/config/config.go
new file mode 100644
index 00000000..70513880
--- /dev/null
+++ b/plugins/config/config.go
@@ -0,0 +1,64 @@
+package config
+
+import (
+	"github.com/iotaledger/hive.go/logger"
+	"github.com/iotaledger/hive.go/node"
+	"github.com/iotaledger/hive.go/parameter"
+	flag "github.com/spf13/pflag"
+	"github.com/spf13/viper"
+)
+
+var (
+	// flags
+	configName    = flag.StringP("config", "c", "config", "Filename of the config file without the file extension")
+	configDirPath = flag.StringP("config-dir", "d", ".", "Path to the directory containing the config file")
+
+	// viper
+	NodeConfig *viper.Viper
+
+	// logger
+	defaultLoggerConfig = logger.Config{
+		Level:             "info",
+		DisableCaller:     false,
+		DisableStacktrace: false,
+		Encoding:          "console",
+		OutputPaths:       []string{"goshimmer.log"},
+		DisableEvents:     false,
+	}
+)
+
+func init() {
+	// set the default logger config
+	NodeConfig = viper.New()
+	NodeConfig.SetDefault(logger.ViperKey, defaultLoggerConfig)
+
+	if err := Fetch(false); err != nil {
+		panic(err)
+	}
+	parseParameters()
+}
+
+func parseParameters() {
+	for _, pluginName := range NodeConfig.GetStringSlice(node.CFG_DISABLE_PLUGINS) {
+		node.DisabledPlugins[node.GetPluginIdentifier(pluginName)] = true
+	}
+	for _, pluginName := range NodeConfig.GetStringSlice(node.CFG_ENABLE_PLUGINS) {
+		node.EnabledPlugins[node.GetPluginIdentifier(pluginName)] = true
+	}
+}
+
+// Fetch fetches config values from a dir defined via CLI flag --config-dir (or the current working dir if not set).
+//
+// It automatically reads in a single config file starting with "config" (can be changed via the --config CLI flag)
+// and ending with: .json, .toml, .yaml or .yml (in this sequence).
+func Fetch(printConfig bool, ignoreSettingsAtPrint ...[]string) error {
+	err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, true)
+	if err != nil {
+		return err
+	}
+
+	if printConfig {
+		parameter.PrintConfig(NodeConfig, ignoreSettingsAtPrint...)
+	}
+	return nil
+}
diff --git a/plugins/config/plugin.go b/plugins/config/plugin.go
new file mode 100644
index 00000000..0626fa17
--- /dev/null
+++ b/plugins/config/plugin.go
@@ -0,0 +1,12 @@
+package config
+
+import (
+	"github.com/iotaledger/hive.go/node"
+)
+
+// define the plugin as a placeholder, so the init methods get executed accordingly
+var PLUGIN = node.NewPlugin("Config", node.Enabled, run)
+
+func run(ctx *node.Plugin) {
+	// do nothing; everything is handled in the init method
+}
-- 
GitLab