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

cnitool: fix default CNI directory on Windows and add extra checks. #942

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions cnitool/cnitool.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ const (
EnvCNIArgs = "CNI_ARGS"
EnvCNIIfname = "CNI_IFNAME"

DefaultNetDir = "/etc/cni/net.d"

CmdAdd = "add"
CmdCheck = "check"
CmdDel = "del"
Expand Down Expand Up @@ -68,6 +66,23 @@ func main() {
if netdir == "" {
netdir = DefaultNetDir
}

if !filepath.IsAbs(netdir) {
var err error
netdir, err = filepath.Abs(netdir)
if err != nil {
exit(fmt.Errorf("error converting the provided CNI config path ($%s) %q to an absolute path: %w", EnvNetDir, netdir, err))
}
}

if stat, err := os.Stat(netdir); err == nil {
if !stat.IsDir() {
exit(fmt.Errorf("the provided CNI config path ($%s) is not a directory: %q", EnvNetDir, netdir))
}
} else {
exit(fmt.Errorf("the provided CNI config path ($%s) does not exist: %q", EnvNetDir, netdir))
}

netconf, err := libcni.LoadNetworkConf(netdir, os.Args[2])
if err != nil {
exit(err)
Expand Down
22 changes: 22 additions & 0 deletions cnitool/constants_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2023 CNI authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
// +build darwin dragonfly freebsd linux netbsd openbsd solaris

package main

const (
DefaultNetDir = "/etc/cni/net.d"
)
22 changes: 22 additions & 0 deletions cnitool/constants_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2023 CNI authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

const (
// NOTE: this is the most reasonable default as most CNI setups on Windows
// will have been made using the helper script in the containerd repo.
// https://github.com/containerd/containerd/blob/main/script/setup/install-cni-windows
DefaultNetDir = "C:\\Program Files\\containerd\\cni\\conf"
Copy link
Member

Choose a reason for hiding this comment

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

@aznashwan this seems containerd specific, but CNI is used by more than just containerd. If each CRI implementation has its own default directory, should this be a list of default dirs that get tried in sequence?

Copy link
Author

Choose a reason for hiding this comment

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

Sorry for the huge delay, I must've somehow missed this notification when it happened.

seems containerd specific

Correct.

CNI is used by more than just containerd

Correct, but generally not really Windows (at least when I was involved in CNI porting efforts on Windows a whole year ago).

Back then, the vast majority of k8s/docker setups on Windows directly installed containerd from their build scripts in the main containerd/containerd repo, so it seemed like the most reasonable choice...

I'm not sure whether there is a "standardised way" to install k8s on Windows nowadays, but I'm willing to bet it uses containerd with this default.

Plus at the end of the day this path is configurable via an env var, so the C:\Program Files\containerd\cni\conf default isn't preventing anyone from using cnitool, and it's certainly a hell of a lot saner of a default on Windows than /etc/cni/net.d 🤣

)