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

Bug 1614660 - Network diagnostic will auto detect runtime #20647

Merged
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ func (o NetworkPodDiagnosticsOptions) buildNetworkPodDiagnostics() ([]types.Diag
return nil, err
}

runtime, err := netutil.GetRuntime()
runtime, err := netutil.GetRuntime(kubeClient)
if err != nil {
return nil, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import (
"regexp"
"strings"

"github.com/golang/glog"

kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
Copy link
Contributor

Choose a reason for hiding this comment

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

For future reference, I'm pretty sure we should be using the public client APIs in k8s.io/client-go.

kexec "k8s.io/utils/exec"
)

Expand All @@ -27,8 +26,8 @@ type Runtime struct {
Endpoint string
}

func GetRuntime() (*Runtime, error) {
runtimeName, runtimeType, runtimeEndpoint, err := getDefaultRuntimeEndpoint()
func GetRuntime(kubeClient kclientset.Interface) (*Runtime, error) {
runtimeName, runtimeType, runtimeEndpoint, err := getRuntimeEndpoint(kubeClient)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -114,42 +113,44 @@ func (r *Runtime) GetRuntimeVersion() (string, error) {
return versionInfo, nil
}

func getDefaultRuntimeEndpoint() (string, string, string, error) {
isCRIO, err := filePathExists(defaultCRIOShimSocket)
func getRuntimeEndpoint(kubeClient kclientset.Interface) (string, string, string, error) {
nodes, err := GetNodes(kubeClient)
if err != nil {
return "", "", "", err
}

isDocker, err := filePathExists(defaultDockerShimSocket)
if err != nil {
return "", "", "", err
if len(nodes) == 0 {
return "", "", "", fmt.Errorf("no nodes found to detect the runtime")
}

// TODO: Instead of trying to detect the runtime make this as config option
if isDocker && isCRIO {
glog.Warningf("Found both crio and docker socket files, defaulting to crio")
return crioRuntimeName, crioRuntimeType, defaultCRIOShimSocket, nil
} else if isCRIO {
return crioRuntimeName, crioRuntimeType, defaultCRIOShimSocket, nil
} else if isDocker {
return dockerRuntimeName, dockerRuntimeType, defaultDockerShimSocket, nil
for _, node := range nodes {
if len(node.Status.NodeInfo.ContainerRuntimeVersion) > 0 {
runtimeTokens := strings.Split(node.Status.NodeInfo.ContainerRuntimeVersion, "://")
switch runtimeTokens[0] {
case crioRuntimeType:
if err := filePathExists(defaultCRIOShimSocket); err != nil {
return "", "", "", fmt.Errorf("detected crio runtime but validation of socket file %q failed: %v", defaultCRIOShimSocket, err)
}
return crioRuntimeName, crioRuntimeType, defaultCRIOShimSocket, nil
case dockerRuntimeType:
if err := filePathExists(defaultDockerShimSocket); err != nil {
return "", "", "", fmt.Errorf("detected docker runtime but validation of socket file %q failed: %v", defaultDockerShimSocket, err)
}
return dockerRuntimeName, dockerRuntimeType, defaultDockerShimSocket, nil
default:
return "", "", "", fmt.Errorf("runtime %q is not supported", runtimeTokens[0])
}
}
}

return "", "", "", fmt.Errorf("supported runtime socket files not found")
return "", "", "", fmt.Errorf("supported runtime not found")
}

func filePathExists(endpoint string) (bool, error) {
func filePathExists(endpoint string) error {
u, err := url.Parse(endpoint)
if err != nil {
return false, err
}

if _, err := os.Stat(u.Path); err != nil {
if os.IsNotExist(err) {
return false, nil
}
return false, err
return err
}

return true, nil
_, err = os.Stat(u.Path)
return err
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/openshift/source-to-image/pkg/tar"
s2ifs "github.com/openshift/source-to-image/pkg/util/fs"

corev1 "k8s.io/api/core/v1"
kerrs "k8s.io/apimachinery/pkg/util/errors"
kapi "k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
Expand Down Expand Up @@ -99,7 +100,7 @@ func (d *NetworkDiagnostic) copyNetworkPodInfo(pod *kapi.Pod) error {

func (d *NetworkDiagnostic) getNetworkPodLogs(pod *kapi.Pod) error {
bytelim := int64(1024000)
opts := &kapi.PodLogOptions{
opts := &corev1.PodLogOptions{
TypeMeta: pod.TypeMeta,
Container: pod.Name,
Follow: true,
Expand Down