fix: allow daemon to start correctly if the API is null (#10062)

(cherry picked from commit 8c4bdd8556)
This commit is contained in:
Jorropo 2023-12-11 11:45:08 +01:00
parent 0c6f08c2f7
commit f93a386984
3 changed files with 44 additions and 5 deletions

View File

@ -727,8 +727,11 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error
return nil, fmt.Errorf("serveHTTPApi: ConstructNode() failed: %s", err)
}
if err := node.Repo.SetAPIAddr(rewriteMaddrToUseLocalhostIfItsAny(listeners[0].Multiaddr())); err != nil {
return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %w", err)
if len(listeners) > 0 {
// Only add an api file if the API is running.
if err := node.Repo.SetAPIAddr(rewriteMaddrToUseLocalhostIfItsAny(listeners[0].Multiaddr())); err != nil {
return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %w", err)
}
}
errc := make(chan error)

25
test/cli/daemon_test.go Normal file
View File

@ -0,0 +1,25 @@
package cli
import (
"os/exec"
"testing"
"github.com/ipfs/kubo/test/cli/harness"
)
func TestDaemon(t *testing.T) {
t.Parallel()
t.Run("daemon starts if api is set to null", func(t *testing.T) {
t.Parallel()
node := harness.NewT(t).NewNode().Init()
node.SetIPFSConfig("Addresses.API", nil)
node.Runner.MustRun(harness.RunRequest{
Path: node.IPFSBin,
Args: []string{"daemon"},
RunFunc: (*exec.Cmd).Start, // Start without waiting for completion.
})
node.StopDaemon()
})
}

View File

@ -38,9 +38,20 @@ func (n *Node) SetIPFSConfig(key string, val interface{}, flags ...string) {
n.IPFS(args...)
// validate the config was set correctly
var newVal string
n.GetIPFSConfig(key, &newVal)
if val != newVal {
// Create a new value which is a pointer to the same type as the source.
var newVal any
if val != nil {
// If it is not nil grab the type with reflect.
newVal = reflect.New(reflect.TypeOf(val)).Interface()
} else {
// else just set a pointer to an any.
var anything any
newVal = &anything
}
n.GetIPFSConfig(key, newVal)
// dereference newVal using reflect to load the resulting value
if !reflect.DeepEqual(val, reflect.ValueOf(newVal).Elem().Interface()) {
log.Panicf("key '%s' did not retain value '%s' after it was set, got '%s'", key, val, newVal)
}
}