Check for IPs in use in CreateHost
This commit is contained in:
parent
37d436a428
commit
e750bc44a5
@ -9,6 +9,7 @@ const (
|
||||
errCodeInitializing = daecommon.ErrorCodeRangeNetwork + iota
|
||||
errCodeInvalidConfig
|
||||
errCodeHostNotFound
|
||||
errCodeIPInUse
|
||||
)
|
||||
|
||||
var (
|
||||
@ -25,4 +26,8 @@ var (
|
||||
// ErrHostNotFound is returned when performing an operation which expected a
|
||||
// host to exist in the network, but that host wasn't found.
|
||||
ErrHostNotFound = jsonrpc2.NewError(errCodeHostNotFound, "Host not found")
|
||||
|
||||
// ErrIPInUse is returned when performing an operation which was provided an
|
||||
// IP already in use by another host in the network.
|
||||
ErrIPInUse = jsonrpc2.NewError(errCodeIPInUse, "IP in use")
|
||||
)
|
||||
|
@ -81,6 +81,10 @@ type RPC interface {
|
||||
|
||||
// CreateHost creates a bootstrap for a new host with the given name and IP
|
||||
// address.
|
||||
//
|
||||
// Errors:
|
||||
// - ErrIPInUse - if IP field of CreateHostOpts is given, and already in use
|
||||
// by another host in the network.
|
||||
CreateHost(
|
||||
context.Context, nebula.HostName, CreateHostOpts,
|
||||
) (
|
||||
@ -889,8 +893,13 @@ func (n *network) CreateHost(
|
||||
"choosing available IP: %w", err,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
for _, host := range currBootstrap.Hosts {
|
||||
if host.IP() == ip {
|
||||
return JoiningBootstrap{}, ErrIPInUse
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO if the ip is given, check that it's not already in use.
|
||||
|
||||
caSigningPrivateKey, err := daecommon.GetNebulaCASigningPrivateKey(
|
||||
ctx, n.secretsStore,
|
||||
|
@ -98,6 +98,26 @@ func TestNetwork_GetBootstrap(t *testing.T) {
|
||||
)
|
||||
}
|
||||
|
||||
func TestNetwork_CreateHost(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
// Normal functionality of this method is tested as part of
|
||||
// `integrationHarness.joinNetwork`. This tests various extra behavior.
|
||||
|
||||
t.Run("ErrIPInUse", func(t *testing.T) {
|
||||
var (
|
||||
h = newIntegrationHarness(t)
|
||||
network = h.createNetwork(t, "primus", nil)
|
||||
hostName = nebula.HostName("secondus")
|
||||
)
|
||||
|
||||
_, err := network.CreateHost(h.ctx, hostName, CreateHostOpts{
|
||||
IP: network.getBootstrap(t).ThisHost().IP(),
|
||||
})
|
||||
assert.ErrorIs(t, err, ErrIPInUse)
|
||||
})
|
||||
}
|
||||
|
||||
func TestNetwork_SetConfig(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
15
tasks/soon/drafts/extended-sub-command-descriptions.md
Normal file
15
tasks/soon/drafts/extended-sub-command-descriptions.md
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
type: task
|
||||
---
|
||||
|
||||
# Extended Sub-Command Descriptions
|
||||
|
||||
It might be useful to have some kind of extended description for each
|
||||
sub-command, something that would be displayed only as part of `-h`.
|
||||
|
||||
The extended description could provide more context for what the sub-command is
|
||||
for, and how it interact with other related sub-commands.
|
||||
|
||||
This could also be a good place to provide usage examples, although maybe those
|
||||
should go in yet another section, EXAMPLES, to distinguish them from
|
||||
DESCRIPTION.
|
7
tasks/v0.0.3/code/public-addr.md
Normal file
7
tasks/v0.0.3/code/public-addr.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
type: task
|
||||
---
|
||||
|
||||
# Add `vpn public-addr set`, and `get` Sub-Commands.
|
||||
|
||||
`get` should return an error if no public address is set.
|
Loading…
Reference in New Issue
Block a user