Delete state/runtime dirs of networks which were failed to be joined or created
This commit is contained in:
parent
3f9863c39e
commit
ab8dac0789
@ -4,12 +4,14 @@ package network
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"isle/bootstrap"
|
"isle/bootstrap"
|
||||||
"isle/daemon/children"
|
"isle/daemon/children"
|
||||||
"isle/daemon/daecommon"
|
"isle/daemon/daecommon"
|
||||||
"isle/nebula"
|
"isle/nebula"
|
||||||
"isle/toolkit"
|
"isle/toolkit"
|
||||||
|
"os"
|
||||||
|
|
||||||
"dev.mediocregopher.com/mediocre-go-lib.git/mlog"
|
"dev.mediocregopher.com/mediocre-go-lib.git/mlog"
|
||||||
)
|
)
|
||||||
@ -30,6 +32,26 @@ func networkRuntimeDir(
|
|||||||
return networksRuntimeDir.MkChildDir(networkID, mayExist)
|
return networksRuntimeDir.MkChildDir(networkID, mayExist)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cleanupDirs(
|
||||||
|
networkStateDir, networkRuntimeDir toolkit.Dir,
|
||||||
|
) error {
|
||||||
|
var errs []error
|
||||||
|
|
||||||
|
if err := os.RemoveAll(networkStateDir.Path); err != nil {
|
||||||
|
errs = append(errs, fmt.Errorf(
|
||||||
|
"removing %q: %w", networkStateDir.Path, err,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.RemoveAll(networkRuntimeDir.Path); err != nil {
|
||||||
|
errs = append(errs, fmt.Errorf(
|
||||||
|
"removing %q: %w", networkRuntimeDir.Path, err,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors.Join(errs...)
|
||||||
|
}
|
||||||
|
|
||||||
func networkDirs(
|
func networkDirs(
|
||||||
networksStateDir, networksRuntimeDir toolkit.Dir,
|
networksStateDir, networksRuntimeDir toolkit.Dir,
|
||||||
networkID string,
|
networkID string,
|
||||||
@ -268,6 +290,22 @@ func (l *loader) Join(
|
|||||||
networkID = creationParams.ID
|
networkID = creationParams.ID
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Start by checking that the new network isn't already joined. This
|
||||||
|
// shouldn't _technically_ be necessary, as the caller of Join should
|
||||||
|
// already be handling this, but it's worth doing to make sure we don't
|
||||||
|
// accidentally delete the state directory of an already joined network.
|
||||||
|
|
||||||
|
allJoinedCreationParams, err := l.Loadable(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("getting already joined networks: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, joinedCreationParams := range allJoinedCreationParams {
|
||||||
|
if joinedCreationParams.ID == networkID {
|
||||||
|
return nil, fmt.Errorf("network %q already joined", networkID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
networkStateDir, networkRuntimeDir, err := networkDirs(
|
networkStateDir, networkRuntimeDir, err := networkDirs(
|
||||||
l.networksStateDir, l.networksRuntimeDir, networkID, false,
|
l.networksStateDir, l.networksRuntimeDir, networkID, false,
|
||||||
)
|
)
|
||||||
@ -277,7 +315,7 @@ func (l *loader) Join(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return join(
|
n, err := join(
|
||||||
ctx,
|
ctx,
|
||||||
logger,
|
logger,
|
||||||
l.envBinDirPath,
|
l.envBinDirPath,
|
||||||
@ -287,6 +325,14 @@ func (l *loader) Join(
|
|||||||
networkRuntimeDir,
|
networkRuntimeDir,
|
||||||
opts,
|
opts,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Join(
|
||||||
|
err, cleanupDirs(networkStateDir, networkRuntimeDir),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *loader) Create(
|
func (l *loader) Create(
|
||||||
@ -310,7 +356,7 @@ func (l *loader) Create(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return create(
|
n, err := create(
|
||||||
ctx,
|
ctx,
|
||||||
logger,
|
logger,
|
||||||
l.envBinDirPath,
|
l.envBinDirPath,
|
||||||
@ -322,4 +368,12 @@ func (l *loader) Create(
|
|||||||
hostName,
|
hostName,
|
||||||
opts,
|
opts,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Join(
|
||||||
|
err, cleanupDirs(networkStateDir, networkRuntimeDir),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return n, nil
|
||||||
}
|
}
|
||||||
|
8
tasks/v0.0.3/network-leave.md
Normal file
8
tasks/v0.0.3/network-leave.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
type: task
|
||||||
|
---
|
||||||
|
|
||||||
|
# Implement `network leave` sub-command
|
||||||
|
|
||||||
|
When leaving a network the daemon should remove the now-defunct state-directory,
|
||||||
|
or at least mark it as inactive in some way.
|
Loading…
Reference in New Issue
Block a user