Skip to content

Commit

Permalink
fix: allow daemon to start correctly if the API is null
Browse files Browse the repository at this point in the history
Fixes: #10056
  • Loading branch information
Jorropo committed Aug 15, 2023
1 parent 7220409 commit 100ccfd
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 5 deletions.
7 changes: 5 additions & 2 deletions cmd/ipfs/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -717,8 +717,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)
Expand Down
18 changes: 18 additions & 0 deletions test/cli/daemon_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package cli

import (
"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("API", nil)
node.IPFS("daemon") // can't use .StartDaemon because it do a .WaitOnAPI
})
}
17 changes: 14 additions & 3 deletions test/cli/harness/ipfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand Down

0 comments on commit 100ccfd

Please sign in to comment.