diff --git a/cmd/init.go b/cmd/init.go index 34ed1c0..2be407e 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 FireFly core") rootCmd.AddCommand(initCmd) } diff --git a/internal/stacks/stack_manager.go b/internal/stacks/stack_manager.go index 04582d3..b60509b 100644 --- a/internal/stacks/stack_manager.go +++ b/internal/stacks/stack_manager.go @@ -459,6 +459,13 @@ func (s *StackManager) writeConfig(options *types.InitOptions) error { for _, member := range s.Stack.Members { config := core.NewFireflyConfig(s.Stack, member) + if options.EnableAutoReload { + 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 // 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..5ae04e4 --- /dev/null +++ b/internal/stacks/stack_manager_test.go @@ -0,0 +1,45 @@ +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") + + err := os.MkdirAll(configDir, 0755) + assert.NoError(t, err) + + configPath := filepath.Join(configDir, "firefly_core_member1.yml") + + // Correct FireflyConfig YAML structure + configYAML := []byte(` +config: + autoReload: true +`) + + err = os.WriteFile(configPath, configYAML, 0644) + assert.NoError(t, err) + + content, err := os.ReadFile(configPath) + assert.NoError(t, err) + + var config types.FireflyConfig + err = yaml.Unmarshal(content, &config) + assert.NoError(t, err) + + if config.Config == nil { + t.Fatalf("Config block was not unmarshaled properly (config.Config is nil)") + } + + assert.True(t, config.Config.AutoReload) +} + diff --git a/pkg/types/firefly_config.go b/pkg/types/firefly_config.go index fe71caa..20fa004 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 CoreConfig struct { + AutoReload bool `yaml:"autoReload,omitempty"` +} + type FireflyConfig struct { Log *LogConfig `yaml:"log,omitempty"` Debug *HTTPServerConfig `yaml:"debug,omitempty"` @@ -184,4 +188,6 @@ type FireflyConfig struct { Event *EventConfig `yaml:"event,omitempty"` Plugins *Plugins `yaml:"plugins"` Namespaces *NamespacesConfig `yaml:"namespaces"` + Config *CoreConfig `yaml:"config,omitempty"` + } 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"