Merge pull request #9766 from hakman/distros

Use /etc/os-release to identify the distribution
This commit is contained in:
Kubernetes Prow Robot 2020-08-17 22:37:30 -07:00 committed by GitHub
commit ffe3b3468d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 519 additions and 283 deletions

View File

@ -47,7 +47,6 @@ k8s.io/kops/node-authorizer/pkg/client
k8s.io/kops/node-authorizer/pkg/server k8s.io/kops/node-authorizer/pkg/server
k8s.io/kops/node-authorizer/pkg/utils k8s.io/kops/node-authorizer/pkg/utils
k8s.io/kops/nodeup/pkg/bootstrap k8s.io/kops/nodeup/pkg/bootstrap
k8s.io/kops/nodeup/pkg/distros
k8s.io/kops/nodeup/pkg/model k8s.io/kops/nodeup/pkg/model
k8s.io/kops/nodeup/pkg/model/networking k8s.io/kops/nodeup/pkg/model/networking
k8s.io/kops/nodeup/pkg/model/resources k8s.io/kops/nodeup/pkg/model/resources
@ -192,6 +191,7 @@ k8s.io/kops/upup/pkg/fi/utils
k8s.io/kops/upup/pkg/kutil k8s.io/kops/upup/pkg/kutil
k8s.io/kops/upup/tools/generators/fitask k8s.io/kops/upup/tools/generators/fitask
k8s.io/kops/util/pkg/architectures k8s.io/kops/util/pkg/architectures
k8s.io/kops/util/pkg/distributions
k8s.io/kops/util/pkg/env k8s.io/kops/util/pkg/env
k8s.io/kops/util/pkg/exec k8s.io/kops/util/pkg/exec
k8s.io/kops/util/pkg/hashing k8s.io/kops/util/pkg/hashing

View File

@ -6,11 +6,11 @@ go_library(
importpath = "k8s.io/kops/nodeup/pkg/bootstrap", importpath = "k8s.io/kops/nodeup/pkg/bootstrap",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//nodeup/pkg/distros:go_default_library",
"//pkg/systemd:go_default_library", "//pkg/systemd:go_default_library",
"//upup/pkg/fi:go_default_library", "//upup/pkg/fi:go_default_library",
"//upup/pkg/fi/nodeup/local:go_default_library", "//upup/pkg/fi/nodeup/local:go_default_library",
"//upup/pkg/fi/nodeup/nodetasks:go_default_library", "//upup/pkg/fi/nodeup/nodetasks:go_default_library",
"//util/pkg/distributions:go_default_library",
"//util/pkg/vfs:go_default_library", "//util/pkg/vfs:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",
], ],

View File

@ -23,11 +23,11 @@ import (
"strings" "strings"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/systemd" "k8s.io/kops/pkg/systemd"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/nodeup/local"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/vfs" "k8s.io/kops/util/pkg/vfs"
) )
@ -38,7 +38,7 @@ type Installation struct {
} }
func (i *Installation) Run() error { func (i *Installation) Run() error {
_, err := distros.FindDistribution("/") _, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return fmt.Errorf("error determining OS distribution: %v", err) return fmt.Errorf("error determining OS distribution: %v", err)
} }

View File

@ -1,12 +0,0 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = [
"distribution.go",
"identify.go",
],
importpath = "k8s.io/kops/nodeup/pkg/distros",
visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/klog/v2:go_default_library"],
)

View File

@ -1,131 +0,0 @@
/*
Copyright 2019 The Kubernetes 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 distros
import (
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"k8s.io/klog/v2"
)
// FindDistribution identifies the distribution on which we are running
// We will likely remove this when everything is containerized
func FindDistribution(rootfs string) (Distribution, error) {
// Ubuntu has /etc/lsb-release (and /etc/debian_version)
lsbRelease, err := ioutil.ReadFile(path.Join(rootfs, "etc/lsb-release"))
if err == nil {
for _, line := range strings.Split(string(lsbRelease), "\n") {
line = strings.TrimSpace(line)
if line == "DISTRIB_CODENAME=xenial" {
return DistributionXenial, nil
} else if line == "DISTRIB_CODENAME=bionic" {
return DistributionBionic, nil
} else if line == "DISTRIB_CODENAME=focal" {
return DistributionFocal, nil
}
}
} else if !os.IsNotExist(err) {
klog.Warningf("error reading /etc/lsb-release: %v", err)
}
// Debian has /etc/debian_version
debianVersionBytes, err := ioutil.ReadFile(path.Join(rootfs, "etc/debian_version"))
if err == nil {
debianVersion := strings.TrimSpace(string(debianVersionBytes))
if strings.HasPrefix(debianVersion, "8.") {
return "", fmt.Errorf("distribution Degian 8 (Jessie) is no longer supported")
} else if strings.HasPrefix(debianVersion, "9.") {
return DistributionDebian9, nil
} else if strings.HasPrefix(debianVersion, "10.") {
return DistributionDebian10, nil
} else {
return "", fmt.Errorf("unhandled debian version %q", debianVersion)
}
} else if !os.IsNotExist(err) {
klog.Warningf("error reading /etc/debian_version: %v", err)
}
// Redhat has /etc/redhat-release
// Centos has /etc/centos-release
redhatRelease, err := ioutil.ReadFile(path.Join(rootfs, "etc/redhat-release"))
if err == nil {
for _, line := range strings.Split(string(redhatRelease), "\n") {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "Red Hat Enterprise Linux Server release 7.") {
return DistributionRhel7, nil
}
if strings.HasPrefix(line, "CentOS Linux release 7.") {
return DistributionCentos7, nil
}
if strings.HasPrefix(line, "Red Hat Enterprise Linux release 8.") {
return DistributionRhel8, nil
}
if strings.HasPrefix(line, "CentOS Linux release 8.") {
return DistributionCentos8, nil
}
}
klog.Warningf("unhandled redhat-release info %q", string(lsbRelease))
} else if !os.IsNotExist(err) {
klog.Warningf("error reading /etc/redhat-release: %v", err)
}
// Flatcar uses /usr/lib/os-release
usrLibOsRelease, err := ioutil.ReadFile(path.Join(rootfs, "usr/lib/os-release"))
if err == nil {
for _, line := range strings.Split(string(usrLibOsRelease), "\n") {
line = strings.TrimSpace(line)
if line == "ID=coreos" {
return "", fmt.Errorf("distribution CoreOS is no longer supported")
} else if line == "ID=flatcar" {
return DistributionFlatcar, nil
}
}
klog.Warningf("unhandled os-release info %q", string(usrLibOsRelease))
} else if !os.IsNotExist(err) {
klog.Warningf("error reading /usr/lib/os-release: %v", err)
}
// ContainerOS, Amazon Linux 2 uses /etc/os-release
osRelease, err := ioutil.ReadFile(path.Join(rootfs, "etc/os-release"))
if err == nil {
for _, line := range strings.Split(string(osRelease), "\n") {
line = strings.TrimSpace(line)
if line == "ID=cos" {
return DistributionContainerOS, nil
}
if strings.HasPrefix(line, "PRETTY_NAME=\"Amazon Linux 2") {
return DistributionAmazonLinux2, nil
}
}
klog.Warningf("unhandled /etc/os-release info %q", string(osRelease))
} else if !os.IsNotExist(err) {
klog.Warningf("error reading /etc/os-release: %v", err)
}
klog.Warningf("could not determine distro")
klog.Warningf(" /etc/lsb-release: %q", string(lsbRelease))
klog.Warningf(" /etc/debian_version: %q", string(debianVersionBytes))
klog.Warningf(" /etc/redhat-release: %q", string(redhatRelease))
klog.Warningf(" /usr/lib/os-release: %q", string(usrLibOsRelease))
klog.Warningf(" /etc/os-release: %q", string(osRelease))
return "", fmt.Errorf("cannot identify distro")
}

View File

@ -40,7 +40,6 @@ go_library(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//:go_default_library", "//:go_default_library",
"//nodeup/pkg/distros:go_default_library",
"//nodeup/pkg/model/resources:go_default_library", "//nodeup/pkg/model/resources:go_default_library",
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
"//pkg/apis/kops/model:go_default_library", "//pkg/apis/kops/model:go_default_library",
@ -64,6 +63,7 @@ go_library(
"//upup/pkg/fi/cloudup/awsup:go_default_library", "//upup/pkg/fi/cloudup/awsup:go_default_library",
"//upup/pkg/fi/nodeup/nodetasks:go_default_library", "//upup/pkg/fi/nodeup/nodetasks:go_default_library",
"//util/pkg/architectures:go_default_library", "//util/pkg/architectures:go_default_library",
"//util/pkg/distributions:go_default_library",
"//util/pkg/exec:go_default_library", "//util/pkg/exec:go_default_library",
"//util/pkg/proxy:go_default_library", "//util/pkg/proxy:go_default_library",
"//util/pkg/vfs:go_default_library", "//util/pkg/vfs:go_default_library",
@ -102,7 +102,6 @@ go_test(
data = glob(["tests/**"]), #keep data = glob(["tests/**"]), #keep
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//nodeup/pkg/distros:go_default_library",
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/assets:go_default_library", "//pkg/assets:go_default_library",
@ -115,6 +114,7 @@ go_test(
"//upup/pkg/fi/cloudup:go_default_library", "//upup/pkg/fi/cloudup:go_default_library",
"//upup/pkg/fi/nodeup/nodetasks:go_default_library", "//upup/pkg/fi/nodeup/nodetasks:go_default_library",
"//util/pkg/architectures:go_default_library", "//util/pkg/architectures:go_default_library",
"//util/pkg/distributions:go_default_library",
"//util/pkg/exec:go_default_library", "//util/pkg/exec:go_default_library",
"//util/pkg/hashing:go_default_library", "//util/pkg/hashing:go_default_library",
"//util/pkg/vfs:go_default_library", "//util/pkg/vfs:go_default_library",

View File

@ -21,7 +21,6 @@ import (
"strings" "strings"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/nodeup/pkg/model/resources" "k8s.io/kops/nodeup/pkg/model/resources"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
@ -30,6 +29,7 @@ import (
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
) )
// ContainerdBuilder install containerd (just the packages at the moment) // ContainerdBuilder install containerd (just the packages at the moment)
@ -44,7 +44,7 @@ var containerdVersions = []packageVersion{
{ {
PackageVersion: "1.2.4", PackageVersion: "1.2.4",
Name: "containerd.io", Name: "containerd.io",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "1.2.4-1", Version: "1.2.4-1",
Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/containerd.io_1.2.4-1_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/containerd.io_1.2.4-1_amd64.deb",
@ -128,14 +128,14 @@ func (b *ContainerdBuilder) Build(c *fi.ModelBuilderContext) error {
// @check: neither flatcar nor containeros need provision containerd.service, just the containerd daemon options // @check: neither flatcar nor containeros need provision containerd.service, just the containerd daemon options
switch b.Distribution { switch b.Distribution {
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.Infof("Detected Flatcar; won't install containerd") klog.Infof("Detected Flatcar; won't install containerd")
if err := b.buildContainerOSConfigurationDropIn(c); err != nil { if err := b.buildContainerOSConfigurationDropIn(c); err != nil {
return err return err
} }
return nil return nil
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.Infof("Detected ContainerOS; won't install containerd") klog.Infof("Detected ContainerOS; won't install containerd")
if err := b.buildContainerOSConfigurationDropIn(c); err != nil { if err := b.buildContainerOSConfigurationDropIn(c); err != nil {
return err return err

View File

@ -22,11 +22,11 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
"k8s.io/kops/pkg/testutils" "k8s.io/kops/pkg/testutils"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/util/pkg/distributions"
) )
func TestContainerdPackageNames(t *testing.T) { func TestContainerdPackageNames(t *testing.T) {
@ -154,7 +154,7 @@ func runContainerdBuilderTest(t *testing.T, key string) {
basedir := path.Join("tests/containerdbuilder/", key) basedir := path.Join("tests/containerdbuilder/", key)
nodeUpModelContext, err := BuildNodeupModelContext(basedir) nodeUpModelContext, err := BuildNodeupModelContext(basedir)
nodeUpModelContext.Distribution = distros.DistributionXenial nodeUpModelContext.Distribution = distributions.DistributionUbuntu1604
if err != nil { if err != nil {
t.Fatalf("error parsing cluster yaml %q: %v", basedir, err) t.Fatalf("error parsing cluster yaml %q: %v", basedir, err)
return return

View File

@ -23,7 +23,6 @@ import (
"strings" "strings"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/apis/kops/model" "k8s.io/kops/pkg/apis/kops/model"
"k8s.io/kops/pkg/apis/kops/util" "k8s.io/kops/pkg/apis/kops/util"
@ -32,6 +31,7 @@ import (
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/vfs" "k8s.io/kops/util/pkg/vfs"
"k8s.io/utils/mount" "k8s.io/utils/mount"
@ -47,7 +47,7 @@ type NodeupModelContext struct {
Assets *fi.AssetStore Assets *fi.AssetStore
Cluster *kops.Cluster Cluster *kops.Cluster
ConfigBase vfs.Path ConfigBase vfs.Path
Distribution distros.Distribution Distribution distributions.Distribution
InstanceGroup *kops.InstanceGroup InstanceGroup *kops.InstanceGroup
KeyStore fi.CAStore KeyStore fi.CAStore
NodeupConfig *nodeup.Config NodeupConfig *nodeup.Config
@ -81,11 +81,11 @@ func (c *NodeupModelContext) SSLHostPaths() []string {
paths := []string{"/etc/ssl", "/etc/pki/tls", "/etc/pki/ca-trust"} paths := []string{"/etc/ssl", "/etc/pki/tls", "/etc/pki/ca-trust"}
switch c.Distribution { switch c.Distribution {
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
// Because /usr is read-only on Flatcar, we can't have any new directories; docker will try (and fail) to create them // Because /usr is read-only on Flatcar, we can't have any new directories; docker will try (and fail) to create them
// TODO: Just check if the directories exist? // TODO: Just check if the directories exist?
paths = append(paths, "/usr/share/ca-certificates") paths = append(paths, "/usr/share/ca-certificates")
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
paths = append(paths, "/usr/share/ca-certificates") paths = append(paths, "/usr/share/ca-certificates")
default: default:
paths = append(paths, "/usr/share/ssl", "/usr/ssl", "/usr/lib/ssl", "/usr/local/openssl", "/var/ssl", "/etc/openssl") paths = append(paths, "/usr/share/ssl", "/usr/ssl", "/usr/lib/ssl", "/usr/local/openssl", "/var/ssl", "/etc/openssl")
@ -149,7 +149,7 @@ func (c *NodeupModelContext) IsMounted(m mount.Interface, device, path string) (
// PathSrvKubernetes returns the path for the kubernetes service files // PathSrvKubernetes returns the path for the kubernetes service files
func (c *NodeupModelContext) PathSrvKubernetes() string { func (c *NodeupModelContext) PathSrvKubernetes() string {
switch c.Distribution { switch c.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
return "/etc/srv/kubernetes" return "/etc/srv/kubernetes"
default: default:
return "/srv/kubernetes" return "/srv/kubernetes"
@ -164,7 +164,7 @@ func (c *NodeupModelContext) FileAssetsDefaultPath() string {
// PathSrvSshproxy returns the path for the SSH proxy // PathSrvSshproxy returns the path for the SSH proxy
func (c *NodeupModelContext) PathSrvSshproxy() string { func (c *NodeupModelContext) PathSrvSshproxy() string {
switch c.Distribution { switch c.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
return "/etc/srv/sshproxy" return "/etc/srv/sshproxy"
default: default:
return "/srv/sshproxy" return "/srv/sshproxy"
@ -404,10 +404,10 @@ func (c *NodeupModelContext) UseSecureKubelet() bool {
// KubectlPath returns distro based path for kubectl // KubectlPath returns distro based path for kubectl
func (c *NodeupModelContext) KubectlPath() string { func (c *NodeupModelContext) KubectlPath() string {
kubeletCommand := "/usr/local/bin" kubeletCommand := "/usr/local/bin"
if c.Distribution == distros.DistributionFlatcar { if c.Distribution == distributions.DistributionFlatcar {
kubeletCommand = "/opt/bin" kubeletCommand = "/opt/bin"
} }
if c.Distribution == distros.DistributionContainerOS { if c.Distribution == distributions.DistributionContainerOS {
kubeletCommand = "/home/kubernetes/bin" kubeletCommand = "/home/kubernetes/bin"
} }
return kubeletCommand return kubeletCommand

View File

@ -21,10 +21,10 @@ import (
"sort" "sort"
"strconv" "strconv"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -140,7 +140,7 @@ type packageVersion struct {
ExtraPackages map[string]packageInfo ExtraPackages map[string]packageInfo
PackageVersion string PackageVersion string
Distros []distros.Distribution Distros []distributions.Distribution
// List of dependencies that can be installed using the system's package // List of dependencies that can be installed using the system's package
// manager (e.g. apt-get install or yum install). // manager (e.g. apt-get install or yum install).
Dependencies []string Dependencies []string
@ -156,7 +156,7 @@ type packageVersion struct {
} }
// Match package version against configured values // Match package version against configured values
func (d *packageVersion) matches(arch architectures.Architecture, packageVersion string, distro distros.Distribution) bool { func (d *packageVersion) matches(arch architectures.Architecture, packageVersion string, distro distributions.Distribution) bool {
if d.PackageVersion != packageVersion { if d.PackageVersion != packageVersion {
return false return false
} }

View File

@ -19,9 +19,9 @@ package model
import ( import (
"path/filepath" "path/filepath"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
) )
// DirectoryBuilder creates required directories // DirectoryBuilder creates required directories
@ -33,7 +33,7 @@ var _ fi.ModelBuilder = &DirectoryBuilder{}
// Build is responsible for specific directories are created - os dependent // Build is responsible for specific directories are created - os dependent
func (b *DirectoryBuilder) Build(c *fi.ModelBuilderContext) error { func (b *DirectoryBuilder) Build(c *fi.ModelBuilderContext) error {
if b.Distribution == distros.DistributionContainerOS { if b.Distribution == distributions.DistributionContainerOS {
dirname := "/home/kubernetes/bin" dirname := "/home/kubernetes/bin"
c.AddTask(&nodetasks.File{ c.AddTask(&nodetasks.File{
@ -51,7 +51,7 @@ func (b *DirectoryBuilder) Build(c *fi.ModelBuilderContext) error {
// We try to put things into /opt/kops // We try to put things into /opt/kops
// On some OSes though, /opt/ is not writeable, and we can't even create the mountpoint // On some OSes though, /opt/ is not writeable, and we can't even create the mountpoint
if b.Distribution == distros.DistributionContainerOS { if b.Distribution == distributions.DistributionContainerOS {
src := "/mnt/stateful_partition/opt/" src := "/mnt/stateful_partition/opt/"
c.AddTask(&nodetasks.File{ c.AddTask(&nodetasks.File{

View File

@ -26,7 +26,6 @@ import (
"github.com/blang/semver/v4" "github.com/blang/semver/v4"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/nodeup/pkg/model/resources" "k8s.io/kops/nodeup/pkg/model/resources"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
@ -34,6 +33,7 @@ import (
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
) )
// DockerBuilder install docker (just the packages at the moment) // DockerBuilder install docker (just the packages at the moment)
@ -50,7 +50,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.03.2", PackageVersion: "17.03.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.03.2~ce-0~debian-stretch", Version: "17.03.2~ce-0~debian-stretch",
Source: "http://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.03.2~ce-0~debian-stretch_amd64.deb", Source: "http://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.03.2~ce-0~debian-stretch_amd64.deb",
@ -62,7 +62,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.03.2", PackageVersion: "17.03.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionXenial}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1604},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.03.2~ce-0~ubuntu-xenial", Version: "17.03.2~ce-0~ubuntu-xenial",
Source: "http://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb", Source: "http://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb",
@ -74,7 +74,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.03.2", PackageVersion: "17.03.2",
PlainBinary: true, PlainBinary: true,
Distros: []distros.Distribution{distros.DistributionBionic}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1804},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Source: "http://download.docker.com/linux/static/stable/x86_64/docker-17.03.2-ce.tgz", Source: "http://download.docker.com/linux/static/stable/x86_64/docker-17.03.2-ce.tgz",
Hash: "183b31b001e7480f3c691080486401aa519101a5cfe6e05ad01b9f5521c4112d", Hash: "183b31b001e7480f3c691080486401aa519101a5cfe6e05ad01b9f5521c4112d",
@ -85,7 +85,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.03.2", PackageVersion: "17.03.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionRhel7, distros.DistributionCentos7, distros.DistributionAmazonLinux2}, Distros: []distributions.Distribution{distributions.DistributionRhel7, distributions.DistributionCentos7, distributions.DistributionAmazonLinux2},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.03.2.ce", Version: "17.03.2.ce",
Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm", Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm",
@ -105,7 +105,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.09.0", PackageVersion: "17.09.0",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.09.0~ce-0~debian", Version: "17.09.0~ce-0~debian",
Source: "http://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb", Source: "http://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb",
@ -116,7 +116,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.09.0", PackageVersion: "17.09.0",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionXenial}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1604},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.09.0~ce-0~ubuntu", Version: "17.09.0~ce-0~ubuntu",
Source: "http://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.09.0~ce-0~ubuntu_amd64.deb", Source: "http://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.09.0~ce-0~ubuntu_amd64.deb",
@ -127,7 +127,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.2", PackageVersion: "18.06.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionXenial}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1604},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.2~ce~3-0~ubuntu", Version: "18.06.2~ce~3-0~ubuntu",
Source: "https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~ubuntu_amd64.deb", Source: "https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~ubuntu_amd64.deb",
@ -138,7 +138,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "17.09.0", PackageVersion: "17.09.0",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionRhel7, distros.DistributionCentos7, distros.DistributionAmazonLinux2}, Distros: []distributions.Distribution{distributions.DistributionRhel7, distributions.DistributionCentos7, distributions.DistributionAmazonLinux2},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "17.09.0.ce", Version: "17.09.0.ce",
Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm", Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm",
@ -149,7 +149,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.03.1", PackageVersion: "18.03.1",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionBionic}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1804},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.03.1~ce~3-0~ubuntu", Version: "18.03.1~ce~3-0~ubuntu",
Source: "https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_18.03.1~ce~3-0~ubuntu_amd64.deb", Source: "https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_18.03.1~ce~3-0~ubuntu_amd64.deb",
@ -160,7 +160,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.2", PackageVersion: "18.06.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionBionic}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1804},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.2~ce~3-0~ubuntu", Version: "18.06.2~ce~3-0~ubuntu",
Source: "https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~ubuntu_amd64.deb", Source: "https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~ubuntu_amd64.deb",
@ -171,7 +171,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.1", PackageVersion: "18.06.1",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.1~ce~3-0~debian", Version: "18.06.1~ce~3-0~debian",
Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.1~ce~3-0~debian_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.1~ce~3-0~debian_amd64.deb",
@ -183,7 +183,7 @@ var dockerVersions = []packageVersion{
PackageVersion: "18.06.2", PackageVersion: "18.06.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.2~ce~3-0~debian", Version: "18.06.2~ce~3-0~debian",
Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~debian_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.2~ce~3-0~debian_amd64.deb",
@ -194,7 +194,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.1", PackageVersion: "18.06.1",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionRhel7, distros.DistributionCentos7, distros.DistributionAmazonLinux2}, Distros: []distributions.Distribution{distributions.DistributionRhel7, distributions.DistributionCentos7, distributions.DistributionAmazonLinux2},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.1.ce", Version: "18.06.1.ce",
Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm", Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm",
@ -205,7 +205,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.09.3", PackageVersion: "18.09.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "5:18.09.3~3-0~debian-stretch", Version: "5:18.09.3~3-0~debian-stretch",
Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.09.3~3-0~debian-stretch_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.09.3~3-0~debian-stretch_amd64.deb",
@ -223,7 +223,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.2", PackageVersion: "18.06.2",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionRhel7, distros.DistributionCentos7, distros.DistributionAmazonLinux2}, Distros: []distributions.Distribution{distributions.DistributionRhel7, distributions.DistributionCentos7, distributions.DistributionAmazonLinux2},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.2.ce", Version: "18.06.2.ce",
Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.2.ce-3.el7.x86_64.rpm", Source: "https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.2.ce-3.el7.x86_64.rpm",
@ -236,7 +236,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.3", PackageVersion: "18.06.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionXenial}, Distros: []distributions.Distribution{distributions.DistributionUbuntu1604},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.3~ce~3-0~ubuntu", Version: "18.06.3~ce~3-0~ubuntu",
Source: "https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~ubuntu_amd64.deb", Source: "https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~ubuntu_amd64.deb",
@ -247,9 +247,9 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.3", PackageVersion: "18.06.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{ Distros: []distributions.Distribution{
distros.DistributionBionic, distributions.DistributionUbuntu1804,
distros.DistributionFocal, distributions.DistributionUbuntu2004,
}, },
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.3~ce~3-0~ubuntu", Version: "18.06.3~ce~3-0~ubuntu",
@ -261,7 +261,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.3", PackageVersion: "18.06.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian9}, Distros: []distributions.Distribution{distributions.DistributionDebian9},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.3~ce~3-0~debian", Version: "18.06.3~ce~3-0~debian",
Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~debian_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~debian_amd64.deb",
@ -272,7 +272,7 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.3", PackageVersion: "18.06.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{distros.DistributionDebian10}, Distros: []distributions.Distribution{distributions.DistributionDebian10},
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.3~ce~3-0~debian", Version: "18.06.3~ce~3-0~debian",
Source: "https://download.docker.com/linux/debian/dists/buster/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~debian_amd64.deb", Source: "https://download.docker.com/linux/debian/dists/buster/pool/stable/amd64/docker-ce_18.06.3~ce~3-0~debian_amd64.deb",
@ -283,12 +283,12 @@ var dockerVersions = []packageVersion{
{ {
PackageVersion: "18.06.3", PackageVersion: "18.06.3",
Name: "docker-ce", Name: "docker-ce",
Distros: []distros.Distribution{ Distros: []distributions.Distribution{
distros.DistributionAmazonLinux2, distributions.DistributionAmazonLinux2,
distros.DistributionCentos7, distributions.DistributionCentos7,
distros.DistributionCentos8, distributions.DistributionCentos8,
distros.DistributionRhel7, distributions.DistributionRhel7,
distros.DistributionRhel8, distributions.DistributionRhel8,
}, },
Architectures: []architectures.Architecture{architectures.ArchitectureAmd64}, Architectures: []architectures.Architecture{architectures.ArchitectureAmd64},
Version: "18.06.3.ce", Version: "18.06.3.ce",
@ -381,14 +381,14 @@ func (b *DockerBuilder) Build(c *fi.ModelBuilderContext) error {
// @check: neither flatcar nor containeros need provision docker.service, just the docker daemon options // @check: neither flatcar nor containeros need provision docker.service, just the docker daemon options
switch b.Distribution { switch b.Distribution {
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.Infof("Detected Flatcar; won't install Docker") klog.Infof("Detected Flatcar; won't install Docker")
if err := b.buildContainerOSConfigurationDropIn(c); err != nil { if err := b.buildContainerOSConfigurationDropIn(c); err != nil {
return err return err
} }
return nil return nil
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.Infof("Detected ContainerOS; won't install Docker") klog.Infof("Detected ContainerOS; won't install Docker")
if err := b.buildContainerOSConfigurationDropIn(c); err != nil { if err := b.buildContainerOSConfigurationDropIn(c); err != nil {
return err return err
@ -708,7 +708,7 @@ func (b *DockerBuilder) buildSysconfig(c *fi.ModelBuilderContext) error {
} }
// ContainerOS now sets the storage flag in /etc/docker/daemon.json, and it is an error to set it twice // ContainerOS now sets the storage flag in /etc/docker/daemon.json, and it is an error to set it twice
if b.Distribution == distros.DistributionContainerOS { if b.Distribution == distributions.DistributionContainerOS {
// So that we can support older COS images though, we do check for /etc/docker/daemon.json // So that we can support older COS images though, we do check for /etc/docker/daemon.json
if b, err := ioutil.ReadFile("/etc/docker/daemon.json"); err != nil { if b, err := ioutil.ReadFile("/etc/docker/daemon.json"); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {

View File

@ -25,11 +25,11 @@ import (
"strings" "strings"
"testing" "testing"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
"k8s.io/kops/pkg/testutils" "k8s.io/kops/pkg/testutils"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/hashing" "k8s.io/kops/util/pkg/hashing"
) )
@ -250,7 +250,7 @@ func runDockerBuilderTest(t *testing.T, key string) {
basedir := path.Join("tests/dockerbuilder/", key) basedir := path.Join("tests/dockerbuilder/", key)
nodeUpModelContext, err := BuildNodeupModelContext(basedir) nodeUpModelContext, err := BuildNodeupModelContext(basedir)
nodeUpModelContext.Distribution = distros.DistributionXenial nodeUpModelContext.Distribution = distributions.DistributionUbuntu1604
if err != nil { if err != nil {
t.Fatalf("error parsing cluster yaml %q: %v", basedir, err) t.Fatalf("error parsing cluster yaml %q: %v", basedir, err)
return return

View File

@ -17,10 +17,10 @@ limitations under the License.
package model package model
import ( import (
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/wellknownusers" "k8s.io/kops/pkg/wellknownusers"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
@ -39,11 +39,11 @@ func (b *EtcdBuilder) Build(c *fi.ModelBuilderContext) error {
} }
switch b.Distribution { switch b.Distribution {
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.Infof("Detected Flatcar; skipping etcd user installation") klog.Infof("Detected Flatcar; skipping etcd user installation")
return nil return nil
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.Infof("Detected ContainerOS; skipping etcd user installation") klog.Infof("Detected ContainerOS; skipping etcd user installation")
return nil return nil
} }

View File

@ -21,7 +21,6 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
"k8s.io/kops/pkg/k8scodecs" "k8s.io/kops/pkg/k8scodecs"
"k8s.io/kops/pkg/kubemanifest" "k8s.io/kops/pkg/kubemanifest"
@ -29,6 +28,7 @@ import (
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/exec" "k8s.io/kops/util/pkg/exec"
"k8s.io/kops/util/pkg/proxy" "k8s.io/kops/util/pkg/proxy"
@ -146,11 +146,11 @@ func (b *KubeControllerManagerBuilder) buildPod() (*v1.Pod, error) {
// Ensure the Volume Plugin dir is mounted on the same path as the host machine so DaemonSet deployment is possible // Ensure the Volume Plugin dir is mounted on the same path as the host machine so DaemonSet deployment is possible
if volumePluginDir == "" { if volumePluginDir == "" {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
// Default is different on ContainerOS, see https://github.com/kubernetes/kubernetes/pull/58171 // Default is different on ContainerOS, see https://github.com/kubernetes/kubernetes/pull/58171
volumePluginDir = "/home/kubernetes/flexvolume/" volumePluginDir = "/home/kubernetes/flexvolume/"
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
// The /usr directory is read-only for Flatcar // The /usr directory is read-only for Flatcar
volumePluginDir = "/var/lib/kubelet/volumeplugins/" volumePluginDir = "/var/lib/kubelet/volumeplugins/"

View File

@ -19,10 +19,10 @@ package model
import ( import (
"fmt" "fmt"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/rbac" "k8s.io/kops/pkg/rbac"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
@ -106,15 +106,15 @@ func (b *KubectlBuilder) Build(c *fi.ModelBuilderContext) error {
func (b *KubectlBuilder) findKubeconfigUser() (*fi.User, *fi.Group, error) { func (b *KubectlBuilder) findKubeconfigUser() (*fi.User, *fi.Group, error) {
var users []string var users []string
switch b.Distribution { switch b.Distribution {
case distros.DistributionDebian9, distros.DistributionDebian10: case distributions.DistributionDebian9, distributions.DistributionDebian10:
users = []string{"admin", "root"} users = []string{"admin", "root"}
case distros.DistributionXenial, distros.DistributionBionic, distros.DistributionFocal: case distributions.DistributionUbuntu1604, distributions.DistributionUbuntu1804, distributions.DistributionUbuntu2004:
users = []string{"ubuntu"} users = []string{"ubuntu"}
case distros.DistributionCentos7, distros.DistributionCentos8: case distributions.DistributionCentos7, distributions.DistributionCentos8:
users = []string{"centos"} users = []string{"centos"}
case distros.DistributionAmazonLinux2, distros.DistributionRhel7, distros.DistributionRhel8: case distributions.DistributionAmazonLinux2, distributions.DistributionRhel7, distributions.DistributionRhel8:
users = []string{"ec2-user"} users = []string{"ec2-user"}
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
users = []string{"core"} users = []string{"core"}
default: default:
klog.Warningf("Unknown distro; won't write kubeconfig to homedir %s", b.Distribution) klog.Warningf("Unknown distro; won't write kubeconfig to homedir %s", b.Distribution)

View File

@ -28,7 +28,6 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/flagbuilder" "k8s.io/kops/pkg/flagbuilder"
"k8s.io/kops/pkg/nodelabels" "k8s.io/kops/pkg/nodelabels"
@ -37,6 +36,7 @@ import (
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
) )
const ( const (
@ -145,10 +145,10 @@ func (b *KubeletBuilder) Build(c *fi.ModelBuilderContext) error {
// kubeletPath returns the path of the kubelet based on distro // kubeletPath returns the path of the kubelet based on distro
func (b *KubeletBuilder) kubeletPath() string { func (b *KubeletBuilder) kubeletPath() string {
kubeletCommand := "/usr/local/bin/kubelet" kubeletCommand := "/usr/local/bin/kubelet"
if b.Distribution == distros.DistributionFlatcar { if b.Distribution == distributions.DistributionFlatcar {
kubeletCommand = "/opt/kubernetes/bin/kubelet" kubeletCommand = "/opt/kubernetes/bin/kubelet"
} }
if b.Distribution == distros.DistributionContainerOS { if b.Distribution == distributions.DistributionContainerOS {
kubeletCommand = "/home/kubernetes/bin/kubelet" kubeletCommand = "/home/kubernetes/bin/kubelet"
} }
return kubeletCommand return kubeletCommand
@ -299,7 +299,7 @@ func (b *KubeletBuilder) buildKubeletConfig() (*kops.KubeletConfigSpec, error) {
// usesContainerizedMounter returns true if we use the containerized mounter // usesContainerizedMounter returns true if we use the containerized mounter
func (b *KubeletBuilder) usesContainerizedMounter() bool { func (b *KubeletBuilder) usesContainerizedMounter() bool {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
return true return true
default: default:
return false return false
@ -482,11 +482,11 @@ func (b *KubeletBuilder) buildKubeletConfigSpec() (*kops.KubeletConfigSpec, erro
if c.VolumePluginDirectory == "" { if c.VolumePluginDirectory == "" {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
// Default is different on ContainerOS, see https://github.com/kubernetes/kubernetes/pull/58171 // Default is different on ContainerOS, see https://github.com/kubernetes/kubernetes/pull/58171
c.VolumePluginDirectory = "/home/kubernetes/flexvolume/" c.VolumePluginDirectory = "/home/kubernetes/flexvolume/"
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
// The /usr directory is read-only for Flatcar // The /usr directory is read-only for Flatcar
c.VolumePluginDirectory = "/var/lib/kubelet/volumeplugins/" c.VolumePluginDirectory = "/var/lib/kubelet/volumeplugins/"
@ -498,7 +498,7 @@ func (b *KubeletBuilder) buildKubeletConfigSpec() (*kops.KubeletConfigSpec, erro
// In certain configurations systemd-resolved will put the loopback address 127.0.0.53 as a nameserver into /etc/resolv.conf // In certain configurations systemd-resolved will put the loopback address 127.0.0.53 as a nameserver into /etc/resolv.conf
// https://github.com/coredns/coredns/blob/master/plugin/loop/README.md#troubleshooting-loops-in-kubernetes-clusters // https://github.com/coredns/coredns/blob/master/plugin/loop/README.md#troubleshooting-loops-in-kubernetes-clusters
if c.ResolverConfig == nil { if c.ResolverConfig == nil {
if b.Distribution == distros.DistributionBionic || b.Distribution == distros.DistributionFocal { if b.Distribution == distributions.DistributionUbuntu1804 || b.Distribution == distributions.DistributionUbuntu2004 {
c.ResolverConfig = s("/run/systemd/resolve/resolv.conf") c.ResolverConfig = s("/run/systemd/resolve/resolv.conf")
} }
} }

View File

@ -20,11 +20,11 @@ import (
"fmt" "fmt"
"strings" "strings"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops/util" "k8s.io/kops/pkg/apis/kops/util"
"k8s.io/kops/pkg/systemd" "k8s.io/kops/pkg/systemd"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
@ -40,10 +40,10 @@ var _ fi.ModelBuilder = &LogrotateBuilder{}
func (b *LogrotateBuilder) Build(c *fi.ModelBuilderContext) error { func (b *LogrotateBuilder) Build(c *fi.ModelBuilderContext) error {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.Infof("Detected ContainerOS; won't install logrotate") klog.Infof("Detected ContainerOS; won't install logrotate")
return nil return nil
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.Infof("Detected Flatcar; won't install logrotate") klog.Infof("Detected Flatcar; won't install logrotate")
default: default:
c.AddTask(&nodetasks.Package{Name: "logrotate"}) c.AddTask(&nodetasks.Package{Name: "logrotate"})
@ -90,7 +90,7 @@ func (b *LogrotateBuilder) Build(c *fi.ModelBuilderContext) error {
// addLogrotateService creates a logrotate systemd task to act as target for the timer, if one is needed // addLogrotateService creates a logrotate systemd task to act as target for the timer, if one is needed
func (b *LogrotateBuilder) addLogrotateService(c *fi.ModelBuilderContext) error { func (b *LogrotateBuilder) addLogrotateService(c *fi.ModelBuilderContext) error {
switch b.Distribution { switch b.Distribution {
case distros.DistributionFlatcar, distros.DistributionContainerOS: case distributions.DistributionFlatcar, distributions.DistributionContainerOS:
// logrotate service already exists // logrotate service already exists
return nil return nil
} }
@ -121,7 +121,7 @@ func (b *LogrotateBuilder) addLogRotate(c *fi.ModelBuilderContext, name, path st
// Flatcar sets "dateext" options, and maxsize-based rotation will fail if // Flatcar sets "dateext" options, and maxsize-based rotation will fail if
// the file has been previously rotated on the same calendar date. // the file has been previously rotated on the same calendar date.
if b.Distribution == distros.DistributionFlatcar { if b.Distribution == distributions.DistributionFlatcar {
options.DateFormat = "-%Y%m%d-%s" options.DateFormat = "-%Y%m%d-%s"
} }

View File

@ -18,9 +18,9 @@ package model
import ( import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
) )
// MiscUtilsBuilder ensures that some system packages that are // MiscUtilsBuilder ensures that some system packages that are
@ -34,10 +34,10 @@ var _ fi.ModelBuilder = &MiscUtilsBuilder{}
// Build is responsible for configuring the miscellaneous packages we want installed // Build is responsible for configuring the miscellaneous packages we want installed
func (b *MiscUtilsBuilder) Build(c *fi.ModelBuilderContext) error { func (b *MiscUtilsBuilder) Build(c *fi.ModelBuilderContext) error {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.V(2).Infof("Detected ContainerOS; won't install misc. utils") klog.V(2).Infof("Detected ContainerOS; won't install misc. utils")
return nil return nil
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.V(2).Infof("Detected Flatcar; won't install misc. utils") klog.V(2).Infof("Detected Flatcar; won't install misc. utils")
return nil return nil
} }

View File

@ -18,9 +18,9 @@ package model
import ( import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
) )
// NTPBuilder installs and starts NTP, to ensure accurate clock times. // NTPBuilder installs and starts NTP, to ensure accurate clock times.
@ -35,10 +35,10 @@ var _ fi.ModelBuilder = &NTPBuilder{}
// Build is responsible for configuring NTP // Build is responsible for configuring NTP
func (b *NTPBuilder) Build(c *fi.ModelBuilderContext) error { func (b *NTPBuilder) Build(c *fi.ModelBuilderContext) error {
switch b.Distribution { switch b.Distribution {
case distros.DistributionContainerOS: case distributions.DistributionContainerOS:
klog.Infof("Detected ContainerOS; won't install ntp") klog.Infof("Detected ContainerOS; won't install ntp")
return nil return nil
case distros.DistributionFlatcar: case distributions.DistributionFlatcar:
klog.Infof("Detected Flatcar; won't install ntp") klog.Infof("Detected Flatcar; won't install ntp")
return nil return nil
} }

View File

@ -17,9 +17,9 @@ limitations under the License.
package model package model
import ( import (
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
@ -64,14 +64,14 @@ func (b *PackagesBuilder) Build(c *fi.ModelBuilderContext) error {
c.AddTask(&nodetasks.Package{Name: "util-linux"}) c.AddTask(&nodetasks.Package{Name: "util-linux"})
// Handle some packages differently for each distro // Handle some packages differently for each distro
switch b.Distribution { switch b.Distribution {
case distros.DistributionRhel7: case distributions.DistributionRhel7:
// Easier to install container-selinux from CentOS than extras // Easier to install container-selinux from CentOS than extras
c.AddTask(&nodetasks.Package{ c.AddTask(&nodetasks.Package{
Name: "container-selinux", Name: "container-selinux",
Source: s("http://vault.centos.org/7.6.1810/extras/x86_64/Packages/container-selinux-2.107-1.el7_6.noarch.rpm"), Source: s("http://vault.centos.org/7.6.1810/extras/x86_64/Packages/container-selinux-2.107-1.el7_6.noarch.rpm"),
Hash: s("7de4211fa0dfd240d8827b93763e1eb5f0d56411"), Hash: s("7de4211fa0dfd240d8827b93763e1eb5f0d56411"),
}) })
case distros.DistributionAmazonLinux2: case distributions.DistributionAmazonLinux2:
// Amazon Linux 2 doesn't have SELinux enabled by default // Amazon Linux 2 doesn't have SELinux enabled by default
default: default:
c.AddTask(&nodetasks.Package{Name: "container-selinux"}) c.AddTask(&nodetasks.Package{Name: "container-selinux"})

View File

@ -20,10 +20,10 @@ import (
"fmt" "fmt"
"strings" "strings"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
) )
// SysctlBuilder set up our sysctls // SysctlBuilder set up our sysctls
@ -125,7 +125,7 @@ func (b *SysctlBuilder) Build(c *fi.ModelBuilderContext) error {
proxyMode = "iptables" proxyMode = "iptables"
} }
if proxyMode == "iptables" && (b.Distribution == distros.DistributionCentos7 || b.Distribution == distros.DistributionRhel7) { if proxyMode == "iptables" && (b.Distribution == distributions.DistributionCentos7 || b.Distribution == distributions.DistributionRhel7) {
sysctls = append(sysctls, sysctls = append(sysctls,
"# Flannel settings on CentOS 7", "# Flannel settings on CentOS 7",
"# Issue https://github.com/coreos/flannel/issues/902", "# Issue https://github.com/coreos/flannel/issues/902",

View File

@ -17,11 +17,11 @@ limitations under the License.
package model package model
import ( import (
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/systemd" "k8s.io/kops/pkg/systemd"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks" "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
@ -39,7 +39,7 @@ var _ fi.ModelBuilder = &UpdateServiceBuilder{}
// Build is responsible for configuring automatic updates based on the OS. // Build is responsible for configuring automatic updates based on the OS.
func (b *UpdateServiceBuilder) Build(c *fi.ModelBuilderContext) error { func (b *UpdateServiceBuilder) Build(c *fi.ModelBuilderContext) error {
if b.Distribution == distros.DistributionFlatcar { if b.Distribution == distributions.DistributionFlatcar {
b.buildFlatcarSystemdService(c) b.buildFlatcarSystemdService(c)
} else if b.Distribution.IsDebianFamily() { } else if b.Distribution.IsDebianFamily() {
b.buildDebianPackage(c) b.buildDebianPackage(c)

View File

@ -9,7 +9,6 @@ go_library(
importpath = "k8s.io/kops/upup/pkg/fi/nodeup", importpath = "k8s.io/kops/upup/pkg/fi/nodeup",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//nodeup/pkg/distros:go_default_library",
"//nodeup/pkg/model:go_default_library", "//nodeup/pkg/model:go_default_library",
"//nodeup/pkg/model/networking:go_default_library", "//nodeup/pkg/model/networking:go_default_library",
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
@ -23,6 +22,7 @@ go_library(
"//upup/pkg/fi/secrets:go_default_library", "//upup/pkg/fi/secrets:go_default_library",
"//upup/pkg/fi/utils:go_default_library", "//upup/pkg/fi/utils:go_default_library",
"//util/pkg/architectures:go_default_library", "//util/pkg/architectures:go_default_library",
"//util/pkg/distributions:go_default_library",
"//util/pkg/vfs:go_default_library", "//util/pkg/vfs:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",

View File

@ -27,7 +27,6 @@ import (
"strings" "strings"
"time" "time"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/nodeup/pkg/model" "k8s.io/kops/nodeup/pkg/model"
"k8s.io/kops/nodeup/pkg/model/networking" "k8s.io/kops/nodeup/pkg/model/networking"
api "k8s.io/kops/pkg/apis/kops" api "k8s.io/kops/pkg/apis/kops"
@ -41,6 +40,7 @@ import (
"k8s.io/kops/upup/pkg/fi/secrets" "k8s.io/kops/upup/pkg/fi/secrets"
"k8s.io/kops/upup/pkg/fi/utils" "k8s.io/kops/upup/pkg/fi/utils"
"k8s.io/kops/util/pkg/architectures" "k8s.io/kops/util/pkg/architectures"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/vfs" "k8s.io/kops/util/pkg/vfs"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
@ -157,7 +157,7 @@ func (c *NodeUpCommand) Run(out io.Writer) error {
return fmt.Errorf("error determining OS architecture: %v", err) return fmt.Errorf("error determining OS architecture: %v", err)
} }
distribution, err := distros.FindDistribution("/") distribution, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return fmt.Errorf("error determining OS distribution: %v", err) return fmt.Errorf("error determining OS distribution: %v", err)
} }

View File

@ -21,7 +21,6 @@ go_library(
importpath = "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks", importpath = "k8s.io/kops/upup/pkg/fi/nodeup/nodetasks",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//nodeup/pkg/distros:go_default_library",
"//pkg/apis/kops:go_default_library", "//pkg/apis/kops:go_default_library",
"//pkg/apis/nodeup:go_default_library", "//pkg/apis/nodeup:go_default_library",
"//pkg/backoff:go_default_library", "//pkg/backoff:go_default_library",
@ -32,6 +31,7 @@ go_library(
"//upup/pkg/fi/nodeup/cloudinit:go_default_library", "//upup/pkg/fi/nodeup/cloudinit:go_default_library",
"//upup/pkg/fi/nodeup/local:go_default_library", "//upup/pkg/fi/nodeup/local:go_default_library",
"//upup/pkg/fi/utils:go_default_library", "//upup/pkg/fi/utils:go_default_library",
"//util/pkg/distributions:go_default_library",
"//util/pkg/hashing:go_default_library", "//util/pkg/hashing:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",

View File

@ -26,11 +26,11 @@ import (
"sync" "sync"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit" "k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
"k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/nodeup/local"
"k8s.io/kops/util/pkg/distributions"
"k8s.io/kops/util/pkg/hashing" "k8s.io/kops/util/pkg/hashing"
) )
@ -129,7 +129,7 @@ func (p *Package) String() string {
} }
func (e *Package) Find(c *fi.Context) (*Package, error) { func (e *Package) Find(c *fi.Context) (*Package, error) {
d, err := distros.FindDistribution("/") d, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return nil, fmt.Errorf("unknown or unsupported distro: %v", err) return nil, fmt.Errorf("unknown or unsupported distro: %v", err)
} }
@ -273,7 +273,7 @@ func (_ *Package) RenderLocal(t *local.LocalTarget, a, e, changes *Package) erro
packageManagerLock.Lock() packageManagerLock.Lock()
defer packageManagerLock.Unlock() defer packageManagerLock.Unlock()
d, err := distros.FindDistribution("/") d, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return fmt.Errorf("unknown or unsupported distro: %v", err) return fmt.Errorf("unknown or unsupported distro: %v", err)
} }
@ -327,7 +327,7 @@ func (_ *Package) RenderLocal(t *local.LocalTarget, a, e, changes *Package) erro
args = []string{"apt-get", "install", "--yes", "--no-install-recommends"} args = []string{"apt-get", "install", "--yes", "--no-install-recommends"}
env = append(env, "DEBIAN_FRONTEND=noninteractive") env = append(env, "DEBIAN_FRONTEND=noninteractive")
} else if d.IsRHELFamily() { } else if d.IsRHELFamily() {
if d == distros.DistributionCentos8 || d == distros.DistributionRhel8 { if d == distributions.DistributionCentos8 || d == distributions.DistributionRhel8 {
args = []string{"/usr/bin/dnf", "install", "-y", "--setopt=install_weak_deps=False"} args = []string{"/usr/bin/dnf", "install", "-y", "--setopt=install_weak_deps=False"}
} else { } else {
args = []string{"/usr/bin/yum", "install", "-y"} args = []string{"/usr/bin/yum", "install", "-y"}

View File

@ -26,10 +26,10 @@ import (
"time" "time"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit" "k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
"k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/nodeup/local"
"k8s.io/kops/util/pkg/distributions"
) )
const ( const (
@ -127,7 +127,7 @@ func getSystemdStatus(name string) (map[string]string, error) {
} }
func (e *Service) systemdSystemPath() (string, error) { func (e *Service) systemdSystemPath() (string, error) {
d, err := distros.FindDistribution("/") d, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return "", fmt.Errorf("unknown or unsupported distro: %v", err) return "", fmt.Errorf("unknown or unsupported distro: %v", err)
} }
@ -136,9 +136,9 @@ func (e *Service) systemdSystemPath() (string, error) {
return debianSystemdSystemPath, nil return debianSystemdSystemPath, nil
} else if d.IsRHELFamily() { } else if d.IsRHELFamily() {
return centosSystemdSystemPath, nil return centosSystemdSystemPath, nil
} else if d == distros.DistributionFlatcar { } else if d == distributions.DistributionFlatcar {
return flatcarSystemdSystemPath, nil return flatcarSystemdSystemPath, nil
} else if d == distros.DistributionContainerOS { } else if d == distributions.DistributionContainerOS {
return containerosSystemdSystemPath, nil return containerosSystemdSystemPath, nil
} else { } else {
return "", fmt.Errorf("unsupported systemd system") return "", fmt.Errorf("unsupported systemd system")

View File

@ -23,10 +23,10 @@ import (
"syscall" "syscall"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kops/nodeup/pkg/distros"
"k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit" "k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
"k8s.io/kops/upup/pkg/fi/nodeup/local" "k8s.io/kops/upup/pkg/fi/nodeup/local"
"k8s.io/kops/util/pkg/distributions"
) )
type UpdatePackages struct { type UpdatePackages struct {
@ -65,7 +65,7 @@ func (_ *UpdatePackages) RenderLocal(t *local.LocalTarget, a, e, changes *Update
klog.Infof("SKIP_PACKAGE_UPDATE was set; skipping package update") klog.Infof("SKIP_PACKAGE_UPDATE was set; skipping package update")
return nil return nil
} }
d, err := distros.FindDistribution("/") d, err := distributions.FindDistribution("/")
if err != nil { if err != nil {
return fmt.Errorf("unknown or unsupported distro: %v", err) return fmt.Errorf("unknown or unsupported distro: %v", err)
} }

View File

@ -5,5 +5,4 @@ go_library(
srcs = ["architectures.go"], srcs = ["architectures.go"],
importpath = "k8s.io/kops/util/pkg/architectures", importpath = "k8s.io/kops/util/pkg/architectures",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/klog/v2:go_default_library"],
) )

View File

@ -20,13 +20,11 @@ import (
"fmt" "fmt"
"os" "os"
"runtime" "runtime"
"k8s.io/klog/v2"
) )
type Architecture string type Architecture string
var ( const (
ArchitectureAmd64 Architecture = "amd64" ArchitectureAmd64 Architecture = "amd64"
ArchitectureArm64 Architecture = "arm64" ArchitectureArm64 Architecture = "arm64"
) )
@ -58,19 +56,3 @@ func GetSupported() []Architecture {
ArchitectureArm64, ArchitectureArm64,
} }
} }
func (a Architecture) BuildTags() []string {
var t []string
switch a {
case ArchitectureAmd64:
t = []string{"_amd64"}
case ArchitectureArm64:
t = []string{"_arm64"}
default:
klog.Fatalf("unknown architecture: %s", a)
return nil
}
return t
}

View File

@ -0,0 +1,21 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = [
"distributions.go",
"identify.go",
],
importpath = "k8s.io/kops/util/pkg/distributions",
visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/klog/v2:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["identify_test.go"],
data = [
"//util/pkg/distributions/tests:exported_testdata", # keep
],
embed = [":go_default_library"],
)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package distros package distributions
import ( import (
"k8s.io/klog/v2" "k8s.io/klog/v2"
@ -22,12 +22,12 @@ import (
type Distribution string type Distribution string
var ( const (
DistributionDebian9 Distribution = "debian9" DistributionDebian9 Distribution = "stretch"
DistributionDebian10 Distribution = "buster" DistributionDebian10 Distribution = "buster"
DistributionXenial Distribution = "xenial" DistributionUbuntu1604 Distribution = "xenial"
DistributionBionic Distribution = "bionic" DistributionUbuntu1804 Distribution = "bionic"
DistributionFocal Distribution = "focal" DistributionUbuntu2004 Distribution = "focal"
DistributionAmazonLinux2 Distribution = "amazonlinux2" DistributionAmazonLinux2 Distribution = "amazonlinux2"
DistributionRhel7 Distribution = "rhel7" DistributionRhel7 Distribution = "rhel7"
DistributionCentos7 Distribution = "centos7" DistributionCentos7 Distribution = "centos7"
@ -41,7 +41,7 @@ func (d Distribution) IsDebianFamily() bool {
switch d { switch d {
case DistributionDebian9, DistributionDebian10: case DistributionDebian9, DistributionDebian10:
return true return true
case DistributionXenial, DistributionBionic, DistributionFocal: case DistributionUbuntu1604, DistributionUbuntu1804, DistributionUbuntu2004:
return true return true
case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2: case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2:
return false return false
@ -57,7 +57,7 @@ func (d Distribution) IsUbuntu() bool {
switch d { switch d {
case DistributionDebian9, DistributionDebian10: case DistributionDebian9, DistributionDebian10:
return false return false
case DistributionXenial, DistributionBionic, DistributionFocal: case DistributionUbuntu1604, DistributionUbuntu1804, DistributionUbuntu2004:
return true return true
case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2: case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2:
return false return false
@ -73,7 +73,7 @@ func (d Distribution) IsRHELFamily() bool {
switch d { switch d {
case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2: case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2:
return true return true
case DistributionXenial, DistributionBionic, DistributionFocal, DistributionDebian9, DistributionDebian10: case DistributionUbuntu1604, DistributionUbuntu1804, DistributionUbuntu2004, DistributionDebian9, DistributionDebian10:
return false return false
case DistributionFlatcar, DistributionContainerOS: case DistributionFlatcar, DistributionContainerOS:
return false return false
@ -85,7 +85,7 @@ func (d Distribution) IsRHELFamily() bool {
func (d Distribution) IsSystemd() bool { func (d Distribution) IsSystemd() bool {
switch d { switch d {
case DistributionXenial, DistributionBionic, DistributionFocal, DistributionDebian9, DistributionDebian10: case DistributionUbuntu1604, DistributionUbuntu1804, DistributionUbuntu2004, DistributionDebian9, DistributionDebian10:
return true return true
case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2: case DistributionCentos7, DistributionRhel7, DistributionCentos8, DistributionRhel8, DistributionAmazonLinux2:
return true return true

View File

@ -0,0 +1,86 @@
/*
Copyright 2019 The Kubernetes 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 distributions
import (
"fmt"
"io/ioutil"
"path"
"strings"
"k8s.io/klog/v2"
)
// FindDistribution identifies the distribution on which we are running
func FindDistribution(rootfs string) (Distribution, error) {
// All supported distros have an /etc/os-release file
osReleaseBytes, err := ioutil.ReadFile(path.Join(rootfs, "etc/os-release"))
osRelease := make(map[string]string)
if err == nil {
for _, line := range strings.Split(string(osReleaseBytes), "\n") {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "ID=") {
osRelease["ID"] = strings.Trim(line[3:], "\"")
}
if strings.HasPrefix(line, "VERSION_ID=") {
osRelease["VERSION_ID"] = strings.Trim(line[11:], "\"")
}
}
} else {
return "", fmt.Errorf("reading /etc/os-release: %v", err)
}
distro := fmt.Sprintf("%s-%s", osRelease["ID"], osRelease["VERSION_ID"])
// Most distros have a fixed VERSION_ID
switch distro {
case "amzn-2":
return DistributionAmazonLinux2, nil
case "centos-7":
return DistributionCentos7, nil
case "centos-8":
return DistributionCentos8, nil
case "debian-9":
return DistributionDebian9, nil
case "debian-10":
return DistributionDebian10, nil
case "ubuntu-16.04":
return DistributionUbuntu1604, nil
case "ubuntu-18.04":
return DistributionUbuntu1804, nil
case "ubuntu-20.04":
return DistributionUbuntu2004, nil
}
// Some distros have a more verbose VERSION_ID
if strings.HasPrefix(distro, "cos-") {
return DistributionContainerOS, nil
}
if strings.HasPrefix(distro, "flatcar-") {
return DistributionFlatcar, nil
}
if strings.HasPrefix(distro, "rhel-7.") {
return DistributionRhel7, nil
}
if strings.HasPrefix(distro, "rhel-8.") {
return DistributionRhel8, nil
}
// Some distros are not supported
klog.V(2).Infof("Contents of /etc/os-release:\n%s", osReleaseBytes)
return "", fmt.Errorf("unsupported distro: %s", distro)
}

View File

@ -0,0 +1,119 @@
/*
Copyright 2020 The Kubernetes 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 distributions
import (
"fmt"
"path"
"reflect"
"testing"
)
func TestFindDistribution(t *testing.T) {
tests := []struct {
rootfs string
err error
expected Distribution
}{
{
rootfs: "amazonlinux2",
err: nil,
expected: DistributionAmazonLinux2,
},
{
rootfs: "centos7",
err: nil,
expected: DistributionCentos7,
},
{
rootfs: "centos8",
err: nil,
expected: DistributionCentos8,
},
{
rootfs: "coreos",
err: fmt.Errorf("unsupported distro: coreos-2247.7.0"),
expected: "",
},
{
rootfs: "containeros",
err: nil,
expected: DistributionContainerOS,
},
{
rootfs: "debian8",
err: fmt.Errorf("unsupported distro: debian-8"),
expected: "",
},
{
rootfs: "debian9",
err: nil,
expected: DistributionDebian9,
},
{
rootfs: "debian10",
err: nil,
expected: DistributionDebian10,
},
{
rootfs: "flatcar",
err: nil,
expected: DistributionFlatcar,
},
{
rootfs: "rhel7",
err: nil,
expected: DistributionRhel7,
},
{
rootfs: "rhel8",
err: nil,
expected: DistributionRhel8,
},
{
rootfs: "ubuntu1604",
err: nil,
expected: DistributionUbuntu1604,
},
{
rootfs: "ubuntu1804",
err: nil,
expected: DistributionUbuntu1804,
},
{
rootfs: "ubuntu2004",
err: nil,
expected: DistributionUbuntu2004,
},
{
rootfs: "notfound",
err: fmt.Errorf("reading /etc/os-release: open tests/notfound/etc/os-release: no such file or directory"),
expected: "",
},
}
for _, test := range tests {
actual, err := FindDistribution(path.Join("tests", test.rootfs))
if !reflect.DeepEqual(err, test.err) {
t.Errorf("unexpected error, actual=\"%v\", expected=\"%v\"", err, test.err)
continue
}
if actual != test.expected {
t.Errorf("unexpected distribution, actual=%q, expected=%q", actual, test.expected)
}
}
}

View File

@ -0,0 +1,5 @@
filegroup(
name = "exported_testdata",
srcs = glob(["**"]),
visibility = ["//visibility:public"],
)

View File

@ -0,0 +1,9 @@
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

View File

@ -0,0 +1,16 @@
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

View File

@ -0,0 +1,17 @@
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"

View File

@ -0,0 +1,11 @@
BUILD_ID=12871.1185.0
NAME="Container-Optimized OS"
KERNEL_COMMIT_ID=1d5bc45f886bc0308010614cdcdf658f5fb44a25
GOOGLE_CRASH_ID=Lakitu
VERSION_ID=81
BUG_REPORT_URL="https://cloud.google.com/container-optimized-os/docs/resources/support-policy#contact_us"
PRETTY_NAME="Container-Optimized OS from Google"
VERSION=81
GOOGLE_METRICS_PRODUCT_ID=26
HOME_URL="https://cloud.google.com/container-optimized-os/docs"
ID=cos

View File

@ -0,0 +1,10 @@
NAME="Container Linux by CoreOS"
ID=coreos
VERSION=2247.7.0
VERSION_ID=2247.7.0
BUILD_ID=2019-11-19-2251
PRETTY_NAME="Container Linux by CoreOS 2247.7.0 (Rhyolite)"
ANSI_COLOR="38;5;75"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://issues.coreos.com"
COREOS_BOARD="amd64-usr"

View File

@ -0,0 +1,9 @@
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

View File

@ -0,0 +1,8 @@
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

View File

@ -0,0 +1,8 @@
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

View File

@ -0,0 +1,11 @@
NAME="Flatcar Container Linux by Kinvolk"
ID=flatcar
ID_LIKE=coreos
VERSION=2592.0.0
VERSION_ID=2592.0.0
BUILD_ID=2020-08-05-2321
PRETTY_NAME="Flatcar Container Linux by Kinvolk 2592.0.0 (Oklo)"
ANSI_COLOR="38;5;75"
HOME_URL="https://flatcar-linux.org/"
BUG_REPORT_URL="https://issues.flatcar-linux.org"
FLATCAR_BOARD="amd64-usr"

View File

@ -0,0 +1,17 @@
NAME="Red Hat Enterprise Linux Server"
VERSION="7.8 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.8"
PRETTY_NAME="Red Hat Enterprise Linux Server 7.8 (Maipo)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.8:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7"
REDHAT_BUGZILLA_PRODUCT_VERSION=7.8
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="7.8"

View File

@ -0,0 +1,16 @@
NAME="Red Hat Enterprise Linux"
VERSION="8.2 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.2"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.2 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.2:GA"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.2"

View File

@ -0,0 +1,11 @@
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

View File

@ -0,0 +1,12 @@
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

View File

@ -0,0 +1,12 @@
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal