From 2020a8750ef55b2b3407889488c32abb762e507f Mon Sep 17 00:00:00 2001 From: Angelina Date: Wed, 20 Aug 2025 18:02:17 -0400 Subject: [PATCH 1/6] updating autoReload feature Signed-off-by: Angelina --- cmd/init.go | 1 + internal/stacks/stack_manager.go | 4 +++ internal/stacks/stack_manager_test.go | 41 +++++++++++++++++++++++++++ pkg/types/firefly_config.go | 1 + pkg/types/options.go | 1 + 5 files changed, 48 insertions(+) create mode 100644 internal/stacks/stack_manager_test.go diff --git a/cmd/init.go b/cmd/init.go index 34ed1c0..eaec327 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -335,5 +335,6 @@ func init() { initCmd.PersistentFlags().StringArrayVar(&initOptions.NodeNames, "node-name", []string{}, "Node name") initCmd.PersistentFlags().BoolVar(&initOptions.RemoteNodeDeploy, "remote-node-deploy", false, "Enable or disable deployment of FireFly contracts on remote nodes") initCmd.PersistentFlags().StringToStringVar(&initOptions.EnvironmentVars, "environment-vars", map[string]string{}, "Common environment variables to set on all containers in FireFly stack") + initCmd.Flags().BoolVar(&initOptions.EnableAutoReload, "auto-reload", true, "Enable config auto reload in generated FireFly configs") rootCmd.AddCommand(initCmd) } diff --git a/internal/stacks/stack_manager.go b/internal/stacks/stack_manager.go index 04582d3..3d0af97 100644 --- a/internal/stacks/stack_manager.go +++ b/internal/stacks/stack_manager.go @@ -459,6 +459,10 @@ func (s *StackManager) writeConfig(options *types.InitOptions) error { for _, member := range s.Stack.Members { config := core.NewFireflyConfig(s.Stack, member) + if options.EnableAutoReload { + config.AutoReload = true + } + // TODO: This code assumes that there is only one plugin instance per type. When we add support for // multiple namespaces, this code will likely have to change a lot blockchainConfig := s.blockchainProvider.GetBlockchainPluginConfig(s.Stack, member) diff --git a/internal/stacks/stack_manager_test.go b/internal/stacks/stack_manager_test.go new file mode 100644 index 0000000..dd322bb --- /dev/null +++ b/internal/stacks/stack_manager_test.go @@ -0,0 +1,41 @@ +package stacks +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v3" + + "github.com/hyperledger/firefly-cli/pkg/types" +) + +func TestMockConfigWithAutoReload(t *testing.T) { + tmpDir := os.TempDir() + configDir := filepath.Join(tmpDir, "config") + + // Ensure the config directory exists + err := os.MkdirAll(configDir, 0755) + assert.NoError(t, err) + + configPath := filepath.Join(configDir, "firefly_core_member1.yml") + + // Write mock config YAML with autoReload true + configYAML := []byte(` +autoReload: true +`) + + err = os.WriteFile(configPath, configYAML, 0644) + assert.NoError(t, err) + + // Read the file back in + content, err := os.ReadFile(configPath) + assert.NoError(t, err) + + var config types.FireflyConfig + err = yaml.Unmarshal(content, &config) + assert.NoError(t, err) + + // Check that AutoReload is true as expected + assert.True(t, config.AutoReload) +} diff --git a/pkg/types/firefly_config.go b/pkg/types/firefly_config.go index fe71caa..35bc70b 100644 --- a/pkg/types/firefly_config.go +++ b/pkg/types/firefly_config.go @@ -184,4 +184,5 @@ type FireflyConfig struct { Event *EventConfig `yaml:"event,omitempty"` Plugins *Plugins `yaml:"plugins"` Namespaces *NamespacesConfig `yaml:"namespaces"` + AutoReload bool `json:"autoReload" yaml:"autoReload"` } diff --git a/pkg/types/options.go b/pkg/types/options.go index 53fae84..17c2a15 100644 --- a/pkg/types/options.go +++ b/pkg/types/options.go @@ -73,6 +73,7 @@ type InitOptions struct { CustomPinSupport bool RemoteNodeDeploy bool EnvironmentVars map[string]string + EnableAutoReload bool } const IPFSMode = "ipfs_mode" From cce6c0ba2d1a7121264a574f12fa78413e53422b Mon Sep 17 00:00:00 2001 From: Angelina Date: Tue, 21 Oct 2025 17:33:18 -0400 Subject: [PATCH 2/6] fix(config): correctly place autoReload under config and update init flag description Signed-off-by: Angelina --- cmd/init.go | 2 +- pkg/types/firefly_config.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index eaec327..2be407e 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -335,6 +335,6 @@ func init() { initCmd.PersistentFlags().StringArrayVar(&initOptions.NodeNames, "node-name", []string{}, "Node name") initCmd.PersistentFlags().BoolVar(&initOptions.RemoteNodeDeploy, "remote-node-deploy", false, "Enable or disable deployment of FireFly contracts on remote nodes") initCmd.PersistentFlags().StringToStringVar(&initOptions.EnvironmentVars, "environment-vars", map[string]string{}, "Common environment variables to set on all containers in FireFly stack") - initCmd.Flags().BoolVar(&initOptions.EnableAutoReload, "auto-reload", true, "Enable config auto reload in generated FireFly configs") + initCmd.Flags().BoolVar(&initOptions.EnableAutoReload, "auto-reload", true, "Enable config auto reload in FireFly core") rootCmd.AddCommand(initCmd) } diff --git a/pkg/types/firefly_config.go b/pkg/types/firefly_config.go index 35bc70b..bdda989 100644 --- a/pkg/types/firefly_config.go +++ b/pkg/types/firefly_config.go @@ -173,6 +173,10 @@ type NamespacesConfig struct { Predefined []*Namespace `json:"predefined"` } +type Config struct { + AutoReload bool `yaml:"autoReload"` +} + type FireflyConfig struct { Log *LogConfig `yaml:"log,omitempty"` Debug *HTTPServerConfig `yaml:"debug,omitempty"` @@ -184,5 +188,5 @@ type FireflyConfig struct { Event *EventConfig `yaml:"event,omitempty"` Plugins *Plugins `yaml:"plugins"` Namespaces *NamespacesConfig `yaml:"namespaces"` - AutoReload bool `json:"autoReload" yaml:"autoReload"` + Config *Config `yaml:"config,omitempty"` } From d2ea100cb184c66e8a06395adf733e45d88dd752 Mon Sep 17 00:00:00 2001 From: Angelina Date: Fri, 24 Oct 2025 12:11:54 -0400 Subject: [PATCH 3/6] fix: update stack manager config reference Signed-off-by: Angelina --- internal/stacks/autoreload_test.go | 22 ++++++++++++++++++++++ internal/stacks/stack_manager.go | 5 ++++- internal/stacks/stack_manager_test.go | 2 +- pkg/types/firefly_config.go | 7 ++++--- 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 internal/stacks/autoreload_test.go diff --git a/internal/stacks/autoreload_test.go b/internal/stacks/autoreload_test.go new file mode 100644 index 0000000..548ce6e --- /dev/null +++ b/internal/stacks/autoreload_test.go @@ -0,0 +1,22 @@ +package stacks + +import ( + "fmt" + "github.com/hyperledger/firefly-cli/pkg/types" + "gopkg.in/yaml.v3" +) + +func main() { + cfg := &types.FireflyConfig{ + Config: &types.CoreConfig{}, + } + + // simulate your flag + cfg.Config.AutoReload = true + + out, err := yaml.Marshal(cfg) + if err != nil { + panic(err) + } + fmt.Println(string(out)) +} diff --git a/internal/stacks/stack_manager.go b/internal/stacks/stack_manager.go index 3d0af97..b60509b 100644 --- a/internal/stacks/stack_manager.go +++ b/internal/stacks/stack_manager.go @@ -460,7 +460,10 @@ func (s *StackManager) writeConfig(options *types.InitOptions) error { config := core.NewFireflyConfig(s.Stack, member) if options.EnableAutoReload { - config.AutoReload = true + if config.Config == nil { + config.Config = &types.CoreConfig{} + } + config.Config.AutoReload = true } // TODO: This code assumes that there is only one plugin instance per type. When we add support for diff --git a/internal/stacks/stack_manager_test.go b/internal/stacks/stack_manager_test.go index dd322bb..87145c7 100644 --- a/internal/stacks/stack_manager_test.go +++ b/internal/stacks/stack_manager_test.go @@ -37,5 +37,5 @@ autoReload: true assert.NoError(t, err) // Check that AutoReload is true as expected - assert.True(t, config.AutoReload) + assert.True(t, config.Config.AutoReload) } diff --git a/pkg/types/firefly_config.go b/pkg/types/firefly_config.go index bdda989..20fa004 100644 --- a/pkg/types/firefly_config.go +++ b/pkg/types/firefly_config.go @@ -173,8 +173,8 @@ type NamespacesConfig struct { Predefined []*Namespace `json:"predefined"` } -type Config struct { - AutoReload bool `yaml:"autoReload"` +type CoreConfig struct { + AutoReload bool `yaml:"autoReload,omitempty"` } type FireflyConfig struct { @@ -188,5 +188,6 @@ type FireflyConfig struct { Event *EventConfig `yaml:"event,omitempty"` Plugins *Plugins `yaml:"plugins"` Namespaces *NamespacesConfig `yaml:"namespaces"` - Config *Config `yaml:"config,omitempty"` + Config *CoreConfig `yaml:"config,omitempty"` + } From 1277eb728d060b2280e5023ec89bd044756910f0 Mon Sep 17 00:00:00 2001 From: Angelina Date: Wed, 12 Nov 2025 10:01:44 -0500 Subject: [PATCH 4/6] fix: remove single line comment Signed-off-by: Angelina --- internal/stacks/autoreload_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/stacks/autoreload_test.go b/internal/stacks/autoreload_test.go index 548ce6e..7ca41ea 100644 --- a/internal/stacks/autoreload_test.go +++ b/internal/stacks/autoreload_test.go @@ -11,7 +11,6 @@ func main() { Config: &types.CoreConfig{}, } - // simulate your flag cfg.Config.AutoReload = true out, err := yaml.Marshal(cfg) From 405d8645ffef0d2bf3168a6a94eb2814eeae19ca Mon Sep 17 00:00:00 2001 From: Angelina Date: Thu, 13 Nov 2025 10:03:46 -0500 Subject: [PATCH 5/6] chore: remove temporary autoreload debug file Signed-off-by: Angelina --- internal/stacks/autoreload_test.go | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 internal/stacks/autoreload_test.go diff --git a/internal/stacks/autoreload_test.go b/internal/stacks/autoreload_test.go deleted file mode 100644 index 7ca41ea..0000000 --- a/internal/stacks/autoreload_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package stacks - -import ( - "fmt" - "github.com/hyperledger/firefly-cli/pkg/types" - "gopkg.in/yaml.v3" -) - -func main() { - cfg := &types.FireflyConfig{ - Config: &types.CoreConfig{}, - } - - cfg.Config.AutoReload = true - - out, err := yaml.Marshal(cfg) - if err != nil { - panic(err) - } - fmt.Println(string(out)) -} From 929cb501865bc55e7e62cefb1ab93f84b2d4485f Mon Sep 17 00:00:00 2001 From: Angelina Date: Tue, 2 Dec 2025 10:25:13 -0500 Subject: [PATCH 6/6] Fix TestMockConfigWithAutoReload: correct YAML structure and nil check Signed-off-by: Angelina --- internal/stacks/stack_manager_test.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/internal/stacks/stack_manager_test.go b/internal/stacks/stack_manager_test.go index 87145c7..5ae04e4 100644 --- a/internal/stacks/stack_manager_test.go +++ b/internal/stacks/stack_manager_test.go @@ -1,34 +1,34 @@ package stacks + import ( - "os" + "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v3" - "github.com/hyperledger/firefly-cli/pkg/types" + "github.com/hyperledger/firefly-cli/pkg/types" ) func TestMockConfigWithAutoReload(t *testing.T) { tmpDir := os.TempDir() configDir := filepath.Join(tmpDir, "config") - // Ensure the config directory exists err := os.MkdirAll(configDir, 0755) assert.NoError(t, err) configPath := filepath.Join(configDir, "firefly_core_member1.yml") - // Write mock config YAML with autoReload true + // Correct FireflyConfig YAML structure configYAML := []byte(` -autoReload: true +config: + autoReload: true `) err = os.WriteFile(configPath, configYAML, 0644) assert.NoError(t, err) - // Read the file back in content, err := os.ReadFile(configPath) assert.NoError(t, err) @@ -36,6 +36,10 @@ autoReload: true err = yaml.Unmarshal(content, &config) assert.NoError(t, err) - // Check that AutoReload is true as expected + if config.Config == nil { + t.Fatalf("Config block was not unmarshaled properly (config.Config is nil)") + } + assert.True(t, config.Config.AutoReload) } +