Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add implementation and test for SetupIPForwarding() #2

Closed
wants to merge 0 commits into from
Closed

Add implementation and test for SetupIPForwarding() #2

wants to merge 0 commits into from

Conversation

aboch
Copy link
Contributor

@aboch aboch commented Mar 3, 2015

Signed-off-by: Alessandro Boch [email protected]

if bytes.Compare(procSetting, []byte("1\n")) == 0 {
WriteIPForwardingSetting(t, []byte{'0', '\n'})
} else {
restore = true
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mmmm, I think this can be improved:

  • We set restore = true only when we don't write over the file, which feels backwards.
  • I'd rather use a defer instead of a boolean-based mechanism: here if the test fails for some reason, the restoring code is never called.
  • I think it's safer to just write back the original value in all cases without any other assumptions.

I think this whole block should be something like:

// Read current setting and ensure the original value gets restored.
procSetting := ReadCurrentIPForwardingSetting(t)
defer WriteIPForwardingSetting(t, procSetting)

// Disable IP forwarding if enabled.
if bytes.Compare(procSetting, []byte("1\n")) == 0 {
    WriteIPForwardingSetting(t, []byte{"0\n"})
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function tests the call setupIPForwarding() which does nothing but enabling ipv4 forwarding writing '1' in the file regardless of the existing value.

In order to verify the function does its job, we need to start the test from a state in which the file contains '0'.

We therefore need to "restore" only when the file contains '0' before executing the test and the call to SetupIPForwarding() was successful.

If the file contained '1' (then we reset) and the test is successful, then there is nothing to restore, the original value will be there.

I'd prefer avoid a redundant restore, which will happen using the defer.
But I do not have a strong opinion about it, at the end of the day this is test code.
I agree with you, it's more robust if we blindly always restore the original value.
I will make the change.
I will modify the comment as you suggested, it is more clear. Thanks.

@icecrime
Copy link

icecrime commented Mar 4, 2015

Thanks for the PR 👍 All good besides a few nitpicks :-)

@aboch
Copy link
Contributor Author

aboch commented Mar 4, 2015

Thanks Arnaud for the review, will take care of your comments.

@aboch aboch closed this Mar 4, 2015
@icecrime
Copy link

icecrime commented Mar 4, 2015

Why close? Updating the branch is easier, and it helps keeping track of the history!

@aboch
Copy link
Contributor Author

aboch commented Mar 4, 2015

I did not mean to.

I am still learning how to work on github. Sorry.

Alessandro

On Wed, Mar 4, 2015 at 10:27 AM, Arnaud Porterie [email protected]
wrote:

Why close? Updating the branch is easier, and it helps keeping track of
the history!


Reply to this email directly or view it on GitHub
https://github.com/icecrime/libnetwork/pull/2#issuecomment-77215513.

@icecrime
Copy link

icecrime commented Mar 4, 2015

No problem :-) We can still reopen it if required, and let me know if you need some coaching using GitHub!

@LK4D4
Copy link
Contributor

LK4D4 commented Mar 4, 2015

@icecrime Haha, actually you can't reopen after force-push :)

kolyshkin added a commit to kolyshkin/libnetwork that referenced this pull request Jul 30, 2015
TL;DR: check for IsExist(err) after a failed MkdirAll() is both
redundant and wrong -- so two reasons to remove it.

Quoting MkdirAll documentation:

> MkdirAll creates a directory named path, along with any necessary
> parents, and returns nil, or else returns an error. If path
> is already a directory, MkdirAll does nothing and returns nil.

This means two things:

1. If a directory to be created already exists, no error is
returned.

2. If the error returned is IsExist (EEXIST), it means there exists
a non-directory with the same name as MkdirAll need to use for
directory. Example: we want to MkdirAll("a/b"), but file "a"
(or "a/b") already exists, so MkdirAll fails.

The above is a theory, based on quoted documentation and my UNIX
knowledge.
3. In practice, though, current MkdirAll implementation [1] returns
ENOTDIR in most of cases described in moby#2, with the exception when
there is a race between MkdirAll and someone else creating the
last component of MkdirAll argument as a file. In this very case
MkdirAll() will indeed return EEXIST.

Because of moby#1, IsExist check after MkdirAll is not needed.

Because of moby#2 and moby#3, ignoring IsExist error is just plain wrong,
as directory we require is not created. It's cleaner to report
the error now.

[1] https://github.com/golang/go/blob/f9ed2f75/src/os/path.go

Signed-off-by: Kir Kolyshkin <[email protected]>
clnperez pushed a commit to clnperez/libnetwork that referenced this pull request Aug 13, 2015
TL;DR: check for IsExist(err) after a failed MkdirAll() is both
redundant and wrong -- so two reasons to remove it.

Quoting MkdirAll documentation:

> MkdirAll creates a directory named path, along with any necessary
> parents, and returns nil, or else returns an error. If path
> is already a directory, MkdirAll does nothing and returns nil.

This means two things:

1. If a directory to be created already exists, no error is
returned.

2. If the error returned is IsExist (EEXIST), it means there exists
a non-directory with the same name as MkdirAll need to use for
directory. Example: we want to MkdirAll("a/b"), but file "a"
(or "a/b") already exists, so MkdirAll fails.

The above is a theory, based on quoted documentation and my UNIX
knowledge.
3. In practice, though, current MkdirAll implementation [1] returns
ENOTDIR in most of cases described in moby#2, with the exception when
there is a race between MkdirAll and someone else creating the
last component of MkdirAll argument as a file. In this very case
MkdirAll() will indeed return EEXIST.

Because of moby#1, IsExist check after MkdirAll is not needed.

Because of moby#2 and moby#3, ignoring IsExist error is just plain wrong,
as directory we require is not created. It's cleaner to report
the error now.

[1] https://github.com/golang/go/blob/f9ed2f75/src/os/path.go

Signed-off-by: Kir Kolyshkin <[email protected]>
ctelfer added a commit to ctelfer/libnetwork that referenced this pull request May 9, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants