Implement 'storage add-allocation'

This commit is contained in:
Brian Picciano 2024-11-18 22:11:14 +01:00
parent cedd9f2c99
commit 32cc38ab08
3 changed files with 161 additions and 3 deletions

View File

@ -33,6 +33,86 @@ func indexStorageAllocations(
return allocs return allocs
} }
var subCmdStorageAllocationAdd = subCmd{
name: "add-allocation",
descr: "Adds a new storage allocation to the host",
do: func(ctx subCmdCtx) error {
var alloc daecommon.ConfigStorageAllocation
ctx.flags.StringVar(
&alloc.DataPath,
"data-path",
"",
"Path to the directory data should be stored in",
)
ctx.flags.StringVar(
&alloc.MetaPath,
"meta-path",
"",
"Path to the directory metadata should be stored in. This is a"+
" smaller dataset which benefits from a faster drive, if"+
" possible.",
)
ctx.flags.IntVar(
&alloc.Capacity,
"capacity",
0,
"How many gigabytes to allocate.",
)
ctx.flags.IntVar(
&alloc.S3APIPort,
"s3-api-port",
0,
"Which port of the VPN network interface to serve the S3 API on."+
" Will be automatically assigned if not given.",
)
ctx.flags.IntVar(
&alloc.RPCPort,
"rpc-port",
0,
"Which port of the VPN network interface to serve RPC requests on."+
" Will be automatically assigned if not given. Once this port"+
" is defined for an allocation it cannot be changed.",
)
ctx.flags.IntVar(
&alloc.AdminPort,
"admin-port",
0,
"Which port of the VPN network interface to serve admin requests"+
" on. Will be automatically assigned if not given.",
)
ctx, err := ctx.withParsedFlags()
if err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if alloc.DataPath == "" || alloc.MetaPath == "" || alloc.Capacity == 0 {
return errors.New(
"--data-path, --meta-path, and --capacity are required",
)
}
config, err := ctx.getDaemonRPC().GetConfig(ctx)
if err != nil {
return fmt.Errorf("getting network config: %w", err)
}
config.Storage.Allocations = append(config.Storage.Allocations, alloc)
if err := ctx.getDaemonRPC().SetConfig(ctx, config); err != nil {
return fmt.Errorf("updating the network config: %w", err)
}
return nil
},
}
var subCmdStorageAllocationList = subCmd{ var subCmdStorageAllocationList = subCmd{
name: "list-allocation", name: "list-allocation",
plural: "s", plural: "s",
@ -120,6 +200,7 @@ var subCmdStorage = subCmd{
descr: "Sub-commands having to do with configuration of storage on this host", descr: "Sub-commands having to do with configuration of storage on this host",
do: func(ctx subCmdCtx) error { do: func(ctx subCmdCtx) error {
return ctx.doSubCmd( return ctx.doSubCmd(
subCmdStorageAllocationAdd,
subCmdStorageAllocationList, subCmdStorageAllocationList,
subCmdStorageAllocationRemove, subCmdStorageAllocationRemove,
) )

View File

@ -10,6 +10,79 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestStorageAllocationAdd(t *testing.T) {
t.Parallel()
tests := []struct {
name string
args []string
setExpectations func(*daemon.MockRPC)
wantAlloc daecommon.ConfigStorageAllocation
}{
{
name: "success/no ports",
args: []string{
"--data-path", "foo", "--meta-path=bar", "--capacity", "1",
},
wantAlloc: daecommon.ConfigStorageAllocation{
DataPath: "foo",
MetaPath: "bar",
Capacity: 1,
},
},
{
name: "success/all ports",
args: []string{
"--data-path", "foo",
"--meta-path=bar",
"--capacity", "1",
"--s3-api-port", "1000",
"--rpc-port=2000",
"--admin-port", "3000",
},
wantAlloc: daecommon.ConfigStorageAllocation{
DataPath: "foo",
MetaPath: "bar",
Capacity: 1,
S3APIPort: 1000,
RPCPort: 2000,
AdminPort: 3000,
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
var (
h = newRunHarness(t)
config = daecommon.NewNetworkConfig(nil)
)
h.daemonRPC.
On("GetConfig", toolkit.MockArg[context.Context]()).
Return(config, nil).
Once()
config.Storage.Allocations = append(
config.Storage.Allocations, test.wantAlloc,
)
h.daemonRPC.
On(
"SetConfig",
toolkit.MockArg[context.Context](),
config,
).
Return(nil).
Once()
args := []string{"storage", "add-allocation"}
args = append(args, test.args...)
assert.NoError(t, h.run(t, args...))
})
}
}
func TestStorageAllocationList(t *testing.T) { func TestStorageAllocationList(t *testing.T) {
t.Parallel() t.Parallel()

View File

@ -127,17 +127,21 @@ func (c *NetworkConfig) fillDefaults() {
c.VPN.Tun.Device = "isle-tun" c.VPN.Tun.Device = "isle-tun"
} }
nextRPCPort := 3900
for i := range c.Storage.Allocations { for i := range c.Storage.Allocations {
if c.Storage.Allocations[i].RPCPort == 0 { if c.Storage.Allocations[i].RPCPort == 0 {
c.Storage.Allocations[i].RPCPort = 3900 + (i * 10) c.Storage.Allocations[i].RPCPort = nextRPCPort
} }
nextRPCPort += 10
if c.Storage.Allocations[i].S3APIPort == 0 { if c.Storage.Allocations[i].S3APIPort == 0 {
c.Storage.Allocations[i].S3APIPort = 3901 + (i * 10) c.Storage.Allocations[i].S3APIPort = c.Storage.Allocations[i].RPCPort + 1
} }
if c.Storage.Allocations[i].AdminPort == 0 { if c.Storage.Allocations[i].AdminPort == 0 {
c.Storage.Allocations[i].AdminPort = 3902 + (i * 10) c.Storage.Allocations[i].AdminPort = c.Storage.Allocations[i].RPCPort + 2
} }
} }
} }