Move and rename the "distros" package

This commit is contained in:
Ciprian Hacman 2020-08-14 02:56:21 +03:00
parent 56f3cb3348
commit e68ee80a93
30 changed files with 114 additions and 114 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

@ -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.DistributionXenial
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"
@ -416,10 +416,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.DistributionXenial},
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.DistributionBionic},
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.DistributionXenial},
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.DistributionXenial},
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.DistributionBionic},
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.DistributionBionic},
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.DistributionXenial},
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.DistributionBionic,
distros.DistributionFocal, distributions.DistributionFocal,
}, },
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.DistributionXenial
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.DistributionXenial, distributions.DistributionBionic, distributions.DistributionFocal:
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.DistributionBionic || b.Distribution == distributions.DistributionFocal {
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

@ -3,10 +3,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"distribution.go", "distributions.go",
"identify.go", "identify.go",
], ],
importpath = "k8s.io/kops/nodeup/pkg/distros", importpath = "k8s.io/kops/util/pkg/distributions",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/klog/v2:go_default_library"], deps = ["//vendor/k8s.io/klog/v2: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"

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 (
"fmt" "fmt"