diff --git a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/cmd.go b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/cmd.go index d937b2b6375b..09cf4efa4aa0 100644 --- a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/cmd.go +++ b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/cmd.go @@ -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 } diff --git a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/util/runtime.go b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/util/runtime.go index 1ab44a1eaa06..31866a9fae9a 100644 --- a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/util/runtime.go +++ b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/in_pod/util/runtime.go @@ -7,8 +7,7 @@ import ( "regexp" "strings" - "github.com/golang/glog" - + kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" kexec "k8s.io/utils/exec" ) @@ -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 } @@ -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 } diff --git a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/results.go b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/results.go index ae03927bce74..99190f1024fc 100644 --- a/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/results.go +++ b/pkg/oc/cli/admin/diagnostics/diagnostics/cluster/network/results.go @@ -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" @@ -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,