From 79db1f3eed7088d4a7d328c0de90aa463e8f6b48 Mon Sep 17 00:00:00 2001 From: Gleb Aronsky Date: Wed, 5 Jan 2022 13:06:05 -0500 Subject: [PATCH] Add Kubernetes 1.23.1 pkg Changes for adding Kubernetes 1.23.1 in StarlingX, including build environment updates. The package builds successfully. Built and installed an iso with K8s 1.23.1 on AIO-SX. Depends-On: https://review.opendev.org/c/starlingx/compile/+/825651 Story: 2009830 Task: 44424 Change-Id: I3e2b793d7b88057fc597b2445bddd137bb2b4fcf Signed-off-by: Gleb Aronsky --- centos_iso_image.inc | 3 + centos_pkg_dirs | 1 + centos_tarball-dl.lst | 1 + .../kubernetes-1.23.1/centos/Readme.rst | 4 + .../kubernetes-1.23.1/centos/build_srpm.data | 5 + ...th-for-coredns-only-for-default-repo.patch | 113 + ...rt-for-kubernetes-to-ignore-isolcpus.patch | 79 + ...latform-pods-with-zero-CPU-resources.patch | 108 + .../centos/files/kubeadm.conf | 19 + .../centos/files/kubelet-cgroup-setup.sh | 132 + ...er-disable-CFS-quota-throttling-for-.patch | 287 +++ ...er-infrastructure-pods-use-system-re.patch | 149 ++ ...er-introduce-concept-of-isolated-CPU.patch | 562 ++++ ...er-keep-normal-containers-off-reserv.patch | 311 +++ .../kubernetes-1.23.1/centos/kubernetes.spec | 2250 ++++++++++++++++ .../centos/kubernetes.spec.orig | 2282 +++++++++++++++++ 16 files changed, 6306 insertions(+) create mode 100644 kubernetes/kubernetes-1.23.1/centos/Readme.rst create mode 100644 kubernetes/kubernetes-1.23.1/centos/build_srpm.data create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/Revert-use-subpath-for-coredns-only-for-default-repo.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/enable-support-for-kubernetes-to-ignore-isolcpus.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubeadm-create-platform-pods-with-zero-CPU-resources.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubeadm.conf create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubelet-cgroup-setup.sh create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-disable-CFS-quota-throttling-for-.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-infrastructure-pods-use-system-re.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-introduce-concept-of-isolated-CPU.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-keep-normal-containers-off-reserv.patch create mode 100644 kubernetes/kubernetes-1.23.1/centos/kubernetes.spec create mode 100644 kubernetes/kubernetes-1.23.1/centos/kubernetes.spec.orig diff --git a/centos_iso_image.inc b/centos_iso_image.inc index 69be6b5b2..edc40b9a6 100644 --- a/centos_iso_image.inc +++ b/centos_iso_image.inc @@ -162,6 +162,9 @@ kubernetes-1.21.8-client kubernetes-1.22.5-node kubernetes-1.22.5-kubeadm kubernetes-1.22.5-client +kubernetes-1.23.1-node +kubernetes-1.23.1-kubeadm +kubernetes-1.23.1-client containerd k8s-pod-recovery k8s-cni-cache-cleanup diff --git a/centos_pkg_dirs b/centos_pkg_dirs index 467516bfd..b9745d235 100644 --- a/centos_pkg_dirs +++ b/centos_pkg_dirs @@ -57,6 +57,7 @@ kubernetes/cni/plugins kubernetes/cni/bond-cni kubernetes/kubernetes-1.21.8 kubernetes/kubernetes-1.22.5 +kubernetes/kubernetes-1.23.1 kubernetes/kubernetes-unversioned kubernetes/docker-distribution kubernetes/etcd diff --git a/centos_tarball-dl.lst b/centos_tarball-dl.lst index 08ade4e89..1cc4945bb 100644 --- a/centos_tarball-dl.lst +++ b/centos_tarball-dl.lst @@ -42,6 +42,7 @@ keycodemapdb-16e5b07.tar.gz#keycodemapdb#https://github.com/CendioOssman/keycode kubernetes-contrib-v1.18.1.tar.gz#kubernetes-contrib-1.18.1#https://github.com/kubernetes-retired/contrib/tarball/89f6948e24578fed2a90a87871b2263729f90ac3#http## kubernetes-v1.21.8.tar.gz#kubernetes-1.21.8#https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.21.8.tar.gz#http## kubernetes-v1.22.5.tar.gz#kubernetes-1.22.5#https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.22.5.tar.gz#http## +kubernetes-v1.23.1.tar.gz#kubernetes-1.23.1#https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.23.1.tar.gz#http## kvm-unit-tests.git-4ea7633.tar.bz2#kvm-unit-tests#https://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git/snapshot/kvm-unit-tests-20171020.tar.gz#http## ldapscripts-2.0.8.tgz#ldapscripts-2.0.8#https://sourceforge.net/projects/ldapscripts/files/ldapscripts/ldapscripts-2.0.8/ldapscripts-2.0.8.tgz/download#http## libbpf-0.5.0.tar.gz#libbpf-0.5.0#https://github.com/libbpf/libbpf/archive/v0.5.0.tar.gz#https## diff --git a/kubernetes/kubernetes-1.23.1/centos/Readme.rst b/kubernetes/kubernetes-1.23.1/centos/Readme.rst new file mode 100644 index 000000000..abb8d7a4b --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/Readme.rst @@ -0,0 +1,4 @@ +The spec file used here was from the kubernetes 1.10.0 src rpm. +The orig file is included to help show modifications made to that +spec file, to help understand which changes were needed and to +assist with future upversioning. diff --git a/kubernetes/kubernetes-1.23.1/centos/build_srpm.data b/kubernetes/kubernetes-1.23.1/centos/build_srpm.data new file mode 100644 index 000000000..7166a263b --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/build_srpm.data @@ -0,0 +1,5 @@ +VERSION=1.23.1 +TAR_NAME=kubernetes +TAR="$TAR_NAME-v$VERSION.tar.gz" +COPY_LIST="${CGCS_BASE}/downloads/$TAR $FILES_BASE/*" +TIS_PATCH_VER=PKG_GITREVCOUNT diff --git a/kubernetes/kubernetes-1.23.1/centos/files/Revert-use-subpath-for-coredns-only-for-default-repo.patch b/kubernetes/kubernetes-1.23.1/centos/files/Revert-use-subpath-for-coredns-only-for-default-repo.patch new file mode 100644 index 000000000..f56c20ee0 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/Revert-use-subpath-for-coredns-only-for-default-repo.patch @@ -0,0 +1,113 @@ +From f9dd597f4e8c8c66f08d661efcbd29479e4e069d Mon Sep 17 00:00:00 2001 +From: Gleb Aronsky +Date: Tue, 25 Jan 2022 13:56:30 -0500 +Subject: [PATCH] Revert "use subpath for coredns only for default repository" + +This reverts commit 38a41e1557649a7cc763bf737779db9aa03ec75e. + +Co-authored-by: Jim Gauld +Signed-off-by: Gleb Aronsky + +diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go +index c2b8f6e64be..b00ccea315e 100644 +--- a/cmd/kubeadm/app/constants/constants.go ++++ b/cmd/kubeadm/app/constants/constants.go +@@ -337,7 +337,7 @@ const ( + CoreDNSDeploymentName = "coredns" + + // CoreDNSImageName specifies the name of the image for CoreDNS add-on +- CoreDNSImageName = "coredns" ++ CoreDNSImageName = "coredns/coredns" + + // CoreDNSVersion is the version of CoreDNS to be deployed if it is used + CoreDNSVersion = "v1.8.6" +diff --git a/cmd/kubeadm/app/images/images.go b/cmd/kubeadm/app/images/images.go +index ee55eb6c995..bdb61caa373 100644 +--- a/cmd/kubeadm/app/images/images.go ++++ b/cmd/kubeadm/app/images/images.go +@@ -22,7 +22,6 @@ import ( + "k8s.io/klog/v2" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" +- kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + ) +@@ -48,10 +47,6 @@ func GetDNSImage(cfg *kubeadmapi.ClusterConfiguration) string { + if cfg.DNS.ImageRepository != "" { + dnsImageRepository = cfg.DNS.ImageRepository + } +- // Handle the renaming of the official image from "k8s.gcr.io/coredns" to "k8s.gcr.io/coredns/coredns +- if dnsImageRepository == kubeadmapiv1beta2.DefaultImageRepository { +- dnsImageRepository = fmt.Sprintf("%s/coredns", dnsImageRepository) +- } + // DNS uses an imageTag that corresponds to the DNS version matching the Kubernetes version + dnsImageTag := constants.CoreDNSVersion + +diff --git a/cmd/kubeadm/app/images/images_test.go b/cmd/kubeadm/app/images/images_test.go +index 2b8affce236..91cd4294351 100644 +--- a/cmd/kubeadm/app/images/images_test.go ++++ b/cmd/kubeadm/app/images/images_test.go +@@ -22,7 +22,6 @@ import ( + "testing" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" +- kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" + ) + +@@ -227,51 +226,4 @@ func TestGetAllImages(t *testing.T) { + } + } + +-func TestGetDNSImage(t *testing.T) { +- var tests = []struct { +- expected string +- cfg *kubeadmapi.ClusterConfiguration +- }{ +- { +- expected: "foo.io/coredns:v1.8.6", +- cfg: &kubeadmapi.ClusterConfiguration{ +- ImageRepository: "foo.io", +- DNS: kubeadmapi.DNS{ +- Type: kubeadmapi.CoreDNS, +- }, +- }, +- }, +- { +- expected: kubeadmapiv1beta2.DefaultImageRepository + "/coredns/coredns:v1.8.6", +- cfg: &kubeadmapi.ClusterConfiguration{ +- ImageRepository: kubeadmapiv1beta2.DefaultImageRepository, +- DNS: kubeadmapi.DNS{ +- Type: kubeadmapi.CoreDNS, +- }, +- }, +- }, +- { +- expected: "foo.io/coredns/coredns:v1.8.6", +- cfg: &kubeadmapi.ClusterConfiguration{ +- ImageRepository: "foo.io", +- DNS: kubeadmapi.DNS{ +- Type: kubeadmapi.CoreDNS, +- ImageMeta: kubeadmapi.ImageMeta{ +- ImageRepository: "foo.io/coredns", +- }, +- }, +- }, +- }, +- } +- +- for _, test := range tests { +- actual := GetDNSImage(test.cfg) +- if actual != test.expected { +- t.Errorf( +- "failed to GetDNSImage:\n\texpected: %s\n\t actual: %s", +- test.expected, +- actual, +- ) +- } +- } + } +-- +2.25.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/enable-support-for-kubernetes-to-ignore-isolcpus.patch b/kubernetes/kubernetes-1.23.1/centos/files/enable-support-for-kubernetes-to-ignore-isolcpus.patch new file mode 100644 index 000000000..63cdfbdbb --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/enable-support-for-kubernetes-to-ignore-isolcpus.patch @@ -0,0 +1,79 @@ +From 087dcfa1a84ec38541fa9870937d76b80a707e2c Mon Sep 17 00:00:00 2001 +From: Chris Friesen +Date: Fri, 23 Oct 2020 17:46:10 -0600 +Subject: [PATCH 6/7] enable support for kubernetes to ignore isolcpus + +The normal mechanisms for allocating isolated CPUs do not allow +a mix of isolated and exclusive CPUs in the same container. In +order to allow this in *very* limited cases where the pod spec +is known in advance we will add the ability to disable the normal +isolcpus behaviour. + +If the file "/etc/kubernetes/ignore_isolcpus" exists, then kubelet +will basically forget everything it knows about isolcpus and just +treat them like regular CPUs. + +The admin user can then rely on the fact that CPU allocation is +deterministic to ensure that the isolcpus they configure end up being +allocated to the correct pods. + +Signed-off-by: Daniel Safta +--- + pkg/kubelet/cm/cpumanager/cpu_manager.go | 8 ++++++++ + pkg/kubelet/cm/cpumanager/policy_static.go | 7 +++++++ + 2 files changed, 15 insertions(+) + +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go +index 2f5b06dc..d9ec63bb 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go +@@ -20,6 +20,7 @@ import ( + "fmt" + "io/ioutil" + "math" ++ "os" + "strings" + "sync" + "time" +@@ -55,6 +56,13 @@ const cpuManagerStateFileName = "cpu_manager_state" + + // get the system-level isolated CPUs + func getIsolcpus() cpuset.CPUSet { ++ // This is a gross hack to basically turn off awareness of isolcpus to enable ++ // isolated cpus to be allocated to pods the same way as non-isolated CPUs. ++ if _, err := os.Stat("/etc/kubernetes/ignore_isolcpus"); err == nil { ++ klog.Infof("[cpumanager] turning off isolcpus awareness") ++ return cpuset.NewCPUSet() ++ } ++ + dat, err := ioutil.ReadFile("/sys/devices/system/cpu/isolated") + if err != nil { + klog.Errorf("[cpumanager] unable to read sysfs isolcpus subdir") +diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go +index 72a99496..ee389a85 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static.go +@@ -18,6 +18,7 @@ package cpumanager + + import ( + "fmt" ++ "os" + "strconv" + + v1 "k8s.io/api/core/v1" +@@ -658,6 +659,12 @@ func isKubeInfra(pod *v1.Pod) bool { + + // get the isolated CPUs (if any) from the devices associated with a specific container + func (p *staticPolicy) podIsolCPUs(pod *v1.Pod, container *v1.Container) cpuset.CPUSet { ++ // This is a gross hack to basically turn off awareness of isolcpus to enable ++ // isolated cpus to be allocated to pods the same way as non-isolated CPUs. ++ if _, err := os.Stat("/etc/kubernetes/ignore_isolcpus"); err == nil { ++ return cpuset.NewCPUSet() ++ } ++ + // NOTE: This is required for TestStaticPolicyAdd() since makePod() does + // not create UID. We also need a way to properly stub devicemanager. + if len(string(pod.UID)) == 0 { +-- +2.17.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubeadm-create-platform-pods-with-zero-CPU-resources.patch b/kubernetes/kubernetes-1.23.1/centos/files/kubeadm-create-platform-pods-with-zero-CPU-resources.patch new file mode 100644 index 000000000..14e530c73 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubeadm-create-platform-pods-with-zero-CPU-resources.patch @@ -0,0 +1,108 @@ +From de653bd0823b248d623a39c17a3872e85ce952b0 Mon Sep 17 00:00:00 2001 +From: Chris Friesen +Date: Fri, 3 Sep 2021 18:05:15 -0400 +Subject: [PATCH 5/7] kubeadm: create platform pods with zero CPU resources + +We want to specify zero CPU resources when creating the manifests +for the static platform pods, as a workaround for the lack of +separate resource tracking for platform resources. + +We also specify zero CPU resources for the coredns deployment. +manifests.go appears to be the main file for this, not sure if the +others are used but I changed them just in case. + +Signed-off-by: Daniel Safta +--- + cluster/addons/dns/coredns/coredns.yaml.base | 2 +- + cluster/addons/dns/coredns/coredns.yaml.in | 2 +- + cluster/addons/dns/coredns/coredns.yaml.sed | 2 +- + cmd/kubeadm/app/phases/addons/dns/manifests.go | 2 +- + cmd/kubeadm/app/phases/controlplane/manifests.go | 6 +++--- + 5 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/cluster/addons/dns/coredns/coredns.yaml.base b/cluster/addons/dns/coredns/coredns.yaml.base +index 4ee054f8ba5..d2b58f4af0e 100644 +--- a/cluster/addons/dns/coredns/coredns.yaml.base ++++ b/cluster/addons/dns/coredns/coredns.yaml.base +@@ -138,7 +138,7 @@ spec: + limits: + memory: __DNS__MEMORY__LIMIT__ + requests: +- cpu: 100m ++ cpu: 0 + memory: 70Mi + args: [ "-conf", "/etc/coredns/Corefile" ] + volumeMounts: +diff --git a/cluster/addons/dns/coredns/coredns.yaml.in b/cluster/addons/dns/coredns/coredns.yaml.in +index 1f791e447c9..ff03a801646 100644 +--- a/cluster/addons/dns/coredns/coredns.yaml.in ++++ b/cluster/addons/dns/coredns/coredns.yaml.in +@@ -138,7 +138,7 @@ spec: + limits: + memory: 'dns_memory_limit' + requests: +- cpu: 100m ++ cpu: 0 + memory: 70Mi + args: [ "-conf", "/etc/coredns/Corefile" ] + volumeMounts: +diff --git a/cluster/addons/dns/coredns/coredns.yaml.sed b/cluster/addons/dns/coredns/coredns.yaml.sed +index 4d64278aaa4..38fc9196b28 100644 +--- a/cluster/addons/dns/coredns/coredns.yaml.sed ++++ b/cluster/addons/dns/coredns/coredns.yaml.sed +@@ -138,7 +138,7 @@ spec: + limits: + memory: $DNS_MEMORY_LIMIT + requests: +- cpu: 100m ++ cpu: 0 + memory: 70Mi + args: [ "-conf", "/etc/coredns/Corefile" ] + volumeMounts: +diff --git a/cmd/kubeadm/app/phases/addons/dns/manifests.go b/cmd/kubeadm/app/phases/addons/dns/manifests.go +index 3ac6856bfc6..0763b4c63db 100644 +--- a/cmd/kubeadm/app/phases/addons/dns/manifests.go ++++ b/cmd/kubeadm/app/phases/addons/dns/manifests.go +@@ -95,7 +95,7 @@ spec: + limits: + memory: 170Mi + requests: +- cpu: 100m ++ cpu: 0 + memory: 70Mi + args: [ "-conf", "/etc/coredns/Corefile" ] + volumeMounts: +diff --git a/cmd/kubeadm/app/phases/controlplane/manifests.go b/cmd/kubeadm/app/phases/controlplane/manifests.go +index 8181bea63a4..4c4b4448dd4 100644 +--- a/cmd/kubeadm/app/phases/controlplane/manifests.go ++++ b/cmd/kubeadm/app/phases/controlplane/manifests.go +@@ -60,7 +60,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap + LivenessProbe: staticpodutil.LivenessProbe(staticpodutil.GetAPIServerProbeAddress(endpoint), "/livez", int(endpoint.BindPort), v1.URISchemeHTTPS), + ReadinessProbe: staticpodutil.ReadinessProbe(staticpodutil.GetAPIServerProbeAddress(endpoint), "/readyz", int(endpoint.BindPort), v1.URISchemeHTTPS), + StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetAPIServerProbeAddress(endpoint), "/livez", int(endpoint.BindPort), v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), +- Resources: staticpodutil.ComponentResources("250m"), ++ Resources: staticpodutil.ComponentResources("0"), + Env: kubeadmutil.GetProxyEnvVars(), + }, mounts.GetVolumes(kubeadmconstants.KubeAPIServer), + map[string]string{kubeadmconstants.KubeAPIServerAdvertiseAddressEndpointAnnotationKey: endpoint.String()}), +@@ -72,7 +72,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap + VolumeMounts: staticpodutil.VolumeMountMapToSlice(mounts.GetVolumeMounts(kubeadmconstants.KubeControllerManager)), + LivenessProbe: staticpodutil.LivenessProbe(staticpodutil.GetControllerManagerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeControllerManagerPort, v1.URISchemeHTTPS), + StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetControllerManagerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeControllerManagerPort, v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), +- Resources: staticpodutil.ComponentResources("200m"), ++ Resources: staticpodutil.ComponentResources("0"), + Env: kubeadmutil.GetProxyEnvVars(), + }, mounts.GetVolumes(kubeadmconstants.KubeControllerManager), nil), + kubeadmconstants.KubeScheduler: staticpodutil.ComponentPod(v1.Container{ +@@ -83,7 +83,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap + VolumeMounts: staticpodutil.VolumeMountMapToSlice(mounts.GetVolumeMounts(kubeadmconstants.KubeScheduler)), + LivenessProbe: staticpodutil.LivenessProbe(staticpodutil.GetSchedulerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeSchedulerPort, v1.URISchemeHTTPS), + StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetSchedulerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeSchedulerPort, v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), +- Resources: staticpodutil.ComponentResources("100m"), ++ Resources: staticpodutil.ComponentResources("0"), + Env: kubeadmutil.GetProxyEnvVars(), + }, mounts.GetVolumes(kubeadmconstants.KubeScheduler), nil), + } +-- +2.17.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubeadm.conf b/kubernetes/kubernetes-1.23.1/centos/files/kubeadm.conf new file mode 100644 index 000000000..aaadf6b36 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubeadm.conf @@ -0,0 +1,19 @@ +# Note: This dropin only works with kubeadm and kubelet v1.11+ +[Service] +Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" +Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" +# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically +EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env +# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use +# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. +EnvironmentFile=-/etc/sysconfig/kubelet +ExecStart= +ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS +ExecStartPre=-/usr/local/sbin/sanitize_kubelet_reserved_cpus.sh /etc/sysconfig/kubelet +ExecStartPre=-/usr/bin/kubelet-cgroup-setup.sh +ExecStartPost=/bin/bash -c 'echo $MAINPID > /var/run/kubelet.pid;' +ExecStopPost=/bin/rm -f /var/run/kubelet.pid +ExecStopPost=-/usr/local/sbin/k8s-container-cleanup +Restart=always +StartLimitInterval=0 +RestartSec=10 diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cgroup-setup.sh b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cgroup-setup.sh new file mode 100644 index 000000000..385314bfe --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cgroup-setup.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# +# Copyright (c) 2019 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# This script does minimal cgroup setup for kubelet. This creates k8s-infra +# cgroup for a minimal set of resource controllers, and configures cpuset +# attributes to span all online cpus and nodes. This will do nothing if +# the k8s-infra cgroup already exists (i.e., assume already configured). +# NOTE: The creation of directories under /sys/fs/cgroup is volatile, and +# does not persist reboots. The cpuset.mems and cpuset.cpus is later updated +# by puppet kubernetes.pp manifest. +# + +# Define minimal path +PATH=/bin:/usr/bin:/usr/local/bin + +# Log info message to /var/log/daemon.log +function LOG { + logger -p daemon.info "$0($$): $@" +} + +# Log error message to /var/log/daemon.log +function ERROR { + logger -s -p daemon.error "$0($$): ERROR: $@" +} + +# Create minimal cgroup directories and configure cpuset attributes if required +function create_cgroup { + local cg_name=$1 + local cg_nodeset=$2 + local cg_cpuset=$3 + + local CGROUP=/sys/fs/cgroup + local CONTROLLERS_AUTO_DELETED=("pids" "hugetlb") + local CONTROLLERS_PRESERVED=("cpuset" "memory" "cpu,cpuacct" "systemd") + local cnt='' + local CGDIR='' + local RC=0 + + # Ensure that these cgroups are created every time as they are auto deleted + for cnt in ${CONTROLLERS_AUTO_DELETED[@]}; do + CGDIR=${CGROUP}/${cnt}/${cg_name} + if [ -d ${CGDIR} ]; then + LOG "Nothing to do, already configured: ${CGDIR}." + continue + fi + LOG "Creating: ${CGDIR}" + mkdir -p ${CGDIR} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Creating: ${CGDIR}, rc=${RC}" + exit ${RC} + fi + done + + # These cgroups are preserved so if any of these are encountered additional + # cgroup setup is not required + for cnt in ${CONTROLLERS_PRESERVED[@]}; do + CGDIR=${CGROUP}/${cnt}/${cg_name} + if [ -d ${CGDIR} ]; then + LOG "Nothing to do, already configured: ${CGDIR}." + exit ${RC} + fi + LOG "Creating: ${CGDIR}" + mkdir -p ${CGDIR} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Creating: ${CGDIR}, rc=${RC}" + exit ${RC} + fi + done + + # Customize cpuset attributes + LOG "Configuring cgroup: ${cg_name}, nodeset: ${cg_nodeset}, cpuset: ${cg_cpuset}" + CGDIR=${CGROUP}/cpuset/${cg_name} + local CGMEMS=${CGDIR}/cpuset.mems + local CGCPUS=${CGDIR}/cpuset.cpus + local CGTASKS=${CGDIR}/tasks + + # Assign cgroup memory nodeset + LOG "Assign nodeset ${cg_nodeset} to ${CGMEMS}" + /bin/echo ${cg_nodeset} > ${CGMEMS} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Unable to write to: ${CGMEMS}, rc=${RC}" + exit ${RC} + fi + + # Assign cgroup cpus + LOG "Assign cpuset ${cg_cpuset} to ${CGCPUS}" + /bin/echo ${cg_cpuset} > ${CGCPUS} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Assigning: ${cg_cpuset} to ${CGCPUS}, rc=${RC}" + exit ${RC} + fi + + # Set file ownership + chown root:root ${CGMEMS} ${CGCPUS} ${CGTASKS} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Setting owner for: ${CGMEMS}, ${CGCPUS}, ${CGTASKS}, rc=${RC}" + exit ${RC} + fi + + # Set file mode permissions + chmod 644 ${CGMEMS} ${CGCPUS} ${CGTASKS} + RC=$? + if [ ${RC} -ne 0 ]; then + ERROR "Setting mode for: ${CGMEMS}, ${CGCPUS}, ${CGTASKS}, rc=${RC}" + exit ${RC} + fi + + return ${RC} +} + +if [ $UID -ne 0 ]; then + ERROR "Require sudo/root." + exit 1 +fi + +# Configure default kubepods cpuset to span all online cpus and nodes. +ONLINE_NODESET=$(/bin/cat /sys/devices/system/node/online) +ONLINE_CPUSET=$(/bin/cat /sys/devices/system/cpu/online) + +# Configure kubelet cgroup to match cgroupRoot. +create_cgroup 'k8s-infra' ${ONLINE_NODESET} ${ONLINE_CPUSET} + +exit $? + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-disable-CFS-quota-throttling-for-.patch b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-disable-CFS-quota-throttling-for-.patch new file mode 100644 index 000000000..fc115417d --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-disable-CFS-quota-throttling-for-.patch @@ -0,0 +1,287 @@ +From cde296d121955a9ee4f148f775d73bb746a17310 Mon Sep 17 00:00:00 2001 +From: Gleb Aronsky +Date: Fri, 21 Jan 2022 17:03:57 -0500 +Subject: kubelet cpumanager disable CFS quota throttling for + Guaranteed pods + +This disables CFS CPU quota to avoid performance degradation due to +Linux kernel CFS quota implementation. Note that 4.18 kernel attempts +to solve the CFS throttling problem, but there are reports that it is +not completely effective. + +This disables CFS quota throttling for Guaranteed pods for both +parent and container cgroups by writing -1 to cgroup cpu.cfs_quota_us. +Disabling has a dramatic latency improvement for HTTP response times. + +This patch is refactored in 1.22.5 due to new internal_container_lifecycle +framework. We leverage the same mechanism to set Linux resources as: +cpu manager: specify the container CPU set during the creation + +Co-authored-by: Jim Gauld +Signed-off-by: Gleb Aronsky + +--- + pkg/kubelet/cm/cpumanager/cpu_manager.go | 7 +++ + pkg/kubelet/cm/cpumanager/fake_cpu_manager.go | 12 +++-- + pkg/kubelet/cm/helpers_linux.go | 12 ++++- + pkg/kubelet/cm/helpers_linux_test.go | 45 ++++++++++--------- + .../cm/internal_container_lifecycle_linux.go | 11 ++++- + 5 files changed, 61 insertions(+), 26 deletions(-) + +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go +index a876d413870..6ad289336ea 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go +@@ -72,6 +72,9 @@ type Manager interface { + // State returns a read-only interface to the internal CPU manager state. + State() state.Reader + ++ // GetCPUPolicy returns the assigned CPU manager policy ++ GetCPUPolicy() string ++ + // GetTopologyHints implements the topologymanager.HintProvider Interface + // and is consulted to achieve NUMA aware resource alignment among this + // and other resource controllers. +@@ -314,6 +317,10 @@ func (m *manager) State() state.Reader { + return m.state + } + ++func (m *manager) GetCPUPolicy() string { ++ return m.policy.Name() ++} ++ + func (m *manager) GetTopologyHints(pod *v1.Pod, container *v1.Container) map[string][]topologymanager.TopologyHint { + // The pod is during the admission phase. We need to save the pod to avoid it + // being cleaned before the admission ended +diff --git a/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go b/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go +index 93369705135..8082bbeebcb 100644 +--- a/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go ++++ b/pkg/kubelet/cm/cpumanager/fake_cpu_manager.go +@@ -17,7 +17,7 @@ limitations under the License. + package cpumanager + + import ( +- "k8s.io/api/core/v1" ++ v1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" + "k8s.io/kubernetes/pkg/kubelet/cm/containermap" + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" +@@ -28,7 +28,8 @@ import ( + ) + + type fakeManager struct { +- state state.State ++ policy Policy ++ state state.State + } + + func (m *fakeManager) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady, podStatusProvider status.PodStatusProvider, containerRuntime runtimeService, initialContainers containermap.ContainerMap) error { +@@ -70,6 +71,10 @@ func (m *fakeManager) State() state.Reader { + return m.state + } + ++func (m *fakeManager) GetCPUPolicy() string { ++ return m.policy.Name() ++} ++ + func (m *fakeManager) GetExclusiveCPUs(podUID, containerName string) cpuset.CPUSet { + klog.InfoS("GetExclusiveCPUs", "podUID", podUID, "containerName", containerName) + return cpuset.CPUSet{} +@@ -88,6 +93,7 @@ func (m *fakeManager) GetCPUAffinity(podUID, containerName string) cpuset.CPUSet + // NewFakeManager creates empty/fake cpu manager + func NewFakeManager() Manager { + return &fakeManager{ +- state: state.NewMemoryState(), ++ policy: &nonePolicy{}, ++ state: state.NewMemoryState(), + } + } +diff --git a/pkg/kubelet/cm/helpers_linux.go b/pkg/kubelet/cm/helpers_linux.go +index 83c80501f5d..6e8f232e4d6 100644 +--- a/pkg/kubelet/cm/helpers_linux.go ++++ b/pkg/kubelet/cm/helpers_linux.go +@@ -25,7 +25,7 @@ import ( + + libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups" + +- "k8s.io/api/core/v1" ++ v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/api/v1/resource" +@@ -182,6 +182,16 @@ func ResourceConfigForPod(pod *v1.Pod, enforceCPULimits bool, cpuPeriod uint64, + // build the result + result := &ResourceConfig{} + if qosClass == v1.PodQOSGuaranteed { ++ // Disable CFS CPU quota to avoid performance degradation due to ++ // Linux kernel CFS throttle implementation. ++ // NOTE: 4.18 kernel attempts to solve CFS throttling problem, ++ // but there are reports that it is not completely effective. ++ // This will configure cgroup CFS parameters at pod level: ++ // /sys/fs/cgroup/cpu/k8s-infra/kubepods//cpu.cfs_quota_us ++ // /sys/fs/cgroup/cpu/k8s-infra/kubepods//cpu.cfs_period_us ++ cpuQuota = int64(-1) ++ cpuPeriod = uint64(100000) ++ + result.CpuShares = &cpuShares + result.CpuQuota = &cpuQuota + result.CpuPeriod = &cpuPeriod +diff --git a/pkg/kubelet/cm/helpers_linux_test.go b/pkg/kubelet/cm/helpers_linux_test.go +index 101b21e682a..91c5782e3b4 100644 +--- a/pkg/kubelet/cm/helpers_linux_test.go ++++ b/pkg/kubelet/cm/helpers_linux_test.go +@@ -25,7 +25,7 @@ import ( + "testing" + "time" + +- "k8s.io/api/core/v1" ++ v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" +@@ -64,8 +64,9 @@ func TestResourceConfigForPod(t *testing.T) { + burstablePartialShares := MilliCPUToShares(200) + burstableQuota := MilliCPUToQuota(200, int64(defaultQuotaPeriod)) + guaranteedShares := MilliCPUToShares(100) +- guaranteedQuota := MilliCPUToQuota(100, int64(defaultQuotaPeriod)) +- guaranteedTunedQuota := MilliCPUToQuota(100, int64(tunedQuotaPeriod)) ++ guaranteedQuotaPeriod := uint64(100000) ++ guaranteedQuota := int64(-1) ++ guaranteedTunedQuota := int64(-1) + memoryQuantity = resource.MustParse("100Mi") + cpuNoLimit := int64(-1) + guaranteedMemory := memoryQuantity.Value() +@@ -204,8 +205,8 @@ func TestResourceConfigForPod(t *testing.T) { + }, + }, + enforceCPULimits: true, +- quotaPeriod: defaultQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedQuota, CpuPeriod: &defaultQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedQuota, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-no-cpu-enforcement": { + pod: &v1.Pod{ +@@ -218,8 +219,8 @@ func TestResourceConfigForPod(t *testing.T) { + }, + }, + enforceCPULimits: false, +- quotaPeriod: defaultQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &defaultQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &guarenteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-with-tuned-quota": { + pod: &v1.Pod{ +@@ -232,8 +233,8 @@ func TestResourceConfigForPod(t *testing.T) { + }, + }, + enforceCPULimits: true, +- quotaPeriod: tunedQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedTunedQuota, CpuPeriod: &tunedQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedTunedQuota, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-no-cpu-enforcement-with-tuned-quota": { + pod: &v1.Pod{ +@@ -246,8 +247,8 @@ func TestResourceConfigForPod(t *testing.T) { + }, + }, + enforceCPULimits: false, +- quotaPeriod: tunedQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &tunedQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "burstable-partial-limits-with-init-containers": { + pod: &v1.Pod{ +@@ -309,8 +310,10 @@ func TestResourceConfigForPodWithCustomCPUCFSQuotaPeriod(t *testing.T) { + burstablePartialShares := MilliCPUToShares(200) + burstableQuota := MilliCPUToQuota(200, int64(defaultQuotaPeriod)) + guaranteedShares := MilliCPUToShares(100) +- guaranteedQuota := MilliCPUToQuota(100, int64(defaultQuotaPeriod)) +- guaranteedTunedQuota := MilliCPUToQuota(100, int64(tunedQuotaPeriod)) ++ guaranteedQuotaPeriod := uint64(100000) ++ guaranteedQuota := int64(-1) ++ guaranteedTunedQuota := int64(-1) ++ + memoryQuantity = resource.MustParse("100Mi") + cpuNoLimit := int64(-1) + guaranteedMemory := memoryQuantity.Value() +@@ -449,8 +452,8 @@ func TestResourceConfigForPodWithCustomCPUCFSQuotaPeriod(t *testing.T) { + }, + }, + enforceCPULimits: true, +- quotaPeriod: defaultQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedQuota, CpuPeriod: &defaultQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedQuota, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-no-cpu-enforcement": { + pod: &v1.Pod{ +@@ -463,8 +466,8 @@ func TestResourceConfigForPodWithCustomCPUCFSQuotaPeriod(t *testing.T) { + }, + }, + enforceCPULimits: false, +- quotaPeriod: defaultQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &defaultQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-with-tuned-quota": { + pod: &v1.Pod{ +@@ -477,8 +480,8 @@ func TestResourceConfigForPodWithCustomCPUCFSQuotaPeriod(t *testing.T) { + }, + }, + enforceCPULimits: true, +- quotaPeriod: tunedQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedTunedQuota, CpuPeriod: &tunedQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &guaranteedTunedQuota, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + "guaranteed-no-cpu-enforcement-with-tuned-quota": { + pod: &v1.Pod{ +@@ -491,8 +494,8 @@ func TestResourceConfigForPodWithCustomCPUCFSQuotaPeriod(t *testing.T) { + }, + }, + enforceCPULimits: false, +- quotaPeriod: tunedQuotaPeriod, +- expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &tunedQuotaPeriod, Memory: &guaranteedMemory}, ++ quotaPeriod: guaranteedQuotaPeriod, ++ expected: &ResourceConfig{CpuShares: &guaranteedShares, CpuQuota: &cpuNoLimit, CpuPeriod: &guaranteedQuotaPeriod, Memory: &guaranteedMemory}, + }, + } + +diff --git a/pkg/kubelet/cm/internal_container_lifecycle_linux.go b/pkg/kubelet/cm/internal_container_lifecycle_linux.go +index cb7c0cfa543..956696a51e8 100644 +--- a/pkg/kubelet/cm/internal_container_lifecycle_linux.go ++++ b/pkg/kubelet/cm/internal_container_lifecycle_linux.go +@@ -23,8 +23,9 @@ import ( + "strconv" + "strings" + +- "k8s.io/api/core/v1" ++ v1 "k8s.io/api/core/v1" + runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" ++ v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" + ) + + func (i *internalContainerLifecycleImpl) PreCreateContainer(pod *v1.Pod, container *v1.Container, containerConfig *runtimeapi.ContainerConfig) error { +@@ -35,6 +36,14 @@ func (i *internalContainerLifecycleImpl) PreCreateContainer(pod *v1.Pod, contain + } + } + ++ // Disable cgroup CFS throttle at the container level. ++ // /sys/fs/cgroup/cpu/k8s-infra/kubepods///cpu.cfs_quota_us ++ // /sys/fs/cgroup/cpu/k8s-infra/kubepods///cpu.cfs_period_us ++ if i.cpuManager.GetCPUPolicy() == "static" && v1qos.GetPodQOS(pod) == v1.PodQOSGuaranteed { ++ containerConfig.Linux.Resources.CpuPeriod = int64(100000) ++ containerConfig.Linux.Resources.CpuQuota = int64(-1) ++ } ++ + if i.memoryManager != nil { + numaNodes := i.memoryManager.GetMemoryNUMANodes(pod, container) + if numaNodes.Len() > 0 { +-- +2.25.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-infrastructure-pods-use-system-re.patch b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-infrastructure-pods-use-system-re.patch new file mode 100644 index 000000000..623c2a6e5 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-infrastructure-pods-use-system-re.patch @@ -0,0 +1,149 @@ +From 2f16a9e2c8dc5995aad9a04636ff4f20cb7b51c7 Mon Sep 17 00:00:00 2001 +From: Gleb Aronsky +Date: Tue, 25 Jan 2022 12:35:48 -0500 +Subject: [PATCH] kubelet cpumanager infrastructure pods use system reserved + CPUs + +This assigns system infrastructure pods to the "reserved" cpuset +to isolate them from the shared pool of CPUs. + +Infrastructure pods include any pods that belong to the kube-system, +armada, cert-manager, vault, platform-deployment-manager, portieris, +notification or flux-helm namespaces. + +The implementation is a bit simplistic, it is assumed that the +"reserved" cpuset is large enough to handle all infrastructure pods +CPU allocations. + +This also prevents infrastucture pods from using Guaranteed resources. + +Co-authored-by: Jim Gauld +Signed-off-by: Gleb Aronsky +--- + pkg/kubelet/cm/cpumanager/policy_static.go | 47 +++++++++++++++++-- + .../cm/cpumanager/policy_static_test.go | 19 +++++++- + 2 files changed, 61 insertions(+), 5 deletions(-) + +diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go +index 9697f4d4bb0..aeac7fdc8cb 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static.go +@@ -53,6 +53,11 @@ func (e SMTAlignmentError) Type() string { + return ErrorSMTAlignment + } + ++// Define namespaces used by platform infrastructure pods ++var infraNamespaces = [...]string{ ++ "kube-system", "armada", "cert-manager", "platform-deployment-manager", "portieris", "vault", "notification", "flux-helm", ++} ++ + // staticPolicy is a CPU manager policy that does not change CPU + // assignments for exclusively pinned guaranteed containers after the main + // container process starts. +@@ -121,10 +126,11 @@ func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reserv + klog.InfoS("Static policy created with configuration", "options", opts) + + policy := &staticPolicy{ +- topology: topology, +- affinity: affinity, +- cpusToReuse: make(map[string]cpuset.CPUSet), +- options: opts, ++ topology: topology, ++ affinity: affinity, ++ excludeReserved: excludeReserved, ++ cpusToReuse: make(map[string]cpuset.CPUSet), ++ options: opts, + } + + allCPUs := topology.CPUDetails.CPUs() +@@ -263,6 +269,25 @@ func (p *staticPolicy) updateCPUsToReuse(pod *v1.Pod, container *v1.Container, c + } + + func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Container) error { ++ // Process infra pods before guaranteed pods ++ if isKubeInfra(pod) { ++ // Container belongs in reserved pool. ++ // We don't want to fall through to the p.guaranteedCPUs() clause below so return either nil or error. ++ if _, ok := s.GetCPUSet(string(pod.UID), container.Name); ok { ++ klog.Infof("[cpumanager] static policy: reserved container already present in state, skipping (namespace: %s, pod UID: %s, pod: %s, container: %s)", pod.Namespace, string(pod.UID), pod.Name, container.Name) ++ return nil ++ } ++ ++ cpuset := p.reserved ++ if cpuset.IsEmpty() { ++ // If this happens then someone messed up. ++ return fmt.Errorf("[cpumanager] static policy: reserved container unable to allocate cpus (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v, reserved:%v", pod.Namespace, string(pod.UID), pod.Name, container.Name, cpuset, p.reserved) ++ } ++ s.SetCPUSet(string(pod.UID), container.Name, cpuset) ++ klog.Infof("[cpumanager] static policy: reserved: AddContainer (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v", pod.Namespace, string(pod.UID), pod.Name, container.Name, cpuset) ++ return nil ++ } ++ + if numCPUs := p.guaranteedCPUs(pod, container); numCPUs != 0 { + klog.InfoS("Static policy: Allocate", "pod", klog.KObj(pod), "containerName", container.Name) + // container belongs in an exclusively allocated pool +@@ -367,6 +392,10 @@ func (p *staticPolicy) guaranteedCPUs(pod *v1.Pod, container *v1.Container) int + if cpuQuantity.Value()*1000 != cpuQuantity.MilliValue() { + return 0 + } ++ // Infrastructure pods use reserved CPUs even if they're in the Guaranteed QoS class ++ if isKubeInfra(pod) { ++ return 0 ++ } + // Safe downcast to do for all systems with < 2.1 billion CPUs. + // Per the language spec, `int` is guaranteed to be at least 32 bits wide. + // https://golang.org/ref/spec#Numeric_types +@@ -580,3 +609,13 @@ func (p *staticPolicy) generateCPUTopologyHints(availableCPUs cpuset.CPUSet, reu + + return hints + } ++ ++// check if a given pod is in a platform infrastructure namespace ++func isKubeInfra(pod *v1.Pod) bool { ++ for _, namespace := range infraNamespaces { ++ if namespace == pod.Namespace { ++ return true ++ } ++ } ++ return false ++} +diff --git a/pkg/kubelet/cm/cpumanager/policy_static_test.go b/pkg/kubelet/cm/cpumanager/policy_static_test.go +index 80bd04a1f92..34c5a23c553 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static_test.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static_test.go +@@ -830,7 +830,8 @@ func TestStaticPolicyStartWithResvList(t *testing.T) { + } + + func TestStaticPolicyAddWithResvList(t *testing.T) { +- ++ infraPod := makePod("fakePod", "fakeContainer2", "200m", "200m") ++ infraPod.Namespace = "kube-system" + testCases := []staticPolicyTestWithResvList{ + { + description: "GuPodSingleCore, SingleSocketHT, ExpectError", +@@ -872,6 +873,22 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + expCPUAlloc: true, + expCSet: cpuset.NewCPUSet(4, 5), + }, ++ { ++ description: "InfraPod, SingleSocketHT, ExpectAllocReserved", ++ topo: topoSingleSocketHT, ++ numReservedCPUs: 2, ++ reserved: cpuset.NewCPUSet(0, 1), ++ stAssignments: state.ContainerCPUAssignments{ ++ "fakePod": map[string]cpuset.CPUSet{ ++ "fakeContainer100": cpuset.NewCPUSet(2, 3, 6, 7), ++ }, ++ }, ++ stDefaultCPUSet: cpuset.NewCPUSet(4, 5), ++ pod: infraPod, ++ expErr: nil, ++ expCPUAlloc: true, ++ expCSet: cpuset.NewCPUSet(0, 1), ++ }, + } + + testExcl := true +-- +2.25.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-introduce-concept-of-isolated-CPU.patch b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-introduce-concept-of-isolated-CPU.patch new file mode 100644 index 000000000..d48d38cf9 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-introduce-concept-of-isolated-CPU.patch @@ -0,0 +1,562 @@ +From 5264e7af1d645a5eb27a6d204f73c08cc72afa70 Mon Sep 17 00:00:00 2001 +From: Gleb Aronsky +Date: Tue, 25 Jan 2022 13:27:25 -0500 +Subject: [PATCH] kubelet cpumanager introduce concept of isolated CPUs + +This introduces the concept of "isolated CPUs", which are CPUs that +have been isolated at the kernel level via the "isolcpus" kernel boot +parameter. + +When starting the kubelet process, two separate sets of reserved CPUs +may be specified. With this change CPUs reserved via +'--system-reserved=cpu' will be used for infrastructure pods while the +isolated CPUs should be reserved via '--kube-reserved=cpu' to cause +kubelet to skip over them for "normal" CPU resource tracking. The +kubelet code will double-check that the specified isolated CPUs match +what the kernel exposes in "/sys/devices/system/cpu/isolated". + +A plugin (outside the scope of this commit) will expose the isolated +CPUs to kubelet via the device plugin API. + +If a pod specifies some number of "isolcpus" resources, the device +manager will allocate them. In this code we check whether such +resources have been allocated, and if so we set the container cpuset to +the isolated CPUs. This does mean that it really only makes sense to +specify "isolcpus" resources for best-effort or burstable pods, not for +guaranteed ones since that would throw off the accounting code. In +order to ensure the accounting still works as designed, if "isolcpus" +are specified for guaranteed pods, the affinity will be set to the +non-isolated CPUs. + +This patch was refactored in 1.21.3 due to upstream API change +node: podresources: make GetDevices() consistent +(commit ad68f9588c72d6477b5a290c548a9031063ac659). + +The routine podIsolCPUs() was refactored in 1.21.3 since the API +p.deviceManager.GetDevices() is returning multiple devices with +a device per cpu. The resultant cpuset needs to be the aggregate. + +The routine NewStaticPolicy was refactored in 1.22.5, adding a new argument +in its signature: cpuPolicyOptions map[string]string. This change is implies +shifting the new arguments(deviceManager, excludeReserved) with one position +to the right. + +Co-authored-by: Jim Gauld +Co-authored-by: Chris Friesen +Signed-off-by: Gleb Aronsky +--- + pkg/kubelet/cm/container_manager_linux.go | 1 + + pkg/kubelet/cm/cpumanager/cpu_manager.go | 35 +++++++- + pkg/kubelet/cm/cpumanager/cpu_manager_test.go | 14 +++- + pkg/kubelet/cm/cpumanager/policy_static.go | 83 +++++++++++++++++-- + .../cm/cpumanager/policy_static_test.go | 50 ++++++++--- + 5 files changed, 164 insertions(+), 19 deletions(-) + +diff --git a/pkg/kubelet/cm/container_manager_linux.go b/pkg/kubelet/cm/container_manager_linux.go +index 3892bae081d..9a1e9c406eb 100644 +--- a/pkg/kubelet/cm/container_manager_linux.go ++++ b/pkg/kubelet/cm/container_manager_linux.go +@@ -340,6 +340,7 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I + cm.GetNodeAllocatableReservation(), + nodeConfig.KubeletRootDir, + cm.topologyManager, ++ cm.deviceManager, + ) + if err != nil { + klog.ErrorS(err, "Failed to initialize cpu manager") +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go +index 8336e7b0fd4..defa03cd180 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go +@@ -18,7 +18,9 @@ package cpumanager + + import ( + "fmt" ++ "io/ioutil" + "math" ++ "strings" + "sync" + "time" + +@@ -32,6 +34,7 @@ import ( + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" ++ "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/config" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" +@@ -50,6 +53,25 @@ type policyName string + // cpuManagerStateFileName is the file name where cpu manager stores its state + const cpuManagerStateFileName = "cpu_manager_state" + ++// get the system-level isolated CPUs ++func getIsolcpus() cpuset.CPUSet { ++ dat, err := ioutil.ReadFile("/sys/devices/system/cpu/isolated") ++ if err != nil { ++ klog.Errorf("[cpumanager] unable to read sysfs isolcpus subdir") ++ return cpuset.NewCPUSet() ++ } ++ ++ // The isolated cpus string ends in a newline ++ cpustring := strings.TrimSuffix(string(dat), "\n") ++ cset, err := cpuset.Parse(cpustring) ++ if err != nil { ++ klog.Errorf("[cpumanager] unable to parse sysfs isolcpus string to cpuset") ++ return cpuset.NewCPUSet() ++ } ++ ++ return cset ++} ++ + // Manager interface provides methods for Kubelet to manage pod cpus. + type Manager interface { + // Start is called during Kubelet initialization. +@@ -153,7 +175,8 @@ func (s *sourcesReadyStub) AddSource(source string) {} + func (s *sourcesReadyStub) AllReady() bool { return true } + + // NewManager creates new cpu manager based on provided policy +-func NewManager(cpuPolicyName string, cpuPolicyOptions map[string]string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, specificCPUs cpuset.CPUSet, nodeAllocatableReservation v1.ResourceList, stateFileDirectory string, affinity topologymanager.Store) (Manager, error) { ++func NewManager(cpuPolicyName string, cpuPolicyOptions map[string]string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, specificCPUs cpuset.CPUSet, nodeAllocatableReservation v1.ResourceList, stateFileDirectory string, affinity topologymanager.Store, deviceManager devicemanager.Manager) (Manager, error) { ++ + var topo *topology.CPUTopology + var policy Policy + var err error +@@ -194,7 +217,15 @@ func NewManager(cpuPolicyName string, cpuPolicyOptions map[string]string, reconc + // NOTE: Set excludeReserved unconditionally to exclude reserved CPUs from default cpuset. + // This variable is primarily to make testing easier. + excludeReserved := true +- policy, err = NewStaticPolicy(topo, numReservedCPUs, specificCPUs, affinity, cpuPolicyOptions, excludeReserved) ++ ++ // isolCPUs is the set of kernel-isolated CPUs. They should be a subset of specificCPUs or ++ // of the CPUs that NewStaticPolicy() will pick if numReservedCPUs is set. It's only in the ++ // argument list here for ease of testing, it's really internal to the policy. ++ isolCPUs := getIsolcpus() ++ policy, err = NewStaticPolicy(topo, numReservedCPUs, specificCPUs, isolCPUs, affinity, cpuPolicyOptions, deviceManager, excludeReserved) ++ if err != nil { ++ return nil, fmt.Errorf("new static policy error: %v", err) ++ } + + if err != nil { + return nil, fmt.Errorf("new static policy error: %w", err) +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager_test.go b/pkg/kubelet/cm/cpumanager/cpu_manager_test.go +index 2c8349662c4..31e4d0585fb 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager_test.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager_test.go +@@ -37,6 +37,7 @@ import ( + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" ++ "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + ) + +@@ -215,6 +216,7 @@ func makeMultiContainerPod(initCPUs, appCPUs []struct{ request, limit string }) + } + + func TestCPUManagerAdd(t *testing.T) { ++ testDM, _ := devicemanager.NewManagerStub() + testExcl := false + testPolicy, _ := NewStaticPolicy( + &topology.CPUTopology{ +@@ -230,8 +232,10 @@ func TestCPUManagerAdd(t *testing.T) { + }, + 0, + cpuset.NewCPUSet(), ++ cpuset.NewCPUSet(), + topologymanager.NewFakeManager(), + nil, ++ testDM, + testExcl) + testCases := []struct { + description string +@@ -482,8 +486,9 @@ func TestCPUManagerAddWithInitContainers(t *testing.T) { + } + + testExcl := false ++ testDM, _ := devicemanager.NewManagerStub() + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testExcl) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, testExcl) + + mockState := &mockState{ + assignments: testCase.stAssignments, +@@ -638,7 +643,9 @@ func TestCPUManagerGenerate(t *testing.T) { + } + defer os.RemoveAll(sDir) + +- mgr, err := NewManager(testCase.cpuPolicyName, nil, 5*time.Second, machineInfo, cpuset.NewCPUSet(), testCase.nodeAllocatableReservation, sDir, topologymanager.NewFakeManager()) ++ testDM, err := devicemanager.NewManagerStub() ++ mgr, err := NewManager(testCase.cpuPolicyName, nil, 5*time.Second, machineInfo, cpuset.NewCPUSet(), testCase.nodeAllocatableReservation, sDir, topologymanager.NewFakeManager(), testDM) ++ + if testCase.expectedError != nil { + if !strings.Contains(err.Error(), testCase.expectedError.Error()) { + t.Errorf("Unexpected error message. Have: %s wants %s", err.Error(), testCase.expectedError.Error()) +@@ -1232,6 +1239,7 @@ func TestReconcileState(t *testing.T) { + // the following tests are with --reserved-cpus configured + func TestCPUManagerAddWithResvList(t *testing.T) { + testExcl := false ++ testDM, _ := devicemanager.NewManagerStub() + testPolicy, _ := NewStaticPolicy( + &topology.CPUTopology{ + NumCPUs: 4, +@@ -1246,8 +1254,10 @@ func TestCPUManagerAddWithResvList(t *testing.T) { + }, + 1, + cpuset.NewCPUSet(0), ++ cpuset.NewCPUSet(), + topologymanager.NewFakeManager(), + nil, ++ testDM, + testExcl) + testCases := []struct { + description string +diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go +index aeac7fdc8cb..3799795963b 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static.go +@@ -18,6 +18,7 @@ package cpumanager + + import ( + "fmt" ++ "strconv" + + v1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" +@@ -25,6 +26,7 @@ import ( + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" ++ "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" + ) +@@ -101,6 +103,10 @@ type staticPolicy struct { + topology *topology.CPUTopology + // set of CPUs that is not available for exclusive assignment + reserved cpuset.CPUSet ++ // subset of reserved CPUs with isolcpus attribute ++ isolcpus cpuset.CPUSet ++ // parent containerManager, used to get device list ++ deviceManager devicemanager.Manager + // If true, default CPUSet should exclude reserved CPUs + excludeReserved bool + // topology manager reference to get container Topology affinity +@@ -117,7 +123,8 @@ var _ Policy = &staticPolicy{} + // NewStaticPolicy returns a CPU manager policy that does not change CPU + // assignments for exclusively pinned guaranteed containers after the main + // container process starts. +-func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reservedCPUs cpuset.CPUSet, affinity topologymanager.Store, cpuPolicyOptions map[string]string, excludeReserved bool) (Policy, error) { ++func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reservedCPUs cpuset.CPUSet, isolCPUs cpuset.CPUSet, affinity topologymanager.Store, cpuPolicyOptions map[string]string, deviceManager devicemanager.Manager, excludeReserved bool) (Policy, error) { ++ + opts, err := NewStaticPolicyOptions(cpuPolicyOptions) + if err != nil { + return nil, err +@@ -128,6 +135,8 @@ func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reserv + policy := &staticPolicy{ + topology: topology, + affinity: affinity, ++ isolcpus: isolCPUs, ++ deviceManager: deviceManager, + excludeReserved: excludeReserved, + cpusToReuse: make(map[string]cpuset.CPUSet), + options: opts, +@@ -154,6 +163,12 @@ func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reserv + klog.InfoS("Reserved CPUs not available for exclusive assignment", "reservedSize", reserved.Size(), "reserved", reserved) + policy.reserved = reserved + ++ if !isolCPUs.IsSubsetOf(reserved) { ++ klog.Errorf("[cpumanager] isolCPUs %v is not a subset of reserved %v", isolCPUs, reserved) ++ reserved = reserved.Union(isolCPUs) ++ klog.Warningf("[cpumanager] mismatch isolCPUs %v, force reserved %v", isolCPUs, reserved) ++ } ++ + return policy, nil + } + +@@ -187,8 +202,9 @@ func (p *staticPolicy) validateState(s state.State) error { + } else { + s.SetDefaultCPUSet(allCPUs) + } +- klog.Infof("[cpumanager] static policy: CPUSet: allCPUs:%v, reserved:%v, default:%v\n", +- allCPUs, p.reserved, s.GetDefaultCPUSet()) ++ klog.Infof("[cpumanager] static policy: CPUSet: allCPUs:%v, reserved:%v, isolcpus:%v, default:%v\n", ++ allCPUs, p.reserved, p.isolcpus, s.GetDefaultCPUSet()) ++ + return nil + } + +@@ -278,10 +294,11 @@ func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Contai + return nil + } + +- cpuset := p.reserved ++ cpuset := p.reserved.Clone().Difference(p.isolcpus) + if cpuset.IsEmpty() { + // If this happens then someone messed up. +- return fmt.Errorf("[cpumanager] static policy: reserved container unable to allocate cpus (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v, reserved:%v", pod.Namespace, string(pod.UID), pod.Name, container.Name, cpuset, p.reserved) ++ return fmt.Errorf("[cpumanager] static policy: reserved container unable to allocate cpus (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v, reserved:%v, isolcpus:%v", pod.Namespace, string(pod.UID), pod.Name, container.Name, cpuset, p.reserved, p.isolcpus) ++ + } + s.SetCPUSet(string(pod.UID), container.Name, cpuset) + klog.Infof("[cpumanager] static policy: reserved: AddContainer (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v", pod.Namespace, string(pod.UID), pod.Name, container.Name, cpuset) +@@ -325,8 +342,34 @@ func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Contai + } + s.SetCPUSet(string(pod.UID), container.Name, cpuset) + p.updateCPUsToReuse(pod, container, cpuset) ++ klog.Infof("[cpumanager] guaranteed: AddContainer "+ ++ "(namespace: %s, pod UID: %s, pod: %s, container: %s); numCPUS=%d, cpuset=%v", ++ pod.Namespace, string(pod.UID), pod.Name, container.Name, numCPUs, cpuset) ++ return nil ++ } + ++ if isolcpus := p.podIsolCPUs(pod, container); isolcpus.Size() > 0 { ++ // container has requested isolated CPUs ++ if set, ok := s.GetCPUSet(string(pod.UID), container.Name); ok { ++ if set.Equals(isolcpus) { ++ klog.Infof("[cpumanager] isolcpus container already present in state, skipping (namespace: %s, pod UID: %s, pod: %s, container: %s)", ++ pod.Namespace, string(pod.UID), pod.Name, container.Name) ++ return nil ++ } else { ++ klog.Infof("[cpumanager] isolcpus container state has cpus %v, should be %v (namespace: %s, pod UID: %s, pod: %s, container: %s)", ++ isolcpus, set, pod.Namespace, string(pod.UID), pod.Name, container.Name) ++ } ++ } ++ // Note that we do not do anything about init containers here. ++ // It looks like devices are allocated per-pod based on effective requests/limits ++ // and extra devices from initContainers are not freed up when the regular containers start. ++ // TODO: confirm this is still true for 1.20 ++ s.SetCPUSet(string(pod.UID), container.Name, isolcpus) ++ klog.Infof("[cpumanager] isolcpus: AddContainer (namespace: %s, pod UID: %s, pod: %s, container: %s); cpuset=%v", ++ pod.Namespace, string(pod.UID), pod.Name, container.Name, isolcpus) ++ return nil + } ++ + // container belongs in the shared pool (nothing to do; use default cpuset) + return nil + } +@@ -619,3 +662,33 @@ func isKubeInfra(pod *v1.Pod) bool { + } + return false + } ++ ++// get the isolated CPUs (if any) from the devices associated with a specific container ++func (p *staticPolicy) podIsolCPUs(pod *v1.Pod, container *v1.Container) cpuset.CPUSet { ++ // NOTE: This is required for TestStaticPolicyAdd() since makePod() does ++ // not create UID. We also need a way to properly stub devicemanager. ++ if len(string(pod.UID)) == 0 { ++ return cpuset.NewCPUSet() ++ } ++ resContDevices := p.deviceManager.GetDevices(string(pod.UID), container.Name) ++ cpuSet := cpuset.NewCPUSet() ++ for resourceName, resourceDevs := range resContDevices { ++ // this resource name needs to match the isolcpus device plugin ++ if resourceName == "windriver.com/isolcpus" { ++ for devID, _ := range resourceDevs { ++ cpuStrList := []string{devID} ++ if len(cpuStrList) > 0 { ++ // loop over the list of strings, convert each one to int, add to cpuset ++ for _, cpuStr := range cpuStrList { ++ cpu, err := strconv.Atoi(cpuStr) ++ if err != nil { ++ panic(err) ++ } ++ cpuSet = cpuSet.Union(cpuset.NewCPUSet(cpu)) ++ } ++ } ++ } ++ } ++ } ++ return cpuSet ++} +diff --git a/pkg/kubelet/cm/cpumanager/policy_static_test.go b/pkg/kubelet/cm/cpumanager/policy_static_test.go +index 34c5a23c553..a0eb451b60e 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static_test.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static_test.go +@@ -25,6 +25,7 @@ import ( + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state" + "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" ++ "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" + "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" + ) +@@ -65,8 +66,9 @@ func (spt staticPolicyTest) PseudoClone() staticPolicyTest { + } + + func TestStaticPolicyName(t *testing.T) { ++ testDM, _ := devicemanager.NewManagerStub() + testExcl := false +- policy, _ := NewStaticPolicy(topoSingleSocketHT, 1, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testExcl) ++ policy, _ := NewStaticPolicy(topoSingleSocketHT, 1, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, testExcl) + + policyName := policy.Name() + if policyName != "static" { +@@ -76,6 +78,7 @@ func TestStaticPolicyName(t *testing.T) { + } + + func TestStaticPolicyStart(t *testing.T) { ++ testDM, _ := devicemanager.NewManagerStub() + testCases := []staticPolicyTest{ + { + description: "non-corrupted state", +@@ -151,7 +154,7 @@ func TestStaticPolicyStart(t *testing.T) { + } + for _, testCase := range testCases { + t.Run(testCase.description, func(t *testing.T) { +- p, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testCase.excludeReserved) ++ p, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, testCase.excludeReserved) + + policy := p.(*staticPolicy) + st := &mockState{ +@@ -199,7 +202,7 @@ func TestStaticPolicyAdd(t *testing.T) { + largeTopoCPUSet := largeTopoBuilder.Result() + largeTopoSock0CPUSet := largeTopoSock0Builder.Result() + largeTopoSock1CPUSet := largeTopoSock1Builder.Result() +- ++ testDM, _ := devicemanager.NewManagerStub() + // these are the cases which must behave the same regardless the policy options. + // So we will permutate the options to ensure this holds true. + optionsInsensitiveTestCases := []staticPolicyTest{ +@@ -529,8 +532,9 @@ func TestStaticPolicyAdd(t *testing.T) { + } + + func runStaticPolicyTestCase(t *testing.T, testCase staticPolicyTest) { ++ testDM, _ := devicemanager.NewManagerStub() + testExcl := false +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), testCase.options, testExcl) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), testCase.options, testDM, testExcl) + + st := &mockState{ + assignments: testCase.stAssignments, +@@ -573,6 +577,7 @@ func runStaticPolicyTestCase(t *testing.T, testCase staticPolicyTest) { + + func TestStaticPolicyRemove(t *testing.T) { + excludeReserved := false ++ testDM, _ := devicemanager.NewManagerStub() + testCases := []staticPolicyTest{ + { + description: "SingleSocketHT, DeAllocOneContainer", +@@ -631,7 +636,7 @@ func TestStaticPolicyRemove(t *testing.T) { + } + + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testCase.excludeReserved) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, excludeReserved) + + st := &mockState{ + assignments: testCase.stAssignments, +@@ -654,6 +659,7 @@ func TestStaticPolicyRemove(t *testing.T) { + + func TestTopologyAwareAllocateCPUs(t *testing.T) { + excludeReserved := false ++ testDM, _ := devicemanager.NewManagerStub() + testCases := []struct { + description string + topo *topology.CPUTopology +@@ -722,7 +728,8 @@ func TestTopologyAwareAllocateCPUs(t *testing.T) { + }, + } + for _, tc := range testCases { +- p, _ := NewStaticPolicy(tc.topo, 0, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, excludeReserved) ++ p, _ := NewStaticPolicy(tc.topo, 0, cpuset.NewCPUSet(), cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, excludeReserved) ++ + policy := p.(*staticPolicy) + st := &mockState{ + assignments: tc.stAssignments, +@@ -755,6 +762,7 @@ type staticPolicyTestWithResvList struct { + topo *topology.CPUTopology + numReservedCPUs int + reserved cpuset.CPUSet ++ isolcpus cpuset.CPUSet + stAssignments state.ContainerCPUAssignments + stDefaultCPUSet cpuset.CPUSet + pod *v1.Pod +@@ -765,6 +773,8 @@ type staticPolicyTestWithResvList struct { + } + + func TestStaticPolicyStartWithResvList(t *testing.T) { ++ testDM, _ := devicemanager.NewManagerStub() ++ testExcl := false + testCases := []staticPolicyTestWithResvList{ + { + description: "empty cpuset", +@@ -794,11 +804,9 @@ func TestStaticPolicyStartWithResvList(t *testing.T) { + expNewErr: fmt.Errorf("[cpumanager] unable to reserve the required amount of CPUs (size of 0-1 did not equal 1)"), + }, + } +- testExcl := false + for _, testCase := range testCases { + t.Run(testCase.description, func(t *testing.T) { +- p, err := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil, testExcl) +- ++ p, err := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testDM, testExcl) + if !reflect.DeepEqual(err, testCase.expNewErr) { + t.Errorf("StaticPolicy Start() error (%v). expected error: %v but got: %v", + testCase.description, testCase.expNewErr, err) +@@ -838,6 +846,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + topo: topoSingleSocketHT, + numReservedCPUs: 1, + reserved: cpuset.NewCPUSet(0), ++ isolcpus: cpuset.NewCPUSet(), + stAssignments: state.ContainerCPUAssignments{}, + stDefaultCPUSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 6, 7), + pod: makePod("fakePod", "fakeContainer2", "8000m", "8000m"), +@@ -850,6 +859,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + topo: topoSingleSocketHT, + numReservedCPUs: 2, + reserved: cpuset.NewCPUSet(0, 1), ++ isolcpus: cpuset.NewCPUSet(), + stAssignments: state.ContainerCPUAssignments{}, + stDefaultCPUSet: cpuset.NewCPUSet(2, 3, 4, 5, 6, 7), + pod: makePod("fakePod", "fakeContainer2", "1000m", "1000m"), +@@ -862,6 +872,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + topo: topoSingleSocketHT, + numReservedCPUs: 2, + reserved: cpuset.NewCPUSet(0, 1), ++ isolcpus: cpuset.NewCPUSet(), + stAssignments: state.ContainerCPUAssignments{ + "fakePod": map[string]cpuset.CPUSet{ + "fakeContainer100": cpuset.NewCPUSet(2, 3, 6, 7), +@@ -878,6 +889,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + topo: topoSingleSocketHT, + numReservedCPUs: 2, + reserved: cpuset.NewCPUSet(0, 1), ++ isolcpus: cpuset.NewCPUSet(), + stAssignments: state.ContainerCPUAssignments{ + "fakePod": map[string]cpuset.CPUSet{ + "fakeContainer100": cpuset.NewCPUSet(2, 3, 6, 7), +@@ -889,11 +901,29 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + expCPUAlloc: true, + expCSet: cpuset.NewCPUSet(0, 1), + }, ++ { ++ description: "InfraPod, SingleSocketHT, Isolcpus, ExpectAllocReserved", ++ topo: topoSingleSocketHT, ++ numReservedCPUs: 2, ++ reserved: cpuset.NewCPUSet(0, 1), ++ isolcpus: cpuset.NewCPUSet(1), ++ stAssignments: state.ContainerCPUAssignments{ ++ "fakePod": map[string]cpuset.CPUSet{ ++ "fakeContainer100": cpuset.NewCPUSet(2, 3, 6, 7), ++ }, ++ }, ++ stDefaultCPUSet: cpuset.NewCPUSet(4, 5), ++ pod: infraPod, ++ expErr: nil, ++ expCPUAlloc: true, ++ expCSet: cpuset.NewCPUSet(0), ++ }, + } + + testExcl := true ++ testDM, _ := devicemanager.NewManagerStub() + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil, testExcl) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, testCase.isolcpus, topologymanager.NewFakeManager(), nil, testDM, testExcl) + + st := &mockState{ + assignments: testCase.stAssignments, +-- +2.25.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-keep-normal-containers-off-reserv.patch b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-keep-normal-containers-off-reserv.patch new file mode 100644 index 000000000..e9b457928 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/files/kubelet-cpumanager-keep-normal-containers-off-reserv.patch @@ -0,0 +1,311 @@ +From f2186adb445f1420184aa5af5536bb777536a798 Mon Sep 17 00:00:00 2001 +From: Gleb Aronsky +Date: Mon, 24 Jan 2022 15:52:24 -0500 +Subject: [PATCH] kubelet cpumanager keep normal containers off reserved CPUs + +When starting the kubelet process, two separate sets of reserved CPUs +may be specified. With this change CPUs reserved via +'--system-reserved=cpu' +or '--kube-reserved=cpu' will be ignored by kubernetes itself. A small +tweak to the default CPU affinity ensures that "normal" Kubernetes +pods won't run on the reserved CPUs. + +Co-authored-by: Jim Gauld +Signed-off-by: Gleb Aronsky +--- + pkg/kubelet/cm/cpumanager/cpu_manager.go | 6 ++- + pkg/kubelet/cm/cpumanager/cpu_manager_test.go | 11 ++++-- + pkg/kubelet/cm/cpumanager/policy_static.go | 29 +++++++++++--- + .../cm/cpumanager/policy_static_test.go | 38 ++++++++++++++----- + 4 files changed, 64 insertions(+), 20 deletions(-) + +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager.go b/pkg/kubelet/cm/cpumanager/cpu_manager.go +index 6ad289336ea..8336e7b0fd4 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager.go +@@ -191,7 +191,11 @@ func NewManager(cpuPolicyName string, cpuPolicyOptions map[string]string, reconc + // exclusively allocated. + reservedCPUsFloat := float64(reservedCPUs.MilliValue()) / 1000 + numReservedCPUs := int(math.Ceil(reservedCPUsFloat)) +- policy, err = NewStaticPolicy(topo, numReservedCPUs, specificCPUs, affinity, cpuPolicyOptions) ++ // NOTE: Set excludeReserved unconditionally to exclude reserved CPUs from default cpuset. ++ // This variable is primarily to make testing easier. ++ excludeReserved := true ++ policy, err = NewStaticPolicy(topo, numReservedCPUs, specificCPUs, affinity, cpuPolicyOptions, excludeReserved) ++ + if err != nil { + return nil, fmt.Errorf("new static policy error: %w", err) + } +diff --git a/pkg/kubelet/cm/cpumanager/cpu_manager_test.go b/pkg/kubelet/cm/cpumanager/cpu_manager_test.go +index 9b3e24fc3b2..2c8349662c4 100644 +--- a/pkg/kubelet/cm/cpumanager/cpu_manager_test.go ++++ b/pkg/kubelet/cm/cpumanager/cpu_manager_test.go +@@ -215,6 +215,7 @@ func makeMultiContainerPod(initCPUs, appCPUs []struct{ request, limit string }) + } + + func TestCPUManagerAdd(t *testing.T) { ++ testExcl := false + testPolicy, _ := NewStaticPolicy( + &topology.CPUTopology{ + NumCPUs: 4, +@@ -230,7 +231,8 @@ func TestCPUManagerAdd(t *testing.T) { + 0, + cpuset.NewCPUSet(), + topologymanager.NewFakeManager(), +- nil) ++ nil, ++ testExcl) + testCases := []struct { + description string + updateErr error +@@ -479,8 +481,9 @@ func TestCPUManagerAddWithInitContainers(t *testing.T) { + }, + } + ++ testExcl := false + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testExcl) + + mockState := &mockState{ + assignments: testCase.stAssignments, +@@ -1228,6 +1231,7 @@ func TestReconcileState(t *testing.T) { + // above test cases are without kubelet --reserved-cpus cmd option + // the following tests are with --reserved-cpus configured + func TestCPUManagerAddWithResvList(t *testing.T) { ++ testExcl := false + testPolicy, _ := NewStaticPolicy( + &topology.CPUTopology{ + NumCPUs: 4, +@@ -1243,7 +1247,8 @@ func TestCPUManagerAddWithResvList(t *testing.T) { + 1, + cpuset.NewCPUSet(0), + topologymanager.NewFakeManager(), +- nil) ++ nil, ++ testExcl) + testCases := []struct { + description string + updateErr error +diff --git a/pkg/kubelet/cm/cpumanager/policy_static.go b/pkg/kubelet/cm/cpumanager/policy_static.go +index f7ff26cd313..9697f4d4bb0 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static.go +@@ -96,6 +96,8 @@ type staticPolicy struct { + topology *topology.CPUTopology + // set of CPUs that is not available for exclusive assignment + reserved cpuset.CPUSet ++ // If true, default CPUSet should exclude reserved CPUs ++ excludeReserved bool + // topology manager reference to get container Topology affinity + affinity topologymanager.Store + // set of CPUs to reuse across allocations in a pod +@@ -110,7 +112,7 @@ var _ Policy = &staticPolicy{} + // NewStaticPolicy returns a CPU manager policy that does not change CPU + // assignments for exclusively pinned guaranteed containers after the main + // container process starts. +-func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reservedCPUs cpuset.CPUSet, affinity topologymanager.Store, cpuPolicyOptions map[string]string) (Policy, error) { ++func NewStaticPolicy(topology *topology.CPUTopology, numReservedCPUs int, reservedCPUs cpuset.CPUSet, affinity topologymanager.Store, cpuPolicyOptions map[string]string, excludeReserved bool) (Policy, error) { + opts, err := NewStaticPolicyOptions(cpuPolicyOptions) + if err != nil { + return nil, err +@@ -172,7 +174,15 @@ func (p *staticPolicy) validateState(s state.State) error { + } + // state is empty initialize + allCPUs := p.topology.CPUDetails.CPUs() +- s.SetDefaultCPUSet(allCPUs) ++ if p.excludeReserved { ++ // Exclude reserved CPUs from the default CPUSet to keep containers off them ++ // unless explicitly affined. ++ s.SetDefaultCPUSet(allCPUs.Difference(p.reserved)) ++ } else { ++ s.SetDefaultCPUSet(allCPUs) ++ } ++ klog.Infof("[cpumanager] static policy: CPUSet: allCPUs:%v, reserved:%v, default:%v\n", ++ allCPUs, p.reserved, s.GetDefaultCPUSet()) + return nil + } + +@@ -180,11 +190,12 @@ func (p *staticPolicy) validateState(s state.State) error { + // 1. Check if the reserved cpuset is not part of default cpuset because: + // - kube/system reserved have changed (increased) - may lead to some containers not being able to start + // - user tampered with file +- if !p.reserved.Intersection(tmpDefaultCPUset).Equals(p.reserved) { +- return fmt.Errorf("not all reserved cpus: \"%s\" are present in defaultCpuSet: \"%s\"", +- p.reserved.String(), tmpDefaultCPUset.String()) ++ if !p.excludeReserved { ++ if !p.reserved.Intersection(tmpDefaultCPUset).Equals(p.reserved) { ++ return fmt.Errorf("not all reserved cpus: \"%s\" are present in defaultCpuSet: \"%s\"", ++ p.reserved.String(), tmpDefaultCPUset.String()) ++ } + } +- + // 2. Check if state for static policy is consistent + for pod := range tmpAssignments { + for container, cset := range tmpAssignments[pod] { +@@ -211,6 +222,9 @@ func (p *staticPolicy) validateState(s state.State) error { + } + } + totalKnownCPUs = totalKnownCPUs.UnionAll(tmpCPUSets) ++ if p.excludeReserved { ++ totalKnownCPUs = totalKnownCPUs.Union(p.reserved) ++ } + if !totalKnownCPUs.Equals(p.topology.CPUDetails.CPUs()) { + return fmt.Errorf("current set of available CPUs \"%s\" doesn't match with CPUs in state \"%s\"", + p.topology.CPUDetails.CPUs().String(), totalKnownCPUs.String()) +@@ -296,6 +310,9 @@ func (p *staticPolicy) RemoveContainer(s state.State, podUID string, containerNa + klog.InfoS("Static policy: RemoveContainer", "podUID", podUID, "containerName", containerName) + if toRelease, ok := s.GetCPUSet(podUID, containerName); ok { + s.Delete(podUID, containerName) ++ if p.excludeReserved { ++ toRelease = toRelease.Difference(p.reserved) ++ } + // Mutate the shared pool, adding released cpus. + s.SetDefaultCPUSet(s.GetDefaultCPUSet().Union(toRelease)) + } +diff --git a/pkg/kubelet/cm/cpumanager/policy_static_test.go b/pkg/kubelet/cm/cpumanager/policy_static_test.go +index d2b641fe3a0..80bd04a1f92 100644 +--- a/pkg/kubelet/cm/cpumanager/policy_static_test.go ++++ b/pkg/kubelet/cm/cpumanager/policy_static_test.go +@@ -33,6 +33,7 @@ type staticPolicyTest struct { + description string + topo *topology.CPUTopology + numReservedCPUs int ++ excludeReserved bool + podUID string + options map[string]string + containerName string +@@ -64,7 +65,8 @@ func (spt staticPolicyTest) PseudoClone() staticPolicyTest { + } + + func TestStaticPolicyName(t *testing.T) { +- policy, _ := NewStaticPolicy(topoSingleSocketHT, 1, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil) ++ testExcl := false ++ policy, _ := NewStaticPolicy(topoSingleSocketHT, 1, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testExcl) + + policyName := policy.Name() + if policyName != "static" { +@@ -94,6 +96,15 @@ func TestStaticPolicyStart(t *testing.T) { + stDefaultCPUSet: cpuset.NewCPUSet(), + expCSet: cpuset.NewCPUSet(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), + }, ++ { ++ description: "empty cpuset exclude reserved", ++ topo: topoDualSocketHT, ++ numReservedCPUs: 2, ++ excludeReserved: true, ++ stAssignments: state.ContainerCPUAssignments{}, ++ stDefaultCPUSet: cpuset.NewCPUSet(), ++ expCSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 7, 8, 9, 10, 11), ++ }, + { + description: "reserved cores 0 & 6 are not present in available cpuset", + topo: topoDualSocketHT, +@@ -140,7 +151,8 @@ func TestStaticPolicyStart(t *testing.T) { + } + for _, testCase := range testCases { + t.Run(testCase.description, func(t *testing.T) { +- p, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil) ++ p, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testCase.excludeReserved) ++ + policy := p.(*staticPolicy) + st := &mockState{ + assignments: testCase.stAssignments, +@@ -211,7 +223,7 @@ func TestStaticPolicyAdd(t *testing.T) { + "fakeContainer100": cpuset.NewCPUSet(2, 3, 6, 7), + }, + }, +- stDefaultCPUSet: cpuset.NewCPUSet(0, 1, 4, 5), ++ stDefaultCPUSet: cpuset.NewCPUSet(4, 5), + pod: makePod("fakePod", "fakeContainer3", "2000m", "2000m"), + expErr: nil, + expCPUAlloc: true, +@@ -517,7 +529,8 @@ func TestStaticPolicyAdd(t *testing.T) { + } + + func runStaticPolicyTestCase(t *testing.T, testCase staticPolicyTest) { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), testCase.options) ++ testExcl := false ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), testCase.options, testExcl) + + st := &mockState{ + assignments: testCase.stAssignments, +@@ -559,6 +572,7 @@ func runStaticPolicyTestCase(t *testing.T, testCase staticPolicyTest) { + } + + func TestStaticPolicyRemove(t *testing.T) { ++ excludeReserved := false + testCases := []staticPolicyTest{ + { + description: "SingleSocketHT, DeAllocOneContainer", +@@ -617,7 +631,7 @@ func TestStaticPolicyRemove(t *testing.T) { + } + + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, testCase.excludeReserved) + + st := &mockState{ + assignments: testCase.stAssignments, +@@ -639,6 +653,7 @@ func TestStaticPolicyRemove(t *testing.T) { + } + + func TestTopologyAwareAllocateCPUs(t *testing.T) { ++ excludeReserved := false + testCases := []struct { + description string + topo *topology.CPUTopology +@@ -707,7 +722,7 @@ func TestTopologyAwareAllocateCPUs(t *testing.T) { + }, + } + for _, tc := range testCases { +- p, _ := NewStaticPolicy(tc.topo, 0, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil) ++ p, _ := NewStaticPolicy(tc.topo, 0, cpuset.NewCPUSet(), topologymanager.NewFakeManager(), nil, excludeReserved) + policy := p.(*staticPolicy) + st := &mockState{ + assignments: tc.stAssignments, +@@ -779,9 +794,11 @@ func TestStaticPolicyStartWithResvList(t *testing.T) { + expNewErr: fmt.Errorf("[cpumanager] unable to reserve the required amount of CPUs (size of 0-1 did not equal 1)"), + }, + } ++ testExcl := false + for _, testCase := range testCases { + t.Run(testCase.description, func(t *testing.T) { +- p, err := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil) ++ p, err := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil, testExcl) ++ + if !reflect.DeepEqual(err, testCase.expNewErr) { + t.Errorf("StaticPolicy Start() error (%v). expected error: %v but got: %v", + testCase.description, testCase.expNewErr, err) +@@ -821,7 +838,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + numReservedCPUs: 1, + reserved: cpuset.NewCPUSet(0), + stAssignments: state.ContainerCPUAssignments{}, +- stDefaultCPUSet: cpuset.NewCPUSet(0, 1, 2, 3, 4, 5, 6, 7), ++ stDefaultCPUSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 6, 7), + pod: makePod("fakePod", "fakeContainer2", "8000m", "8000m"), + expErr: fmt.Errorf("not enough cpus available to satisfy request"), + expCPUAlloc: false, +@@ -833,7 +850,7 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + numReservedCPUs: 2, + reserved: cpuset.NewCPUSet(0, 1), + stAssignments: state.ContainerCPUAssignments{}, +- stDefaultCPUSet: cpuset.NewCPUSet(0, 1, 2, 3, 4, 5, 6, 7), ++ stDefaultCPUSet: cpuset.NewCPUSet(2, 3, 4, 5, 6, 7), + pod: makePod("fakePod", "fakeContainer2", "1000m", "1000m"), + expErr: nil, + expCPUAlloc: true, +@@ -857,8 +874,9 @@ func TestStaticPolicyAddWithResvList(t *testing.T) { + }, + } + ++ testExcl := true + for _, testCase := range testCases { +- policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil) ++ policy, _ := NewStaticPolicy(testCase.topo, testCase.numReservedCPUs, testCase.reserved, topologymanager.NewFakeManager(), nil, testExcl) + + st := &mockState{ + assignments: testCase.stAssignments, +-- +2.25.1 + diff --git a/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec b/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec new file mode 100644 index 000000000..665c0c313 --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec @@ -0,0 +1,2250 @@ +%if 0%{?fedora} +%global with_devel 1 +%global with_bundled 0 +%global with_debug 1 +%else +%global with_devel 0 +%global with_bundled 1 +%global with_debug 0 +%endif + +%if 0%{?with_debug} +# https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12 +%global _dwz_low_mem_die_limit 0 +%else +%global debug_package %{nil} +%endif + +%global provider github +%global provider_tld com +%global project kubernetes +%global repo kubernetes +# https://github.com/kubernetes/kubernetes + +%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} +%global import_path k8s.io/kubernetes +%global commit 1.23.1 + +%global kube_version 1.23.1 +%global kube_git_version v%{kube_version} + +%global go_version 1.17.5 +%global go_path /usr/lib/golang-%{go_version}-%{go_version}/bin + +# Needed otherwise "version_ldflags=$(kube::version_ldflags)" doesn't work +%global _buildshell /bin/bash +%global _checkshell /bin/bash + +# Used to simplify the paths for install and files +%global _stage1 %{_exec_prefix}/local/kubernetes/%{kube_version}/stage1 +%global _stage2 %{_exec_prefix}/local/kubernetes/%{kube_version}/stage2 + +############################################## +Name: kubernetes-%{kube_version} +Version: %{kube_version} +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Container cluster management +License: ASL 2.0 +URL: https://%{import_path} +ExclusiveArch: x86_64 aarch64 ppc64le s390x +Source0: %{project}-v%{kube_version}.tar.gz +Source4: kubeadm.conf +Source5: kubelet-cgroup-setup.sh + +Patch1: kubelet-cpumanager-disable-CFS-quota-throttling-for-.patch +Patch2: kubelet-cpumanager-keep-normal-containers-off-reserv.patch +Patch3: kubelet-cpumanager-infrastructure-pods-use-system-re.patch +Patch4: kubelet-cpumanager-introduce-concept-of-isolated-CPU.patch +Patch5: kubeadm-create-platform-pods-with-zero-CPU-resources.patch +Patch6: enable-support-for-kubernetes-to-ignore-isolcpus.patch +Patch7: Revert-use-subpath-for-coredns-only-for-default-repo.patch + +# It obsoletes cadvisor but needs its source code (literally integrated) +Obsoletes: cadvisor + +# kubernetes is decomposed into master and node subpackages +# require both of them for updates +Requires: kubernetes-%{kube_version}-master +Requires: kubernetes-%{kube_version}-node + +%description +%{summary} + +%if 0%{?with_devel} +%package devel +Summary: %{summary} +BuildArch: noarch + +Provides: golang(%{import_path}/cmd/genutils) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-apiserver/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-apiserver/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-controller-manager/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-controller-manager/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-proxy/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-proxy/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubectl/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubelet/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubelet/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/args) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/args) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators/normalization) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/install) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/v1) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/conversion-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/deepcopy-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/generator) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/go-to-protobuf/protobuf) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/import-boss/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/namer) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/parser) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/set-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/types) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation/install) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/core/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/core/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/extensions/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/extensions/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/federation/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/federation/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/pkg/federation-controller/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/admission) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/annotations) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/endpoints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/errors) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/errors/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/meta) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/meta/metatypes) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/resource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/rest/resttest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testing/compat) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/unversioned/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apimachinery) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apimachinery/registered) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/latest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/v0) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/v2alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/audit) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authenticator/bearertoken) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer/abac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer/union) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/handlers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/chaosclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/core/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/autoscaling/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/batch/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/authorization/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/authorization/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/autoscaling/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/batch/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/policy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/policy/v1alpha1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/leaderelection) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/metrics/prometheus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/record) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/restclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/testing/core) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/transport) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/discovery) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/discovery/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/dynamic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/adapters/internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/auth) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api/latest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/portforward) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/remotecommand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/testclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/testclient/simple) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/aws) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/azure) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/cloudstack) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/gce) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/mesos) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/openstack) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/ovirt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/rackspace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/vsphere) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/daemon) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/deployment) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/deployment/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/disruption) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/endpoint) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/framework) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/framework/informers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/garbagecollector) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/garbagecollector/metaonly) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/job) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/namespace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/petset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podautoscaler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podautoscaler/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podgc) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replicaset/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replication) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/route) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/scheduledjob) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/populator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/reconciler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/statusupdater) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/persistentvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/persistentvolume/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/conversion) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/conversion/queryparams) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider/aws) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider/gcp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/dns) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/fieldpath) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/fields) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/openapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/healthz) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/httplog) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/rollout) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/set) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/templates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util/editor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util/jsonmerge) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/metricsutil) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/resource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/v1alpha1/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/v1alpha1/stats) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cadvisor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cadvisor/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/client) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cm) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/container) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/container/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/custommetrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/dockershim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/dockertools) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/envvars) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/events) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/eviction) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/images) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/kuberuntime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/leaky) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/lifecycle) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/cni) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/cni/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hairpin) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hostport) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hostport/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/kubenet) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/mock_network) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pleg) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pod/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober/results) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/qos) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/remote) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rkt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rkt/mock_os) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rktshim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/portforward) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/remotecommand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/stats) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/status) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/format) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/ioutils) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/queue) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/sliceutils) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/populator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/reconciler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubemark) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/labels) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/master) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/master/ports) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/http) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/tcp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/healthcheck) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/iptables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/userspace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/evaluator/core) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/generic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/authorization/subjectaccessreview) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/authorization/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/cachesize) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/certificates/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/componentstatus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/configmap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/configmap/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/controller/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/daemonset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/daemonset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/deployment) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/deployment/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/endpoint) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/endpoint/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/event) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/event/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/experimental/controller/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic/registry) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/horizontalpodautoscaler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/horizontalpodautoscaler/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/ingress) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/ingress/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/job) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/job/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/limitrange) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/limitrange/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/namespace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/namespace/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/networkpolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/networkpolicy/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolume/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolumeclaim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolumeclaim/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/petset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/petset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/poddisruptionbudget) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/poddisruptionbudget/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podsecuritypolicy/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podtemplate) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podtemplate/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rangeallocation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/registrytest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/replicaset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/resourcequota/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/scheduledjob) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/scheduledjob/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/secret) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/secret/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/securitycontextconstraints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/securitycontextconstraints/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/allocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/allocator/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/portallocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/portallocator/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/serviceaccount/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/storageclass) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/storageclass/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresource/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresourcedata) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresourcedata/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/tokenreview) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/protobuf) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/recognizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/streaming) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/versioning) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/yaml) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/apparmor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/apparmor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/group) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontext) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/group) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/seccomp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/selection) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/ssh) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/etcdtest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/testing/testingcert) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd3) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/storagebackend) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/storagebackend/factory) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/ui) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/async) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/bandwidth) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/chmod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/chown) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/clock) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/codeinspector) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/configz) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/crlf) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/crypto) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/dbus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/diff) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/ebtables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/env) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/errors) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flag) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flock) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flowcontrol) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flushwriter) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/framer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/goroutinemap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/goroutinemap/exponentialbackoff) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/hash) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/homedir) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/httpstream) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/httpstream/spdy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/integer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/interrupt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/intstr) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/io) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/iptables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/iptables/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/jsonpath) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/keymutex) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/labels) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/limitwriter) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/logs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/maps) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/mount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/net) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/net/sets) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/oom) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/parsers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/procfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/proxy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/rand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/resourcecontainer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/rlimit) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sets) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sets/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/slice) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/strategicpatch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/strings) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sysctl/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/system) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/term) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/threading) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/uuid) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/validation/field) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/wait) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/workqueue) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/wsstream) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/yaml) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version/prometheus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version/verflag) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/aws_ebs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/azure_dd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/azure_file) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/cephfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/cinder) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/configmap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/downwardapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/empty_dir) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/fc) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/flexvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/flocker) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/gce_pd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/git_repo) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/glusterfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/host_path) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/iscsi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/nfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/quobyte) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/rbd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/secret) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/nestedpendingoperations) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/operationexecutor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/volumehelper) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/vsphere_volume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch/versioned) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/cmd/kube-scheduler/app) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/cmd/kube-scheduler/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/admit) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/alwayspullimages) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/antiaffinity) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/deny) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/exec) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/imagepolicy) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/initialresources) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/limitranger) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/autoprovision) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/exists) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/lifecycle) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/persistentvolume/label) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/security) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/security/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/securitycontext/scdeny) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/storageclass/default) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/allow) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/keystone) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/passwordfile) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/basicauth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/union) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/x509) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/oidc) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/oidc/testing) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/tokenfile) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/tokentest) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/webhook) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer/rbac) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer/webhook) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth/gcp) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth/oidc) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/predicates) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/priorities) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/priorities/util) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithmprovider) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithmprovider/defaults) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/latest) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/validation) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/factory) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/schedulercache) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/testing) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/webhook) = %{version}-%{release} + +%description devel +Libraries for building packages importing k8s.io/kubernetes. +Currently, the devel is not suitable for development. +It is meant only as a buildtime dependency for other projects. + +This package contains library source intended for +building other packages which use %{project}/%{repo}. +%endif + +############################################## +%package unit-test +Summary: %{summary} - for running unit tests + +# below Rs used for testing +Requires: golang-%{go_version} +Requires: etcd >= 2.0.9 +Requires: hostname +Requires: rsync +Requires: NetworkManager + +%description unit-test +%{summary} - for running unit tests + +############################################## +%package master +Summary: Kubernetes services for master host + +# Build with the recommended golang for this Kubernetes version +BuildRequires: golang-%{go_version} +BuildRequires: systemd +BuildRequires: rsync +BuildRequires: go-md2man +BuildRequires: go-bindata + +Requires(pre): shadow-utils +Requires: kubernetes-%{kube_version}-client + +%description master +Kubernetes services for master host + +############################################## +%package node +Summary: Kubernetes services for node host + +%if 0%{?fedora} >= 27 +Requires: (docker or docker-ce) +Suggests: docker-ce +%else +Requires: docker-ce +%endif +Requires: conntrack-tools + +BuildRequires: golang-%{go_version} +BuildRequires: systemd +BuildRequires: rsync +BuildRequires: go-md2man +BuildRequires: go-bindata + +Requires(pre): shadow-utils +Requires: socat +Requires: kubernetes-%{kube_version}-client + +%description node +Kubernetes services for node host + +############################################## +%package kubeadm +Summary: Kubernetes tool for standing up clusters +Requires: kubernetes-%{kube_version}-client +Requires: containernetworking-cni + +%description kubeadm +Kubernetes tool for standing up clusters + +############################################## +%package client +Summary: Kubernetes client tools + +BuildRequires: golang-%{go_version} +BuildRequires: go-bindata + +%description client +Kubernetes client tools like kubectl + +############################################## +%package kube-misc +Summary: dummy package +%description kube-misc +Kubernetes dummy package for misc stuff we don't want to +install in production. + +############################################## + +%prep +%setup -q -n %{repo}-%{commit} +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 + +#src/k8s.io/kubernetes/pkg/util/certificates +# Patch the code to remove eliptic.P224 support +for dir in vendor/github.com/google/certificate-transparency/go/x509 pkg/util/certificates; do + if [ -d "${dir}" ]; then + pushd ${dir} + sed -i "/^[^=]*$/ s/oidNamedCurveP224/oidNamedCurveP256/g" *.go + sed -i "/^[^=]*$/ s/elliptic\.P224/elliptic.P256/g" *.go + popd + fi +done + +# Move all the code under src/k8s.io/kubernetes directory +mkdir -p src/k8s.io/kubernetes +mv $(ls | grep -v "^src$") src/k8s.io/kubernetes/. + +############### + +%build +export PATH=%{go_path}:$PATH +export PBR_VERSION=%{version} +pushd src/k8s.io/kubernetes/ +export KUBE_GIT_TREE_STATE="clean" +export KUBE_GIT_COMMIT=%{commit} +export KUBE_GIT_VERSION=%{kube_git_version} +export KUBE_EXTRA_GOPATH=$(pwd)/Godeps/_workspace + +# Verify the go version we will build against +go version + +# https://bugzilla.redhat.com/show_bug.cgi?id=1392922#c1 +%ifarch ppc64le +export GOLDFLAGS='-linkmode=external' +%endif + +# uncomment these two lines to build unoptimized binaries for debugging. +# export GOLDFLAGS="" +# export GOGCFLAGS="-N -l" +make WHAT="cmd/kube-proxy cmd/kube-apiserver cmd/kube-controller-manager cmd/kubelet cmd/kubeadm cmd/kube-scheduler cmd/kubectl" + +# convert md to man +./hack/generate-docs.sh || true +pushd docs +pushd admin +cp kube-apiserver.md kube-controller-manager.md kube-proxy.md kube-scheduler.md kubelet.md .. +popd +popd + +%install +# go_path required for setup_env golang version check +export PATH=%{go_path}:$PATH +export PBR_VERSION=%{version} +pushd src/k8s.io/kubernetes/ +. hack/lib/init.sh +kube::golang::setup_env + +%ifarch ppc64le +output_path="_output/local/go/bin" +%else +output_path="${KUBE_OUTPUT_BINPATH}/$(kube::golang::host_platform)" +%endif + +install -m 755 -d %{buildroot}%{_bindir} +install -m 755 -d %{buildroot}%{_stage1}%{_bindir} +install -m 755 -d %{buildroot}%{_stage2}%{_bindir} + +echo "+++ INSTALLING kube-apiserver" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-apiserver + +echo "+++ INSTALLING kubeadm" +install -p -m 755 -t %{buildroot}%{_stage1}%{_bindir} ${output_path}/kubeadm +install -d -m 0755 %{buildroot}%{_stage2}%{_sysconfdir}/systemd/system/kubelet.service.d +install -p -m 0644 -t %{buildroot}%{_stage2}%{_sysconfdir}/systemd/system/kubelet.service.d %{SOURCE4} + +echo "+++ INSTALLING kubelet-cgroup-setup.sh" +install -p -m 0700 -t %{buildroot}%{_stage2}%{_bindir} %{SOURCE5} + +echo "+++ INSTALLING kube-apiserver" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-apiserver + +echo "+++ INSTALLING kube-controller-manager" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-controller-manager + +echo "+++ INSTALLING kube-scheduler" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-scheduler + +echo "+++ INSTALLING kube-proxy" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-proxy + +echo "+++ INSTALLING kubelet" +install -p -m 754 -t %{buildroot}%{_stage2}%{_bindir} ${output_path}/kubelet + +echo "+++ INSTALLING kubectl" +install -p -m 754 -t %{buildroot}%{_stage2}%{_bindir} ${output_path}/kubectl + +# install the bash completion +install -d -m 0755 %{buildroot}%{_stage2}%{_datadir}/bash-completion/completions/ +%{buildroot}%{_stage2}%{_bindir}/kubectl completion bash > %{buildroot}%{_stage2}%{_datadir}/bash-completion/completions/kubectl + +# install specific cluster addons for optional use +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/addons +# Addon: volumesnapshots +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/addons/volumesnapshots +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/addons/volumesnapshots/crd +install -m 0644 -t %{buildroot}%{_sysconfdir}/%{name}/addons/volumesnapshots/crd cluster/addons/volumesnapshots/crd/* +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/addons/volumesnapshots/volume-snapshot-controller +install -m 0644 -t %{buildroot}%{_sysconfdir}/%{name}/addons/volumesnapshots/volume-snapshot-controller cluster/addons/volumesnapshots/volume-snapshot-controller/* + +# install manpages +install -d %{buildroot}%{_mandir}/man1 +install -p -m 644 docs/man/man1/* %{buildroot}%{_mandir}/man1 +rm -Rf %{buildroot}%{_mandir}/man1/cloud-controller-manager.* +# from k8s tarball copied docs/man/man1/*.1 + +# source codes for building projects +%if 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list +# find all *.go but no *_test.go files and generate devel.file-list +for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do + echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file) + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> devel.filelist +done +%endif + + +%if 0%{?with_devel} +sort -u -o devel.file-list devel.file-list +%endif + +popd + +%if 0%{?with_devel} +mv src/k8s.io/kubernetes/devel.file-list . +%endif + +mv src/k8s.io/kubernetes/*.md . +mv src/k8s.io/kubernetes/LICENSE . + + +# place files for unit-test rpm +install -d -m 0755 %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/ +# basically, everything from the root directory is needed +# unit-tests needs source code +# integration tests needs docs and other files +# test-cmd.sh atm needs cluster, examples and other +cp -a src %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/ +rm -rf %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/src/k8s.io/kubernetes/_output +cp -a *.md %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/src/k8s.io/kubernetes/ + +%check +# Fedora, RHEL7 and CentOS are tested via unit-test subpackage +if [ 1 != 1 ]; then +echo "******Testing the commands*****" +hack/test-cmd.sh +echo "******Benchmarking kube********" +hack/benchmark-go.sh + +# In Fedora 20 and RHEL7 the go cover tools isn't available correctly +%if 0%{?fedora} >= 21 +echo "******Testing the go code******" +hack/test-go.sh +echo "******Testing integration******" +hack/test-integration.sh --use_go_build +%endif +fi + +############################################## +%files +# empty as it depends on master and node + +############################################## +%files master +%license LICENSE +%doc *.md +%attr(754, -, root) %caps(cap_net_bind_service=ep) %{_bindir}/kube-apiserver +%{_bindir}/kube-controller-manager +%{_bindir}/kube-scheduler +%dir %{_sysconfdir}/%{name} +%dir %{_sysconfdir}/%{name}/addons +%dir %{_sysconfdir}/%{name}/addons/volumesnapshots +%dir %{_sysconfdir}/%{name}/addons/volumesnapshots/crd +%{_sysconfdir}/%{name}/addons/volumesnapshots/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml +%{_sysconfdir}/%{name}/addons/volumesnapshots/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml +%{_sysconfdir}/%{name}/addons/volumesnapshots/crd/snapshot.storage.k8s.io_volumesnapshots.yaml +%dir %{_sysconfdir}/%{name}/addons/volumesnapshots/volume-snapshot-controller +%{_sysconfdir}/%{name}/addons/volumesnapshots/volume-snapshot-controller/volume-snapshot-controller-deployment.yaml +%{_sysconfdir}/%{name}/addons/volumesnapshots/volume-snapshot-controller/rbac-volume-snapshot-controller.yaml + +############################################## +%files node +%license LICENSE +%{_stage2}%{_bindir}/kubelet +%{_stage2}%{_bindir}/kubelet-cgroup-setup.sh + +############################################## +%files kubeadm +%license LICENSE +%{_stage1}%{_bindir}/kubeadm +%dir %{_stage2}%{_sysconfdir}/systemd/system/kubelet.service.d +%config(noreplace) %{_stage2}%{_sysconfdir}/systemd/system/kubelet.service.d/kubeadm.conf + +############################################## +%files client +%license LICENSE +%{_stage2}%{_bindir}/kubectl +%{_stage2}%{_datadir}/bash-completion/completions/kubectl + +############################################## +%files unit-test +%{_sharedstatedir}/kubernetes-unit-test/ + +%if 0%{?with_devel} +%files devel -f devel.file-list +%doc *.md +%dir %{gopath}/src/k8s.io +%endif + +############################################## +%files kube-misc +%{_mandir}/man1/kube-apiserver.1* +%{_mandir}/man1/kube-controller-manager.1* +%{_mandir}/man1/kube-scheduler.1* +%{_mandir}/man1/kube-proxy.1* +%{_bindir}/kube-proxy +%{_mandir}/man1/kubelet.1* +%{_mandir}/man1/kubeadm.1* +%{_mandir}/man1/kubeadm-* +%{_mandir}/man1/kubectl.1* +%{_mandir}/man1/kubectl-* + +############################################## + +%pre master + +%post master +%systemd_post kube-apiserver kube-scheduler kube-controller-manager + +%preun master +%systemd_preun kube-apiserver kube-scheduler kube-controller-manager + +%postun master +%systemd_postun + + +%pre node + +%post node + +%preun node + +%postun node +%systemd_postun + +############################################ +%changelog +* Tue Mar 27 2018 Spyros Trigazis - 1.10.0-1 +- Bump to upstream v1.10.0 + +* Thu Mar 22 2018 Spyros Trigazis - 1.9.6-1 +- Bump to upstream v1.9.6 + +* Tue Mar 20 2018 Jan Chaloupka - 1.9.5-1 +- Bump to upstream v1.9.5 + resolves: #1554420 + +* Sun Feb 11 2018 Spyros Trigazis - 1.9.3-1 +- Bump to upstream v1.9.3 + +* Fri Feb 09 2018 Jan Chaloupka - 1.9.1-5 +- Add --fail-swap-on=false flag to the /etc/kubernetes/kubelet + resolves: #1542476 + +* Thu Feb 08 2018 Igor Gnatenko - 1.9.1-4 +- Escape macro in %%changelog + +* Wed Feb 07 2018 Fedora Release Engineering - 1.9.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Jan 15 2018 Jan Chaloupka - 1.9.1-2 +- If docker is not available, try docker-ce instead (use boolean dependencies) + resolves: #1534508 + +* Fri Jan 12 2018 Spyros Trigazis - 1.9.1-1 +- Update to upstream v1.9.1 + resolves #1533794 + +* Tue Oct 24 2017 Jan Chaloupka - 1.8.1-1 +- Update to upstream v1.8.1 + resolves: #1497135 + +* Mon Oct 02 2017 Jan Chaloupka - 1.8.0-1 +- Update to upstream v1.8.0 + related: #1497625 + +* Mon Oct 02 2017 Jan Chaloupka - 1.7.7-1 +- Update to upstream v1.7.7 + resolves: #1497625 + +* Mon Sep 18 2017 Jan Chaloupka - 1.7.6-1 +- Update to upstream v1.7.6 + resolves: #1492551 + +* Mon Sep 11 2017 Jan Chaloupka - 1.7.5-1 +- Update to upstream v1.7.5 + resolves: #1490316 + +* Fri Aug 18 2017 Jan Chaloupka - 1.7.4-1 +- Fix the version + related: #1482874 + +* Fri Aug 18 2017 Jan Chaloupka - 1.7.3-2 +- Update to upstream v1.7.4 + resolves: #1482874 + +* Tue Aug 08 2017 Jan Chaloupka - 1.7.3-1 +- Update to upstream v1.7.3 + resolves: #1479685 + +* Thu Aug 03 2017 Fedora Release Engineering - 1.7.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Sun Jul 30 2017 Florian Weimer - 1.7.2-3 +- Rebuild with binutils fix for ppc64le (#1475636) + +* Wed Jul 26 2017 Fedora Release Engineering - 1.7.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jan Chaloupka - 1.7.2-1 +- Update to upstream v1.7.2 + +* Mon Jul 24 2017 Jan Chaloupka - 1.7.1-2 +- Sync kubeadm.conf with upstream service configuration (set Restart,StartLimitInterval,RestartSec) + +* Fri Jul 14 2017 Jan Chaloupka - 1.7.1-1 +- Update to upstream v1.7.1 + resolves: #1471767 + +* Sat Jul 08 2017 Jan Chaloupka - 1.6.7-1 +- Update to upstream v1.6.7 + resolves: #1468823 + resolves: #1468752 + +* Fri May 19 2017 Timothy St. Clair - 1.6.4-1 +- Add kubeadm subpackage to enable upstream deployments + +* Thu May 18 2017 Jan Chaloupka - 1.6.3-1 +- Update to upstream v1.6.3 + resolves: #1452101 + +* Fri May 12 2017 Jan Chaloupka - 1.6.2-2 +- Extend archs with s390x + resolves: #1400000 + +* Tue May 02 2017 Jan Chaloupka - 1.6.2-1 +- Update to upstream v1.6.2 + resolves: #1447338 + +* Tue Apr 11 2017 Jan Chaloupka - 1.6.1-1 +- Update to upstream v1.6.1 + related: #1422889 + +* Fri Mar 31 2017 Jan Chaloupka - 1.5.6-1 +- Update to upstream v1.5.6 + related: #1422889 + +* Mon Mar 27 2017 Jan Chaloupka - 1.5.5-4 +- Update to upstream v1.5.5 + related: #1422889 + +* Mon Mar 27 2017 Jan Chaloupka - 1.5.4-3 +- re-enable debug-info + related: #1422889 + +* Thu Mar 09 2017 Jan Chaloupka - 1.5.4-2 +- Bump to upstream 7243c69eb523aa4377bce883e7c0dd76b84709a1 + related: #1422889 + +* Thu Feb 16 2017 Jan Chaloupka - 1.5.3-1 +- Update to upstream v1.5.3 + resolves: #1422889 + +* Fri Feb 10 2017 Fedora Release Engineering - 1.5.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 18 2017 Jan Chaloupka - 1.5.2-2 +- fix rootScopeNaming generate selfLink + resolves: #1413997 + +* Fri Jan 13 2017 Jan Chaloupka - 1.5.2-1 +- Bump version as well + related: #1412996 + +* Fri Jan 13 2017 Jan Chaloupka - 1.5.1-2 +- Bump to upstream 1.5.2 + resolves: #1412996 + +* Thu Jan 05 2017 Jan Chaloupka - 1.5.1-1 +- Bump to upstream 1.5.1 + resolves: #1410186 + +* Wed Jan 04 2017 Jan Chaloupka - 1.4.7-2 +- Generate the md files before they are converted to man pages + resolves: #1409943 + +* Mon Dec 12 2016 Jan Chaloupka - 1.4.7-1 +- Bump to upstream v1.4.7 + resolves: #1403823 + New conntrack-tools dependency of kube-proxy + Build kubernetes on ppc64le with linkmode=external + resolves: #1392922 + +* Mon Nov 14 2016 jchaloup - 1.4.5-3 +- Patch unit-test subpackage to run tests over k8s distro binaries + +* Wed Nov 09 2016 jchaloup - 1.4.5-2 +- Add missing if devel around generated devel.file-list + related: #1390074 + +* Tue Nov 08 2016 jchaloup - 1.4.5-1 +- Bump to upstream v1.4.5 (flip back to upstream based Kubernetes) + related: #1390074 + +* Mon Oct 31 2016 jchaloup - 1.4.0-0.1.beta3.git52492b4 +- Update to origin v1.4.0-alpha.0 (ppc64le and arm unbuildable with the current golang version) + resolves: #1390074 + +* Mon Oct 24 2016 jchaloup - 1.3.0-0.4.git52492b4 +- Update to origin v1.3.1 + resolves: #1388092 + +* Thu Sep 08 2016 jchaloup - 1.3.0-0.3.rc1.git507d3a7 +- Update to origin v1.3.0-rc1 + resolves: #1374361 + +* Thu Aug 11 2016 Dennis Gilmore -1.3.0-0.2.git4a3f9c5 +- enable armv7hl and aarch64 + +* Tue Aug 09 2016 jchaloup - 1.3.0-0.1.git4a3f9c5 +- Update to origin v1.3.0-alpha.3 + resolves: #1365601 + +* Thu Jul 21 2016 Fedora Release Engineering - 1.2.0-0.27.git4a3f9c5 +- https://fedoraproject.org/wiki/Changes/golang1.7 + +* Sun Jul 17 2016 jchaloup - 1.2.0-0.26.git4a3f9c5 +- Update to origin v1.2.1 + resolves: #1357261 + +* Wed Jul 13 2016 jchaloup - 1.2.0-0.25.git4a3f9c5 +- Enable CPU and Memory accounting on a node + +* Wed Jun 29 2016 jchaloup - 1.2.0-0.24.git4a3f9c5 +- Be more verbose about devel subpackage + resolves: #1269449 + +* Tue Jun 28 2016 jchaloup - 1.2.0-0.23.git4a3f9c5 +- Own /run/kubernetes directory + resolves: #1264699 + +* Sat May 28 2016 jchaloup - 1.2.0-0.22.git4a3f9c5 +- Bump to origin v1.2.0 + resolves: #1340643 + +* Wed May 04 2016 jchaloup - 1.2.0-0.21.git4a3f9c5 +- Extend uni-test subpackage to run other tests + +* Mon Apr 25 2016 jchaloup - 1.2.0-0.20.git4a3f9c5 +- Update support for ppc64le to use go compiler + related: #1306214 + +* Thu Apr 21 2016 jchaloup - 1.2.0-0.19.git4a3f9c5 +- Fix support for ppc64le + related: #1306214 + +* Tue Apr 19 2016 jchaloup - 1.2.0-0.18.git4a3f9c5 +- Bump to origin v1.1.6 + resolves: #1328357 + +* Mon Apr 11 2016 jchaloup - 1.2.0-0.17.alpha6.git4a3f9c5 +- Don't disable extensions/v1beta1 by default to conform with upstream documentation + +* Wed Mar 30 2016 jchaloup - 1.2.0-0.16.alpha6.git4a3f9c5 + Update to origin's v1.1.5 + Build on ppc64le as well + resolves: #1306214 + +* Tue Mar 08 2016 jchaloup - 1.2.0-0.15.alpha6.gitf0cd09a +- hyperkube.server: don't parse args for any command + +* Fri Mar 04 2016 jchaloup - 1.2.0-0.14.alpha6.gitf0cd09a +- Disable extensions/v1beta1 implicitly + +* Tue Mar 01 2016 jchaloup - 1.2.0-0.13.alpha6.gitf0cd09a +- Hyperkube checks flags of individual commands/servers even if it does not define their flags. + Thus resulting in 'uknown shorthand flag' error + +* Mon Feb 29 2016 jchaloup - 1.2.0-0.12.alpha6.gitf0cd09a +- Disable v1beta3 +- hyperkube-kubectl-dont shift os.Args + +* Fri Feb 26 2016 jchaloup - 1.2.0-0.11.alpha6.gitf0cd09a +- add kube- prefix to controller-manager, proxy and scheduler + +* Fri Feb 26 2016 jchaloup - 1.2.0-0.10.alpha6.gitf0cd09a +- Hardlink kube-controller-manager, kuber-scheduler, kubectl, kubelet and kube-proxy into hyperkube +- Keep kube-apiserver binary as it is (it has different permission and capabilities) + +* Thu Feb 25 2016 jchaloup - 1.2.0-0.9.alpha6.gitf0cd09a +- Fix Content-Type of docker client response + resolves: #1311861 + +* Mon Feb 22 2016 Fedora Release Engineering - 1.2.0-0.8.alpha6.gitf0cd09a +- https://fedoraproject.org/wiki/Changes/golang1.6 + +* Mon Feb 22 2016 jchaloup - 1.2.0-0.7.alpha6.git4c8e6f4 +- Bump to origin 1.1.3 + kube-version-change command replaced with kubectl convert (check out docs/admin/cluster-management.md) + related: 1295066 + +* Thu Feb 04 2016 Fedora Release Engineering - 1.2.0-0.6.alpha1.git4c8e6f4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jan 21 2016 jchaloup - 1.2.0-0.5.alpha1.git4c8e6f4 +- Bump to upstream e1d9873c1d5711b83fd3dd7eefe83a88ceb92c08 + related: #1291860 + +* Thu Jan 07 2016 jchaloup - 1.2.0-0.4.alpha1.git4c8e6f4 +- Move definition of all version, git and commit macros at one place + resolves: #1291860 + +* Fri Jan 01 2016 jchaloup - 1.2.0-0.3.alpha1.git4c8e6f4 +- Bump to upstream bf56e235826baded1772fb340266b8419c3e8f30 + Rebase to origin's "v1.1.0.1 - Security Update to v1.1" release + resolves: #1295066 + +* Thu Nov 26 2015 jchaloup - 1.2.0-0.2.alpha1.git4c8e6f4 +- Bump to origin upstream a41c9ff38d52fd508481c3c2bac13d52871fde02 +- Build kubernetes from origin's Godeps using hack/build-go.sh + origin's Godeps = kubernetes upstream + additional patches + +* Tue Oct 20 2015 jchaloup - 1.2.0-0.1.alpha1.git4c8e6f4 +- Bump to upstream 403de3874fba420fd096f2329b45fe2f5ae97e46 + related: #1211266 + +* Wed Oct 14 2015 jchaloup - 1.1.0-0.41.alpha1.gite9a6ef1 +- Bump to origin upstream e9a6ef1cd4c29d45730289a497d18b19d7ba450d + related: #1211266 + +* Fri Oct 09 2015 jchaloup - 1.1.0-0.40.alpha1.git5f38cb0 +- Add missing short option for --server of kubectl +- Update unit-test-subpackage (only test-cmd.sh atm) + related: #1211266 + +* Fri Oct 09 2015 jchaloup - 1.1.0-0.39.alpha1.git5f38cb0 +- Add normalization of flags + related: #1211266 + +* Fri Oct 02 2015 jchaloup - 1.1.0-0.38.alpha1.git5f38cb0 +- Restore unit-test subpackage (not yet tested) + related: #1211266 + +* Wed Sep 30 2015 jchaloup - 1.1.0-0.37.alpha1.git5f38cb0 +- Do not unset default cluster, otherwise k8s ends with error when no cluster set + related: #1211266 + +* Wed Sep 30 2015 jchaloup - 1.1.0-0.36.alpha0.git5f38cb0 +- Bump to o4n 5f38cb0e98c9e854cafba9c7f98dafd51e955ad8 + related: #1211266 + +* Tue Sep 29 2015 jchaloup - 1.1.0-0.35.alpha1.git2695cdc +- Update git version of k8s and o4n, add macros + related: #1211266 + +* Tue Sep 29 2015 jchaloup - 1.1.0-0.34.alpha1.git2695cdc +- Built k8s from o4n tarball +- Bump to upstream 2695cdcd29a8f11ef60278758e11f4817daf3c7c + related: #1211266 + +* Tue Sep 22 2015 jchaloup - 1.1.0-0.33.alpha1.git09cf38e +- Bump to upstream 09cf38e9a80327e2d41654db277d00f19e2c84d0 + related: #1211266 + +* Thu Sep 17 2015 jchaloup - 1.1.0-0.32.alpha1.git400e685 +- Bump to upstream 400e6856b082ecf4b295568acda68d630fc000f1 + related: #1211266 + +* Wed Sep 16 2015 jchaloup - 1.1.0-0.31.gitd549fc4 +- Bump to upstream d549fc400ac3e5901bd089b40168e1e6fb17341d + related: #1211266 + +* Tue Sep 15 2015 jchaloup - 1.1.0-0.30.gitc9570e3 +- Bump to upstream c9570e34d03c6700d83f796c0125d17c5064e57d + related: #1211266 + +* Mon Sep 14 2015 jchaloup - 1.1.0-0.29.git86b4e77 +- Bump to upstream 86b4e777e1947c1bc00e422306a3ca74cbd54dbe + related: #1211266 + +* Thu Sep 10 2015 jchaloup - 1.1.0-0.28.gitf867ba3 +- Bump to upstream f867ba3ba13e3dad422efd21c74f52b9762de37e + related: #1211266 + +* Wed Sep 09 2015 jchaloup - 1.1.0-0.27.git0f4fa4e +- Bump to upstream 0f4fa4ed25ae9a9d1824fe55aeefb4d4ebfecdfd + related: #1211266 + +* Tue Sep 08 2015 jchaloup - 1.1.0-0.26.git196f58b +- Bump to upstream 196f58b9cb25a2222c7f9aacd624737910b03acb + related: #1211266 + +* Mon Sep 07 2015 jchaloup - 1.1.0-0.25.git96e0ed5 +- Bump to upstream 96e0ed5749608d4cc32f61b3674deb04c8fa90ad + related: #1211266 + +* Sat Sep 05 2015 jchaloup - 1.1.0-0.24.git2e2def3 +- Bump to upstream 2e2def36a904fe9a197da5fc70e433e2e884442f + related: #1211266 + +* Fri Sep 04 2015 jchaloup - 1.1.0-0.23.gite724a52 +- Bump to upstream e724a5210adf717f62a72162621ace1e08730c75 + related: #1211266 + +* Thu Sep 03 2015 jchaloup - 1.1.0-0.22.gitb6f2f39 +- Bump to upstream b6f2f396baec5105ff928cf61903c2c368259b21 + related: #1211266 + +* Wed Sep 02 2015 jchaloup - 1.1.0-0.21.gitb4a3698 +- Bump to upstream b4a3698faed81410468eccf9f328ca6df3d0cca3 + related: #1211266 + +* Tue Sep 01 2015 jchaloup - 1.1.0-0.20.git2f9652c +- Bump to upstream 2f9652c7f1d4b8f333c0b5c8c1270db83b913436 + related: #1211266 + +* Mon Aug 31 2015 jchaloup - 1.1.0-0.19.git66a644b +- Bump to upstream 66a644b275ede9ddb98eb3f76e8d1840cafc2147 + related: #1211266 + +* Thu Aug 27 2015 jchaloup - 1.1.0-0.18.gitab73849 +- Bump to upstream ab7384943748312f5e9294f42d42ed3983c7c96c + related: #1211266 + +* Wed Aug 26 2015 jchaloup - 1.1.0-0.17.git00e3442 +- Bump to upstream 00e34429e0242323ed34347cf0ab65b3d62b21f7 + related: #1211266 + +* Tue Aug 25 2015 jchaloup - 1.1.0-0.16.gita945785 +- Bump to upstream a945785409d5b68f3a2721d2209300edb5abf1ce + related: #1211266 + +* Mon Aug 24 2015 jchaloup - 1.1.0-0.15.git5fe7029 +- Bump to upstream 5fe7029e688e1e5873a0b95a622edda5b5156d2b + related: #1211266 + +* Fri Aug 21 2015 jchaloup - 1.1.0-0.14.gitb6f18c7 +- Bump to upstream b6f18c7ce08714c8d4f6019463879a164a41750e + related: #1211266 + +* Thu Aug 20 2015 jchaloup - 1.1.0-0.13.git44fa48e +- Bump to upstream 44fa48e5af44d3e988fa943d96a2de732d8cc666 + related: #1211266 + +* Wed Aug 19 2015 jchaloup - 1.1.0-0.12.gitb5a4a54 +- Bump to upstream b5a4a548df0cffb99bdcc3b9b9e48d4025d0541c + related: #1211266 + +* Tue Aug 18 2015 jchaloup - 1.1.0-0.11.git919c7e9 +- Bump to upstream 919c7e94e23d2dcd5bdd96896e0a7990f9ae3338 + related: #1211266 + +* Tue Aug 18 2015 jchaloup - 1.1.0-0.10.git280b66c +- Bump to upstream 280b66c9012c21e253acd4e730f8684c39ca08ec + related: #1211266 + +* Mon Aug 17 2015 jchaloup - 1.1.0-0.9.git081d9c6 +- Bump to upstream 081d9c64d25c20ec16035036536511811118173d + related: #1211266 + +* Fri Aug 14 2015 jchaloup - 1.1.0-0.8.git8dcbeba +- Bump to upstream 8dcbebae5ef6a7191d9dfb65c68833c6852a21ad + related: #1211266 + +* Thu Aug 13 2015 jchaloup - 1.1.0-0.7.git968cbbe +- Bump to upstream 968cbbee5d4964bd916ba379904c469abb53d623 + related: #1211266 + +* Wed Aug 12 2015 jchaloup - 1.1.0-0.6.gitc91950f +- Bump to upstream c91950f01cb14ad47486dfcd2fdfb4be3ee7f36b + related: #1211266 + +* Tue Aug 11 2015 jchaloup - 1.1.0-0.5.gite44c8e6 +- Bump to upstream e44c8e6661c931f7fd434911b0d3bca140e1df3a + related: #1211266 + +* Mon Aug 10 2015 jchaloup - 1.1.0-0.4.git2bfa9a1 +- Bump to upstream 2bfa9a1f98147cfdc2e9f4cf50e2c430518d91eb + related: #1243827 + +* Thu Aug 06 2015 jchaloup - 1.1.0-0.3.git4c42e13 +- Bump to upstream 4c42e1302d3b351f3cb6074d32aa420bbd45e07d +- Change import path prefix to k8s.io/kubernetes + related: #1243827 + +* Wed Aug 05 2015 jchaloup - 1.1.0-0.2.git159ba48 +- Bump to upstream 159ba489329e9f6ce422541e13f97e1166090ec8 + related: #1243827 + +* Sat Aug 01 2015 jchaloup - 1.1.0-0.1.git6129d3d +- Bump to upstream 6129d3d4eb80714286650818081a64ce2699afed + related: #1243827 + +* Fri Jul 31 2015 jchaloup - 1.0.0-0.18.gitff058a1 +- Bump to upstream ff058a1afeb63474f7a35805941f3b07c27aae0f + related: #1243827 + +* Thu Jul 30 2015 jchaloup - 1.0.0-0.17.git769230e +- Bump to upstream 769230e735993bb0bf924279a40593c147c9a6ab + related: #1243827 + +* Wed Jul 29 2015 jchaloup - 1.0.0-0.16.gitdde7222 +- Bump to upstream dde72229dc9cbbdacfb2e44b22d9d5b357027020 + related: #1243827 + +* Tue Jul 28 2015 jchaloup - 1.0.0-0.15.gitc5bffaa +- Bump to upstream c5bffaaf3166513da6259c44a5d1ba8e86bea5ce + related: #1243827 + +* Sat Jul 25 2015 jchaloup - 1.0.0-0.14.git5bd82ff +- Bump to upstream 5bd82ffe6da8f4e72e71b362635e558bfc412106 + related: #1243827 + +* Fri Jul 24 2015 jchaloup - 1.0.0-0.13.git291acd1 +- Bump to upstream 291acd1a09ac836ec7524b060a19a6498d9878dd + related: #1243827 + +* Thu Jul 23 2015 jchaloup - 1.0.0-0.12.gitfbed349 +- Bump to upstream fbed3492bfa09e59b1c423fdd7c1ecad333a06ef + related: #1243827 + +* Tue Jul 21 2015 jchaloup - 1.0.0-0.11.gitfbc85e9 +- Add runtime dependency of kubernetes-node on socat (so kubectl port-forward works on AH) + +* Tue Jul 21 2015 jchaloup - 1.0.0-0.10.gitfbc85e9 +- Update the build script for go1.5 as well +- Bump to upstream fbc85e9838f25547be94fbffeeb92a756d908ca0 + related: #1243827 + +* Mon Jul 20 2015 jchaloup - 1.0.0-0.9.git2d88675 +- Bump to upstream 2d88675f2203d316d4bac312c7ccad12991b56c2 +- Change KUBE_ETCD_SERVERS to listen on 2379 ports instead of 4001 + resolves: #1243827 +- Add kubernetes-client to provide kubectl command + resolves: #1241469 + +* Mon Jul 20 2015 jchaloup - 1.0.0-0.8.gitb2dafda +- Fix dependency and tests for go-1.5 +- with_debug off as the builds ends with error "ELFRESERVE too small: ..." + +* Sat Jul 18 2015 Eric Paris - 1.0.0-0.7.gitb2dafda +- Update apiserver binary gid + +* Fri Jul 17 2015 jchaloup - 1.0.0-0.6.gitb2dafda +- Bump to upstream b2dafdaef5aceafad503ab56254b60f80da9e980 + related: #1211266 + +* Thu Jul 16 2015 jchaloup - 1.0.0-0.5.git596a8a4 +- Bump to upstream 596a8a40d12498b5335140f50753980bfaea4f6b + related: #1211266 + +* Wed Jul 15 2015 jchaloup - 1.0.0-0.4.git6ba532b +- Bump to upstream 6ba532b218cb5f5ea3f0e8dce5395182f388536c + related: #1211266 + +* Tue Jul 14 2015 jchaloup - 1.0.0-0.3.gitc616182 +- Bump to upstream c6161824db3784e6156131307a5e94647e5557fd + related: #1211266 + +* Mon Jul 13 2015 jchaloup - 1.0.0-0.2.git2c27b1f +- Bump to upstream 2c27b1fa64f4e70f04575d1b217494f49332390e + related: #1211266 + +* Sat Jul 11 2015 jchaloup - 1.0.0-0.1.git1b37059 +- Bump to upstream 1b370599ccf271741e657335c4943cb8c7dba28b + related: #1211266 + +* Fri Jul 10 2015 jchaloup - 0.21.1-0.2.gitccc4cfc +- Bump to upstream ccc4cfc7e11e0f127ac1cea045017dd799be3c63 + related: #1211266 + +* Thu Jul 09 2015 jchaloup - 0.21.1-0.1.git41f8907 +- Update generating of man pages from md (add genmanpages.sh) +- Bump to upstream 41f89075396329cd46c58495c7d3f7e13adcaa96 + related: #1211266 + +* Wed Jul 08 2015 jchaloup - 0.20.2-0.5.git77be29e +- Bump to upstream 77be29e3da71f0a136b6aa4048b2f0575c2598e4 + related: #1211266 + +* Tue Jul 07 2015 jchaloup - 0.20.2-0.4.git639a7da +- Bump to upstream 639a7dac50a331414cc6c47083323388da0d8756 + related: #1211266 + +* Mon Jul 06 2015 jchaloup - 0.20.2-0.3.gitbb6f2f7 +- Bump to upstream bb6f2f7ad90596d624d84cc691eec0f518e90cc8 + related: #1211266 + +* Fri Jul 03 2015 jchaloup - 0.20.2-0.2.git974377b +- Bump to upstream 974377b3064ac59b6e5694bfa568d67128026171 + related: #1211266 + +* Thu Jul 02 2015 jchaloup - 0.20.2-0.1.gitef41ceb +- Bump to upstream ef41ceb3e477ceada84c5522f429f02ab0f5948e + related: #1211266 + +* Tue Jun 30 2015 jchaloup - 0.20.0-0.3.git835eded +- Bump to upstream 835eded2943dfcf13a89518715e4be842a6a3ac0 +- Generate missing man pages + related: #1211266 + +* Mon Jun 29 2015 jchaloup - 0.20.0-0.2.git1c0b765 +- Bump to upstream 1c0b765df6dabfe9bd0e20489ed3bd18e6b3bda8 + Comment out missing man pages + related: #1211266 + +* Fri Jun 26 2015 jchaloup - 0.20.0-0.1.git8ebd896 +- Bump to upstream 8ebd896351513d446d56bc5785c070d2909226a3 + related: #1211266 + +* Fri Jun 26 2015 jchaloup - 0.19.3-0.6.git712f303 +- Bump to upstream 712f303350b35e70a573f3cb19193c8ec7ee7544 + related: #1211266 + +* Thu Jun 25 2015 jchaloup - 0.19.3-0.5.git2803b86 +- Bump to upstream 2803b86a42bf187afa816a7ce14fec754cc2af51 + related: #1211266 + +* Wed Jun 24 2015 Eric Paris - 0.19.3-0.4.git5b4dc4e +- Set CAP_NET_BIND_SERVICE on the kube-apiserver so it can use 443 + +* Wed Jun 24 2015 jchaloup - 0.19.3-0.3.git5b4dc4e +- Bump to upstream 5b4dc4edaa14e1ab4e3baa19df0388fa54dab344 + pkg/cloudprovider/* packages does not conform to golang language specification + related: #1211266 + +* Tue Jun 23 2015 jchaloup - 0.19.3-0.2.gita2ce3ea +- Bump to upstream a2ce3ea5293553b1fe0db3cbc6d53bdafe061d79 + related: #1211266 + +* Mon Jun 22 2015 jchaloup - 0.19.1-0.1.gitff0546d +- Bump to upstream ff0546da4fc23598de59db9f747c535545036463 + related: #1211266 + +* Fri Jun 19 2015 jchaloup - 0.19.0-0.7.gitb2e9fed +- Bump to upstream b2e9fed3490274509506285bdba309c50afb5c39 + related: #1211266 + +* Thu Jun 18 2015 jchaloup - 0.19.0-0.6.gitf660940 +- Bump to upstream f660940dceb3fe6ffb1b14ba495a47d91b5cd910 + related: #1211266 + +* Wed Jun 17 2015 jchaloup - 0.19.0-0.5.git43889c6 +- Bump to upstream 43889c612c4d396dcd8fbf3fbd217e106eaf5bce + related: #1211266 + +* Tue Jun 16 2015 jchaloup - 0.19.0-0.4.gita8269e3 +- Bump to upstream a8269e38c9e2bf81ba18cd6420e2309745d5b0b9 + related: #1211266 + +* Sun Jun 14 2015 jchaloup - 0.19.0-0.3.git5e5c1d1 +- Bump to upstream 5e5c1d10976f2f26d356ca60ef7d0d715c9f00a2 + related: #1211266 + +* Fri Jun 12 2015 jchaloup - 0.19.0-0.2.git0ca96c3 +- Bump to upstream 0ca96c3ac8b47114169f3b716ae4521ed8c7657c + related: #1211266 + +* Thu Jun 11 2015 jchaloup - 0.19.0-0.1.git5a02fc0 +- Bump to upstream 5a02fc07d8a943132b9e68fe7169778253318487 + related: #1211266 + +* Wed Jun 10 2015 jchaloup - 0.18.2-0.3.git0dfb681 +- Bump to upstream 0dfb681ba5d5dba535895ace9d650667904b5df7 + related: #1211266 + +* Tue Jun 09 2015 jchaloup - 0.18.2-0.2.gitb68e08f +- golang-cover is not needed + +* Tue Jun 09 2015 jchaloup - 0.18.2-0.1.gitb68e08f +- Bump to upstream b68e08f55f5ae566c4ea3905d0993a8735d6d34f + related: #1211266 + +* Sat Jun 06 2015 jchaloup - 0.18.1-0.3.git0f1c4c2 +- Bump to upstream 0f1c4c25c344f70c3592040b2ef092ccdce0244f + related: #1211266 + +* Fri Jun 05 2015 jchaloup - 0.18.1-0.2.git7309e1f +- Bump to upstream 7309e1f707ea5dd08c51f803037d7d22c20e2b92 + related: #1211266 + +* Thu Jun 04 2015 jchaloup - 0.18.1-0.1.gita161edb +- Bump to upstream a161edb3960c01ff6e14813858c2eeb85910009b + related: #1211266 + +* Wed Jun 03 2015 jchaloup - 0.18.0-0.3.gitb5a91bd +- Bump to upstream b5a91bda103ed2459f933959241a2b57331747ba +- Don't run %%check section (kept only for local run). Tests are now handled via CI. + related: #1211266 + +* Tue Jun 02 2015 jchaloup - 0.18.0-0.2.git5520386 +- Bump to upstream 5520386b180d3ddc4fa7b7dfe6f52642cc0c25f3 + related: #1211266 + +* Mon Jun 01 2015 jchaloup - 0.18.0-0.1.git0bb78fe +- Bump to upstream 0bb78fe6c53ce38198cc3805c78308cdd4805ac8 + related: #1211266 + +* Fri May 29 2015 jchaloup - 0.17.1-6 +- Bump to upstream ed4898d98c46869e9cbdb44186dfdeda9ff80cc2 + related: #1211266 + +* Thu May 28 2015 jchaloup - 0.17.1-5 +- Bump to upstream 6fa2777e26559fc008eacac83eb165d25bd9a7de + related: #1211266 + +* Tue May 26 2015 jchaloup - 0.17.1-4 +- Bump to upstream 01fcb58673001e56c69e128ab57e0c3f701aeea5 + related: #1211266 + +* Mon May 25 2015 jchaloup - 0.17.1-3 +- Decompose package into master and node subpackage. + Thanks to Avesh for testing and patience. + related: #1211266 + +* Mon May 25 2015 jchaloup - 0.17.1-2 +- Bump to upstream cf7b0bdc2a41d38613ac7f8eeea91cae23553fa2 + related: #1211266 + +* Fri May 22 2015 jchaloup - 0.17.1-1 +- Bump to upstream d9d12fd3f7036c92606fc3ba9046b365212fcd70 + related: #1211266 + +* Wed May 20 2015 jchaloup - 0.17.0-12 +- Bump to upstream a76bdd97100c66a46e2b49288540dcec58a954c4 + related: #1211266 + +* Tue May 19 2015 jchaloup - 0.17.0-11 +- Bump to upstream 10339d72b66a31592f73797a9983e7c207481b22 + related: #1211266 + +* Mon May 18 2015 jchaloup - 0.17.0-10 +- Bump to upstream efb42b302d871f7217394205d84e5ae82335d786 + related: #1211266 + +* Sat May 16 2015 jchaloup - 0.17.0-9 +- Bump to upstream d51e131726b925e7088b90915e99042459b628e0 + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-8 +- Bump to upstream 1ee33ac481a14db7b90e3bbac8cec4ceea822bfb + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-7 +- Bump to upstream d3c6fb0d6a13c0177dcd67556d72963c959234ea + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-6 +- Bump to upstream f57f31783089f41c0bdca8cb87a1001ca94e1a45 + related: #1211266 + +* Thu May 14 2015 jchaloup - 0.17.0-5 +- Bump to upstream c90d381d0d5cf8ab7b8412106f5a6991d7e13c7d + related: #1211266 + +* Thu May 14 2015 jchaloup - 0.17.0-4 +- Bump to upstream 5010b2dde0f9b9eb820fe047e3b34bc9fa6324de +- Add debug info + related: #1211266 + +* Wed May 13 2015 jchaloup - 0.17.0-3 +- Bump to upstream ec19d41b63f5fe7b2c939e7738a41c0fbe65d796 + related: #1211266 + +* Tue May 12 2015 jchaloup - 0.17.0-2 +- Provide /usr/bin/kube-version-change binary + related: #1211266 + +* Tue May 12 2015 jchaloup - 0.17.0-1 +- Bump to upstream 962f10ee580eea30e5f4ea725c4e9e3743408a58 + related: #1211266 + +* Mon May 11 2015 jchaloup - 0.16.2-7 +- Bump to upstream 63182318c5876b94ac9b264d1224813b2b2ab541 + related: #1211266 + +* Fri May 08 2015 jchaloup - 0.16.2-6 +- Bump to upstream d136728df7e2694df9e082902f6239c11b0f2b00 +- Add NetworkManager as dependency for /etc/resolv.conf + related: #1211266 + +* Thu May 07 2015 jchaloup - 0.16.2-5 +- Bump to upstream ca0f678b9a0a6dc795ac7a595350d0dbe9d0ac3b + related: #1211266 + +* Wed May 06 2015 jchaloup - 0.16.2-4 +- Add docs to kubernetes-unit-test + related: #1211266 + +* Wed May 06 2015 jchaloup - 0.16.2-3 +- Bump to upstream 3a24c0e898cb3060d7905af6df275a3be562451d + related: #1211266 + +* Tue May 05 2015 jchaloup - 0.16.2-2 +- Add api and README.md to kubernetes-unit-test + related: #1211266 + +* Tue May 05 2015 jchaloup - 0.16.2-1 +- Bump to upstream 72048a824ca16c3921354197953fabecede5af47 + related: #1211266 + +* Mon May 04 2015 jchaloup - 0.16.1-2 +- Bump to upstream 1dcd80cdf3f00409d55cea1ef0e7faef0ae1d656 + related: #1211266 + +* Sun May 03 2015 jchaloup - 0.16.1-1 +- Bump to upstream 86751e8c90a3c0e852afb78d26cb6ba8cdbc37ba + related: #1211266 + +* Fri May 01 2015 jchaloup - 0.16.0-2 +- Bump to upstream 72708d74b9801989ddbdc8403fc5ba4aafb7c1ef + related: #1211266 + +* Wed Apr 29 2015 jchaloup - 0.16.0-1 +- Bump to upstream 7dcce2eeb7f28643d599c8b6a244523670d17c93 + related: #1211266 + +* Tue Apr 28 2015 jchaloup - 0.15.0-10 +- Add unit-test subpackage + related: #1211266 + +* Tue Apr 28 2015 jchaloup - 0.15.0-9 +- Bump to upstream 99fc906f78cd2bcb08536c262867fa6803f816d5 + related: #1211266 + +* Mon Apr 27 2015 jchaloup - 0.15.0-8 +- Bump to upstream 051dd96c542799dfab39184d2a7c8bacf9e88d85 + related: #1211266 + +* Fri Apr 24 2015 jchaloup - 0.15.0-7 +- Bump to upstream 9f753c2592481a226d72cea91648db8fb97f0da8 + related: #1211266 + +* Thu Apr 23 2015 jchaloup - 0.15.0-6 +- Bump to upstream cf824ae5e07965ba0b4b15ee88e08e2679f36978 + related: #1211266 + +* Tue Apr 21 2015 jchaloup - 0.15.0-5 +- Bump to upstream 21788d8e6606038a0a465c97f5240b4e66970fbb + related: #1211266 + +* Mon Apr 20 2015 jchaloup - 0.15.0-4 +- Bump to upstream eb1ea269954da2ce557f3305fa88d42e3ade7975 + related: #1211266 + +* Fri Apr 17 2015 jchaloup - 0.15.0-3 +- Obsolete cadvisor as it is integrated in kubelet + related: #1211266 + +* Wed Apr 15 2015 jchaloup - 0.15.0-0.2.git0ea87e4 +- Bump to upstream 0ea87e486407298dc1e3126c47f4076b9022fb09 + related: #1211266 + +* Tue Apr 14 2015 jchaloup - 0.15.0-0.1.gitd02139d +- Bump to upstream d02139d2b454ecc5730cc535d415c1963a7fb2aa + related: #1211266 + +* Sun Apr 12 2015 jchaloup - 0.14.2-0.2.gitd577db9 +- Bump to upstream d577db99873cbf04b8e17b78f17ec8f3a27eca30 + +* Wed Apr 08 2015 jchaloup - 0.14.2-0.1.git2719194 +- Bump to upstream 2719194154ffd38fd1613699a9dd10a00909957e + Use etcd-2.0.8 and higher + +* Tue Apr 07 2015 jchaloup - 0.14.1-0.2.gitd2f4734 +- Bump to upstream d2f473465738e6b6f7935aa704319577f5e890ba + +* Thu Apr 02 2015 jchaloup - 0.14.1-0.1.gita94ffc8 +- Bump to upstream a94ffc8625beb5e2a39edb01edc839cb8e59c444 + +* Wed Apr 01 2015 jchaloup - 0.14.0-0.2.git8168344 +- Bump to upstream 81683441b96537d4b51d146e39929b7003401cd5 + +* Tue Mar 31 2015 jchaloup - 0.14.0-0.1.git9ed8761 +- Bump to upstream 9ed87612d07f75143ac96ad90ff1ff68f13a2c67 +- Remove [B]R from devel branch until the package has stable API + +* Mon Mar 30 2015 jchaloup - 0.13.2-0.6.git8a7a127 +- Bump to upstream 8a7a127352263439e22253a58628d37a93fdaeb2 + +* Fri Mar 27 2015 jchaloup - 0.13.2-0.5.git8d94c43 +- Bump to upstream 8d94c43e705824f23791b66ad5de4ea095d5bb32 + resolves: #1205362 + +* Wed Mar 25 2015 jchaloup - 0.13.2-0.4.git455fe82 +- Bump to upstream 455fe8235be8fd9ba0ce21bf4f50a69d42e18693 + +* Mon Mar 23 2015 jchaloup - 0.13.2-0.3.gitef75888 +- Remove runtime dependency on etcd + resolves: #1202923 + +* Sun Mar 22 2015 jchaloup - 0.13.2-0.2.gitef75888 +- Bump to upstream ef758881d108bb53a128126c503689104d17f477 + +* Fri Mar 20 2015 jchaloup - 0.13.2-0.1.gita8f2cee +- Bump to upstream a8f2cee8c5418676ee33a311fad57d6821d3d29a + +* Fri Mar 13 2015 jchaloup - 0.12.0-0.9.git53b25a7 +- Bump to upstream 53b25a7890e31bdec6f2a95b32200d6cc27ae2ca + fix kube-proxy.service and kubelet + resolves: #1200919 #1200924 + +* Fri Mar 13 2015 jchaloup - 0.12.0-0.8.git39dceb1 +- Bump to upstream 39dceb13a511a83963a766a439cb386d10764310 + +* Thu Mar 12 2015 Eric Paris - 0.12.0-0.7.gita3fd0a9 +- Move from /etc/tmpfiles.d to %%{_tmpfilesdir} + resolves: #1200969 + +* Thu Mar 12 2015 jchaloup - 0.12.0-0.6.gita3fd0a9 +- Place contrib/init/systemd/tmpfiles.d/kubernetes.conf to /etc/tmpfiles.d/kubernetes.conf + +* Thu Mar 12 2015 jchaloup - 0.12.0-0.5.gita3fd0a9 +- Bump to upstream a3fd0a9fd516bb6033f32196ae97aaecf8c096b1 + +* Tue Mar 10 2015 jchaloup - 0.12.0-0.4.gita4d871a +- Bump to upstream a4d871a10086436557f804930812f2566c9d4d39 + +* Fri Mar 06 2015 jchaloup - 0.12.0-0.3.git2700871 +- Bump to upstream 2700871b049d5498167671cea6de8317099ad406 + +* Thu Mar 05 2015 jchaloup - 0.12.0-0.2.git8b627f5 +- Bump to upstream 8b627f516fd3e4f62da90d401ceb3d38de6f8077 + +* Tue Mar 03 2015 jchaloup - 0.12.0-0.1.gitecca426 +- Bump to upstream ecca42643b91a7117de8cd385b64e6bafecefd65 + +* Mon Mar 02 2015 jchaloup - 0.11.0-0.5.git6c5b390 +- Bump to upstream 6c5b390160856cd8334043344ef6e08568b0a5c9 + +* Sat Feb 28 2015 jchaloup - 0.11.0-0.4.git0fec31a +- Bump to upstream 0fec31a11edff14715a1efb27f77262a7c3770f4 + +* Fri Feb 27 2015 jchaloup - 0.11.0-0.3.git08402d7 +- Bump to upstream 08402d798c8f207a2e093de5a670c5e8e673e2de + +* Wed Feb 25 2015 jchaloup - 0.11.0-0.2.git86434b4 +- Bump to upstream 86434b4038ab87ac40219562ad420c3cc58c7c6b + +* Tue Feb 24 2015 jchaloup - 0.11.0-0.1.git754a2a8 +- Bump to upstream 754a2a8305c812121c3845d8293efdd819b6a704 + turn off integration tests until "FAILED: unexpected endpoints: + timed out waiting for the condition" problem is resolved + Adding back devel subpackage ([B]R list outdated) + +* Fri Feb 20 2015 jchaloup - 0.10.1-0.3.git4c87805 +- Bump to upstream 4c87805870b1b22e463c4bd711238ef68c77f0af + +* Tue Feb 17 2015 jchaloup - 0.10.1-0.2.git6f84bda +- Bump to upstream 6f84bdaba853872dbac69c84d3ab4b6964e85d8c + +* Tue Feb 17 2015 jchaloup - 0.10.1-0.1.git7d6130e +- Bump to upstream 7d6130edcdfabd7dd2e6a06fdc8fe5e333f07f5c + +* Sat Feb 07 2015 jchaloup - 0.9.1-0.7.gitc9c98ab +- Bump to upstream c9c98ab19eaa6f0b2ea17152c9a455338853f4d0 + Since some dependencies are broken, we can not build Kubernetes from Fedora deps. + Switching to vendored source codes until Go draft is resolved + +* Wed Feb 04 2015 jchaloup - 0.9.1-0.6.git7f5ed54 +- Bump to upstream 7f5ed541f794348ae6279414cf70523a4d5133cc + +* Tue Feb 03 2015 jchaloup - 0.9.1-0.5.git2ac6bbb +- Bump to upstream 2ac6bbb7eba7e69eac71bd9acd192cda97e67641 + +* Mon Feb 02 2015 jchaloup - 0.9.1-0.4.gite335e2d +- Bump to upstream e335e2d3e26a9a58d3b189ccf41ceb3770d1bfa9 + +* Fri Jan 30 2015 jchaloup - 0.9.1-0.3.git55793ac +- Bump to upstream 55793ac2066745f7243c666316499e1a8cf074f0 + +* Thu Jan 29 2015 jchaloup - 0.9.1-0.2.gitca6de16 +- Bump to upstream ca6de16df7762d4fc9b4ad44baa78d22e3f30742 + +* Tue Jan 27 2015 jchaloup - 0.9.1-0.1.git3623a01 +- Bump to upstream 3623a01bf0e90de6345147eef62894057fe04b29 +- update tests for etcd-2.0 + +* Thu Jan 22 2015 jchaloup - 0.8.2-571.gitb2f287c ++- Bump to upstream b2f287c259d856f4c08052a51cd7772c563aff77 + +* Thu Jan 22 2015 Eric Paris - 0.8.2-570.gitb2f287c +- patch kubelet service file to use docker.service not docker.socket + +* Wed Jan 21 2015 jchaloup - 0.8.2-0.1.git5b04640 +- Bump to upstream 5b046406a957a1e7eda7c0c86dd7a89e9c94fc5f + +* Sun Jan 18 2015 jchaloup - 0.8.0-126.0.git68298f0 +- Add some missing dependencies +- Add devel subpackage + +* Fri Jan 09 2015 Eric Paris - 0.8.0-125.0.git68298f0 +- Bump to upstream 68298f08a4980f95dfbf7b9f58bfec1808fb2670 + +* Tue Dec 16 2014 Eric Paris - 0.7.0-18.0.git52e165a +- Bump to upstream 52e165a4fd720d1703ebc31bd6660e01334227b8 + +* Mon Dec 15 2014 Eric Paris - 0.6-297.0.git5ef34bf +- Bump to upstream 5ef34bf52311901b997119cc49eff944c610081b + +* Wed Dec 03 2014 Eric Paris +- Replace patch to use old googlecode/go.net/ with BuildRequires on golang.org/x/net/ + +* Tue Dec 02 2014 Eric Paris - 0.6-4.0.git993ef88 +- Bump to upstream 993ef88eec9012b221f79abe8f2932ee97997d28 + +* Mon Dec 01 2014 Eric Paris - 0.5-235.0.git6aabd98 +- Bump to upstream 6aabd9804fb75764b70e9172774002d4febcae34 + +* Wed Nov 26 2014 Eric Paris - 0.5-210.0.gitff1e9f4 +- Bump to upstream ff1e9f4c191342c24974c030e82aceaff8ea9c24 + +* Tue Nov 25 2014 Eric Paris - 0.5-174.0.git64e07f7 +- Bump to upstream 64e07f7fe03d8692c685b09770c45f364967a119 + +* Mon Nov 24 2014 Eric Paris - 0.5-125.0.git162e498 +- Bump to upstream 162e4983b947d2f6f858ca7607869d70627f5dff + +* Fri Nov 21 2014 Eric Paris - 0.5-105.0.git3f74a1e +- Bump to upstream 3f74a1e9f56b3c3502762930c0c551ccab0557ea + +* Thu Nov 20 2014 Eric Paris - 0.5-65.0.gitc6158b8 +- Bump to upstream c6158b8aa9c40fbf1732650a8611429536466b21 +- include go-restful build requirement + +* Tue Nov 18 2014 Eric Paris - 0.5-14.0.gitdf0981b +- Bump to upstream df0981bc01c5782ad30fc45cb6f510f365737fc1 + +* Tue Nov 11 2014 Eric Paris - 0.4-680.0.git30fcf24 +- Bump to upstream 30fcf241312f6d0767c7d9305b4c462f1655f790 + +* Mon Nov 10 2014 Eric Paris - 0.4-633.0.git6c70227 +- Bump to upstream 6c70227a2eccc23966d32ea6d558ee05df46e400 + +* Fri Nov 07 2014 Eric Paris - 0.4-595.0.gitb695650 +- Bump to upstream b6956506fa2682afa93770a58ea8c7ba4b4caec1 + +* Thu Nov 06 2014 Eric Paris - 0.4-567.0.git3b1ef73 +- Bump to upstream 3b1ef739d1fb32a822a22216fb965e22cdd28e7f + +* Thu Nov 06 2014 Eric Paris - 0.4-561.0.git06633bf +- Bump to upstream 06633bf4cdc1ebd4fc848f85025e14a794b017b4 +- Make spec file more RHEL/CentOS friendly + +* Tue Nov 04 2014 Eric Paris - 0.4-0.0.git4452163 +- rebase to v0.4 +- include man pages + +* Tue Oct 14 2014 jchaloup - 0.3-0.3.git98ac8e1 +- create /var/lib/kubelet +- Use bash completions from upstream +- Bump to upstream 98ac8e178fcf1627399d659889bcb5fe25abdca4 +- all by Eric Paris + +* Mon Sep 29 2014 Jan Chaloupka - 0.3-0.2.git88fdb65 +- replace * with coresponding files +- remove dependency on gcc + +* Wed Sep 24 2014 Eric Paris - 0.1-0.4.git6ebe69a +- prefer autosetup instead of setup (revert setup change in 0-0.3.git) +https://fedoraproject.org/wiki/Autosetup_packaging_draft +- revert version number to 0.1 + +* Mon Sep 08 2014 Lokesh Mandvekar - 0-0.3.git6ebe69a +- gopath defined in golang package already +- package owns /etc/kubernetes +- bash dependency implicit +- keep buildroot/$RPM_BUILD_ROOT macros consistent +- replace with macros wherever possible +- set version, release and source tarball prep as per +https://fedoraproject.org/wiki/Packaging:SourceURL#Github + +* Mon Sep 08 2014 Eric Paris +- make services restart automatically on error + +* Sat Sep 06 2014 Eric Paris +- update to upstream +- redo build to use project scripts +- use project scripts in %%check +- rework deletion of third_party packages to easily detect changes +- run apiserver and controller-manager as non-root + +* Mon Aug 11 2014 Adam Miller +- update to upstream +- decouple the rest of third_party + +* Thu Aug 7 2014 Eric Paris +- update to head +- update package to include config files + +* Wed Jul 16 2014 Colin Walters +- Initial package diff --git a/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec.orig b/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec.orig new file mode 100644 index 000000000..fd43ef4cd --- /dev/null +++ b/kubernetes/kubernetes-1.23.1/centos/kubernetes.spec.orig @@ -0,0 +1,2282 @@ +%if 0%{?fedora} +%global with_devel 1 +%global with_bundled 0 +%global with_debug 1 +%else +%global with_devel 0 +%global with_bundled 1 +%global with_debug 0 +%endif + +%if 0%{?with_debug} +# https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12 +%global _dwz_low_mem_die_limit 0 +%else +%global debug_package %{nil} +%endif + +%global provider github +%global provider_tld com +%global project kubernetes +%global repo kubernetes +# https://github.com/kubernetes/kubernetes + +%global provider_prefix %{provider}.%{provider_tld}/%{project}/%{repo} +%global import_path k8s.io/kubernetes +%global commit fc32d2f3698e36b93322a3465f63a14e9f0eaead +%global shortcommit %(c=%{commit}; echo ${c:0:7}) + +%global con_provider github +%global con_provider_tld com +%global con_project kubernetes +%global con_repo contrib +# https://github.com/kubernetes/contrib +%global con_provider_prefix %{con_provider}.%{con_provider_tld}/%{con_project}/%{con_repo} +%global con_commit 5b445f1c53aa8d6457523526340077935f62e691 +%global con_shortcommit %(c=%{con_commit}; echo ${c:0:7}) + +%global kube_version 1.10.0 +%global kube_git_version v%{kube_version} + +# Needed otherwise "version_ldflags=$(kube::version_ldflags)" doesn't work +%global _buildshell /bin/bash +%global _checkshell /bin/bash + +############################################## +Name: kubernetes +Version: %{kube_version} +Release: 1%{?dist} +Summary: Container cluster management +License: ASL 2.0 +URL: https://%{import_path} +ExclusiveArch: x86_64 aarch64 ppc64le s390x +Source0: https://%{provider_prefix}/archive/%{commit}/%{repo}-%{shortcommit}.tar.gz +Source1: https://%{con_provider_prefix}/archive/%{con_commit}/%{con_repo}-%{con_shortcommit}.tar.gz +Source3: kubernetes-accounting.conf +Source4: kubeadm.conf + +Source33: genmanpages.sh + +Patch3: build-with-debug-info.patch +#Patch4: make-test-cmd-run-over-hyperkube-based-kubectl.patch +#Patch5: make-e2e_node-run-over-distro-bins.patch + +# ppc64le +Patch16: fix-support-for-ppc64le.patch + +Patch20: use_go_build-is-not-fully-propagated-so-make-it-fixe.patch + +# It obsoletes cadvisor but needs its source code (literally integrated) +Obsoletes: cadvisor + +# kubernetes is decomposed into master and node subpackages +# require both of them for updates +Requires: kubernetes-master = %{version}-%{release} +Requires: kubernetes-node = %{version}-%{release} + +%description +%{summary} + +%if 0%{?with_devel} +%package devel +Summary: %{summary} +BuildArch: noarch + +Provides: golang(%{import_path}/cmd/genutils) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-apiserver/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-apiserver/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-controller-manager/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-controller-manager/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-proxy/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kube-proxy/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubectl/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubelet/app) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/kubelet/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/args) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/args) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/generators/normalization) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/install) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/v1) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/conversion-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/deepcopy-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/generator) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/go-to-protobuf/protobuf) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/import-boss/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/namer) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/parser) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/set-gen/generators) = %{version}-%{release} +Provides: golang(%{import_path}/cmd/libs/go2idl/types) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation/install) = %{version}-%{release} +Provides: golang(%{import_path}/federation/apis/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/core/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/core/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/extensions/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/extensions/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_3/typed/federation/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/federation/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/federation/client/clientset_generated/federation_release_1_4/typed/federation/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/federation/pkg/federation-controller/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/admission) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/annotations) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/endpoints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/errors) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/errors/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/meta) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/meta/metatypes) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/resource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/rest/resttest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/testing/compat) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/unversioned/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/api/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apimachinery) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apimachinery/registered) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/latest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/v0) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/abac/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/apps/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authentication/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/authorization/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/autoscaling/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/v2alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/batch/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/certificates/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/componentconfig/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/extensions/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/imagepolicy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/policy/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/rbac/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apis/storage/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/audit) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/apiserver/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authenticator/bearertoken) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer/abac) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/authorizer/union) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/handlers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/auth/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/chaosclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/core/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/autoscaling/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/batch/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/authorization/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/authorization/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/autoscaling/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/autoscaling/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/batch/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/batch/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/core/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/core/v1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/extensions/v1beta1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/extensions/v1beta1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/policy/v1alpha1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/clientset_generated/release_1_4/typed/policy/v1alpha1/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/leaderelection) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/metrics/prometheus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/record) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/restclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/testing/core) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/transport) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/discovery) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/discovery/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/typed/dynamic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/adapters/internalclientset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/auth) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api/latest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/clientcmd/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/portforward) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/remotecommand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/testclient) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/client/unversioned/testclient/simple) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/aws) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/azure) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/cloudstack) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/fake) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/gce) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/mesos) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/openstack) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/ovirt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/rackspace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/cloudprovider/providers/vsphere) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/daemon) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/deployment) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/deployment/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/disruption) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/endpoint) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/framework) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/framework/informers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/garbagecollector) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/garbagecollector/metaonly) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/job) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/namespace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/petset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podautoscaler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podautoscaler/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/podgc) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replicaset/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/replication) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/route) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/scheduledjob) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/populator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/reconciler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/statusupdater) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/attachdetach/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/persistentvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/controller/volume/persistentvolume/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/conversion) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/conversion/queryparams) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider/aws) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/credentialprovider/gcp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/dns) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/fieldpath) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/fields) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/openapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/options) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/genericapiserver/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/healthz) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/httplog) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/hyperkube) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/rollout) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/set) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/templates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util/editor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/cmd/util/jsonmerge) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/metricsutil) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/resource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubectl/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/v1alpha1/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/api/v1alpha1/stats) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cadvisor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cadvisor/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/client) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/cm) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/container) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/container/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/custommetrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/dockershim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/dockertools) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/envvars) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/events) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/eviction) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/images) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/kuberuntime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/leaky) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/lifecycle) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/cni) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/cni/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hairpin) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hostport) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/hostport/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/kubenet) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/mock_network) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/network/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pleg) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/pod/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober/results) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/prober/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/qos) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/remote) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rkt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rkt/mock_os) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/rktshim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/portforward) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/remotecommand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/server/stats) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/status) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/format) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/ioutils) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/queue) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/util/sliceutils) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/populator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubelet/volumemanager/reconciler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/kubemark) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/labels) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/master) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/master/ports) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/http) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/probe/tcp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/healthcheck) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/iptables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/proxy/userspace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/evaluator/core) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/generic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/quota/install) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/authorization/subjectaccessreview) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/authorization/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/cachesize) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/certificates/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrole/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/clusterrolebinding/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/componentstatus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/configmap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/configmap/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/controller/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/daemonset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/daemonset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/deployment) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/deployment/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/endpoint) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/endpoint/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/event) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/event/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/experimental/controller/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic/registry) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/generic/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/horizontalpodautoscaler) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/horizontalpodautoscaler/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/ingress) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/ingress/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/job) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/job/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/limitrange) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/limitrange/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/namespace) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/namespace/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/networkpolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/networkpolicy/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/node/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolume/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolumeclaim) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/persistentvolumeclaim/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/petset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/petset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/pod/rest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/poddisruptionbudget) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/poddisruptionbudget/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podsecuritypolicy/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podtemplate) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/podtemplate/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rangeallocation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/registrytest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/replicaset/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/resourcequota/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/role/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/rolebinding/policybased) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/scheduledjob) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/scheduledjob/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/secret) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/secret/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/securitycontextconstraints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/securitycontextconstraints/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/allocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/allocator/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/ipallocator/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/portallocator) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/service/portallocator/controller) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/serviceaccount/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/storageclass) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/storageclass/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresource) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresource/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresourcedata) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/thirdpartyresourcedata/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/registry/tokenreview) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/protobuf) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/recognizer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/streaming) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/versioning) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/runtime/serializer/yaml) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/apparmor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/apparmor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/group) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/security/podsecuritypolicy/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontext) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/capabilities) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/group) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/seccomp) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/user) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/securitycontextconstraints/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/selection) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/ssh) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/etcdtest) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/testing/testingcert) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/etcd3) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/storagebackend) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/storagebackend/factory) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/storage/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/ui) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/async) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/bandwidth) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/cache) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/certificates) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/chmod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/chown) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/clock) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/codeinspector) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/config) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/configz) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/crlf) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/crypto) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/dbus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/diff) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/ebtables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/env) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/errors) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/exec) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flag) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flock) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flowcontrol) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/flushwriter) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/framer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/goroutinemap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/goroutinemap/exponentialbackoff) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/hash) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/homedir) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/httpstream) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/httpstream/spdy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/integer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/interrupt) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/intstr) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/io) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/iptables) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/iptables/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/jsonpath) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/keymutex) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/labels) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/limitwriter) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/logs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/maps) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/mount) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/net) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/net/sets) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/node) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/oom) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/parsers) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/pod) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/procfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/proxy) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/rand) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/replicaset) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/resourcecontainer) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/rlimit) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/runtime) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/selinux) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sets) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sets/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/slice) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/strategicpatch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/strings) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sysctl) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/sysctl/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/system) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/term) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/threading) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/uuid) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/validation) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/validation/field) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/wait) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/workqueue) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/wsstream) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/util/yaml) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version/prometheus) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/version/verflag) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/aws_ebs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/azure_dd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/azure_file) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/cephfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/cinder) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/configmap) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/downwardapi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/empty_dir) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/fc) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/flexvolume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/flocker) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/gce_pd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/git_repo) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/glusterfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/host_path) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/iscsi) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/nfs) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/quobyte) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/rbd) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/secret) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/testing) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/nestedpendingoperations) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/operationexecutor) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/types) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/util/volumehelper) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/volume/vsphere_volume) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch/json) = %{version}-%{release} +Provides: golang(%{import_path}/pkg/watch/versioned) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/cmd/kube-scheduler/app) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/cmd/kube-scheduler/app/options) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/admit) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/alwayspullimages) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/antiaffinity) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/deny) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/exec) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/imagepolicy) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/initialresources) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/limitranger) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/autoprovision) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/exists) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/namespace/lifecycle) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/persistentvolume/label) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/resourcequota) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/security) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/security/podsecuritypolicy) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/securitycontext/scdeny) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/serviceaccount) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/admission/storageclass/default) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/allow) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/keystone) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/password/passwordfile) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/basicauth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/union) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/request/x509) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/oidc) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/oidc/testing) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/tokenfile) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/tokentest) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authenticator/token/webhook) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer/rbac) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/auth/authorizer/webhook) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth/gcp) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/client/auth/oidc) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/predicates) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/priorities) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithm/priorities/util) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithmprovider) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/algorithmprovider/defaults) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/latest) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/v1) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/api/validation) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/factory) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/metrics) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/schedulercache) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/scheduler/testing) = %{version}-%{release} +Provides: golang(%{import_path}/plugin/pkg/webhook) = %{version}-%{release} + +%description devel +Libraries for building packages importing k8s.io/kubernetes. +Currently, the devel is not suitable for development. +It is meant only as a buildtime dependency for other projects. + +This package contains library source intended for +building other packages which use %{project}/%{repo}. +%endif + +############################################## +%package unit-test +Summary: %{summary} - for running unit tests + +# below Rs used for testing +Requires: golang >= 1.2-7 +Requires: etcd >= 2.0.9 +Requires: hostname +Requires: rsync +Requires: NetworkManager + +%description unit-test +%{summary} - for running unit tests + +############################################## +%package master +Summary: Kubernetes services for master host + +BuildRequires: golang >= 1.2-7 +BuildRequires: systemd +BuildRequires: rsync +BuildRequires: go-md2man +BuildRequires: go-bindata + +Requires(pre): shadow-utils +Requires: kubernetes-client = %{version}-%{release} + +# if node is installed with node, version and release must be the same +Conflicts: kubernetes-node < %{version}-%{release} +Conflicts: kubernetes-node > %{version}-%{release} + +%description master +Kubernetes services for master host + +############################################## +%package node +Summary: Kubernetes services for node host + +%if 0%{?fedora} >= 27 +Requires: (docker or docker-ce) +Suggests: docker +%else +Requires: docker +%endif +Requires: conntrack-tools + +BuildRequires: golang >= 1.2-7 +BuildRequires: systemd +BuildRequires: rsync +BuildRequires: go-md2man +BuildRequires: go-bindata + +Requires(pre): shadow-utils +Requires: socat +Requires: kubernetes-client = %{version}-%{release} + +# if master is installed with node, version and release must be the same +Conflicts: kubernetes-master < %{version}-%{release} +Conflicts: kubernetes-master > %{version}-%{release} + +%description node +Kubernetes services for node host + +############################################## +%package kubeadm +Summary: Kubernetes tool for standing up clusters +Requires: kubernetes-node = %{version}-%{release} +Requires: containernetworking-cni + +%description kubeadm +Kubernetes tool for standing up clusters + +############################################## +%package client +Summary: Kubernetes client tools + +BuildRequires: golang >= 1.2-7 +BuildRequires: go-bindata + +%description client +Kubernetes client tools like kubectl + +############################################## + +%prep +%setup -q -n %{con_repo}-%{con_commit} -T -b 1 +%setup -q -n %{repo}-%{commit} + +%if 0%{?with_debug} +%patch3 -p1 +%endif + +%patch20 -p1 + +# copy contrib folder +mkdir contrib +cp -r ../%{con_repo}-%{con_commit}/init contrib/. + +#src/k8s.io/kubernetes/pkg/util/certificates +# Patch the code to remove eliptic.P224 support +for dir in vendor/github.com/google/certificate-transparency/go/x509 pkg/util/certificates; do + if [ -d "${dir}" ]; then + pushd ${dir} + sed -i "/^[^=]*$/ s/oidNamedCurveP224/oidNamedCurveP256/g" *.go + sed -i "/^[^=]*$/ s/elliptic\.P224/elliptic.P256/g" *.go + popd + fi +done + +# Move all the code under src/k8s.io/kubernetes directory +mkdir -p src/k8s.io/kubernetes +mv $(ls | grep -v "^src$") src/k8s.io/kubernetes/. + +# Patch tests to be run over distro bins +#patch4 -p1 +#patch5 -p1 + +%ifarch ppc64le +%patch16 -p1 +%endif + +############### + +%build +pushd src/k8s.io/kubernetes/ +export KUBE_GIT_TREE_STATE="clean" +export KUBE_GIT_COMMIT=%{commit} +export KUBE_GIT_VERSION=%{kube_git_version} +export KUBE_EXTRA_GOPATH=$(pwd)/Godeps/_workspace + +# https://bugzilla.redhat.com/show_bug.cgi?id=1392922#c1 +%ifarch ppc64le +export GOLDFLAGS='-linkmode=external' +%endif +make WHAT="--use_go_build cmd/hyperkube cmd/kube-apiserver cmd/kubeadm" + +# convert md to man +./hack/generate-docs.sh || true +pushd docs +pushd admin +cp kube-apiserver.md kube-controller-manager.md kube-proxy.md kube-scheduler.md kubelet.md .. +popd +cp %{SOURCE33} genmanpages.sh +bash genmanpages.sh +popd +popd + +%install +pushd src/k8s.io/kubernetes/ +. hack/lib/init.sh +kube::golang::setup_env + +%ifarch ppc64le +output_path="_output/local/go/bin" +%else +output_path="${KUBE_OUTPUT_BINPATH}/$(kube::golang::host_platform)" +%endif + +install -m 755 -d %{buildroot}%{_bindir} + +echo "+++ INSTALLING hyperkube" +install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/hyperkube + +echo "+++ INSTALLING kube-apiserver" +install -p -m 754 -t %{buildroot}%{_bindir} ${output_path}/kube-apiserver + +echo "+++ INSTALLING kubeadm" +install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/kubeadm +install -d -m 0755 %{buildroot}/%{_sysconfdir}/systemd/system/kubelet.service.d +install -p -m 0644 -t %{buildroot}/%{_sysconfdir}/systemd/system/kubelet.service.d %{SOURCE4} + +binaries=(kube-controller-manager kube-scheduler kube-proxy kubelet kubectl) +for bin in "${binaries[@]}"; do + echo "+++ HARDLINKING ${bin} to hyperkube" + ln %{buildroot}%{_bindir}/hyperkube %{buildroot}%{_bindir}/${bin} +done + +# install the bash completion +install -d -m 0755 %{buildroot}%{_datadir}/bash-completion/completions/ +%{buildroot}%{_bindir}/kubectl completion bash > %{buildroot}%{_datadir}/bash-completion/completions/kubectl + +# install config files +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name} +install -m 644 -t %{buildroot}%{_sysconfdir}/%{name} contrib/init/systemd/environ/* + +# install service files +install -d -m 0755 %{buildroot}%{_unitdir} +install -m 0644 -t %{buildroot}%{_unitdir} contrib/init/systemd/*.service + +# install manpages +install -d %{buildroot}%{_mandir}/man1 +install -p -m 644 docs/man/man1/* %{buildroot}%{_mandir}/man1 +rm %{buildroot}%{_mandir}/man1/cloud-controller-manager.* +# from k8s tarball copied docs/man/man1/*.1 + +# install the place the kubelet defaults to put volumes +install -d %{buildroot}%{_sharedstatedir}/kubelet + +# place contrib/init/systemd/tmpfiles.d/kubernetes.conf to /usr/lib/tmpfiles.d/kubernetes.conf +install -d -m 0755 %{buildroot}%{_tmpfilesdir} +install -p -m 0644 -t %{buildroot}/%{_tmpfilesdir} contrib/init/systemd/tmpfiles.d/kubernetes.conf +mkdir -p %{buildroot}/run +install -d -m 0755 %{buildroot}/run/%{name}/ + +# enable CPU and Memory accounting +install -d -m 0755 %{buildroot}/%{_sysconfdir}/systemd/system.conf.d +install -p -m 0644 -t %{buildroot}/%{_sysconfdir}/systemd/system.conf.d %{SOURCE3} + +# source codes for building projects +%if 0%{?with_devel} +install -d -p %{buildroot}/%{gopath}/src/%{import_path}/ +echo "%%dir %%{gopath}/src/%%{import_path}/." >> devel.file-list +# find all *.go but no *_test.go files and generate devel.file-list +for file in $(find . -iname "*.go" \! -iname "*_test.go") ; do + echo "%%dir %%{gopath}/src/%%{import_path}/$(dirname $file)" >> devel.file-list + install -d -p %{buildroot}/%{gopath}/src/%{import_path}/$(dirname $file) + cp -pav $file %{buildroot}/%{gopath}/src/%{import_path}/$file + echo "%%{gopath}/src/%%{import_path}/$file" >> devel.file-list +done +%endif + +%if 0%{?with_devel} +sort -u -o devel.file-list devel.file-list +%endif + +popd + +%if 0%{?with_devel} +mv src/k8s.io/kubernetes/devel.file-list . +%endif + +mv src/k8s.io/kubernetes/*.md . +mv src/k8s.io/kubernetes/LICENSE . + + +# place files for unit-test rpm +install -d -m 0755 %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/ +# basically, everything from the root directory is needed +# unit-tests needs source code +# integration tests needs docs and other files +# test-cmd.sh atm needs cluster, examples and other +cp -a src %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/ +rm -rf %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/src/k8s.io/kubernetes/_output +cp -a *.md %{buildroot}%{_sharedstatedir}/kubernetes-unit-test/src/k8s.io/kubernetes/ + +%check +# Fedora, RHEL7 and CentOS are tested via unit-test subpackage +if [ 1 != 1 ]; then +echo "******Testing the commands*****" +hack/test-cmd.sh +echo "******Benchmarking kube********" +hack/benchmark-go.sh + +# In Fedora 20 and RHEL7 the go cover tools isn't available correctly +%if 0%{?fedora} >= 21 +echo "******Testing the go code******" +hack/test-go.sh +echo "******Testing integration******" +hack/test-integration.sh --use_go_build +%endif +fi + +############################################## +%files +# empty as it depends on master and node + +############################################## +%files master +%license LICENSE +%doc *.md +%{_mandir}/man1/kube-apiserver.1* +%{_mandir}/man1/kube-controller-manager.1* +%{_mandir}/man1/kube-scheduler.1* +%attr(754, -, kube) %caps(cap_net_bind_service=ep) %{_bindir}/kube-apiserver +%{_bindir}/kube-controller-manager +%{_bindir}/kube-scheduler +%{_bindir}/hyperkube +%{_unitdir}/kube-apiserver.service +%{_unitdir}/kube-controller-manager.service +%{_unitdir}/kube-scheduler.service +%dir %{_sysconfdir}/%{name} +%config(noreplace) %{_sysconfdir}/%{name}/apiserver +%config(noreplace) %{_sysconfdir}/%{name}/scheduler +%config(noreplace) %{_sysconfdir}/%{name}/config +%config(noreplace) %{_sysconfdir}/%{name}/controller-manager +%{_tmpfilesdir}/kubernetes.conf +%verify(not size mtime md5) %attr(755, kube,kube) %dir /run/%{name} + +############################################## +%files node +%license LICENSE +%doc *.md +%{_mandir}/man1/kubelet.1* +%{_mandir}/man1/kube-proxy.1* +%{_bindir}/kubelet +%{_bindir}/kube-proxy +%{_bindir}/hyperkube +%{_unitdir}/kube-proxy.service +%{_unitdir}/kubelet.service +%dir %{_sharedstatedir}/kubelet +%dir %{_sysconfdir}/%{name} +%config(noreplace) %{_sysconfdir}/%{name}/config +%config(noreplace) %{_sysconfdir}/%{name}/kubelet +%config(noreplace) %{_sysconfdir}/%{name}/proxy +%config(noreplace) %{_sysconfdir}/systemd/system.conf.d/kubernetes-accounting.conf +%{_tmpfilesdir}/kubernetes.conf +%verify(not size mtime md5) %attr(755, kube,kube) %dir /run/%{name} + +############################################## +%files kubeadm +%license LICENSE +%doc *.md +%{_mandir}/man1/kubeadm.1* +%{_mandir}/man1/kubeadm-* +%{_bindir}/kubeadm +%dir %{_sysconfdir}/systemd/system/kubelet.service.d +%config(noreplace) %{_sysconfdir}/systemd/system/kubelet.service.d/kubeadm.conf + +############################################## +%files client +%license LICENSE +%doc *.md +%{_mandir}/man1/kubectl.1* +%{_mandir}/man1/kubectl-* +%{_bindir}/kubectl +%{_bindir}/hyperkube +%{_datadir}/bash-completion/completions/kubectl + +############################################## +%files unit-test +%{_sharedstatedir}/kubernetes-unit-test/ + +%if 0%{?with_devel} +%files devel -f devel.file-list +%doc *.md +%dir %{gopath}/src/k8s.io +%endif + +############################################## + +%pre master +getent group kube >/dev/null || groupadd -r kube +getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \ + -c "Kubernetes user" kube + +%post master +%systemd_post kube-apiserver kube-scheduler kube-controller-manager + +%preun master +%systemd_preun kube-apiserver kube-scheduler kube-controller-manager + +%postun master +%systemd_postun + + +%pre node +getent group kube >/dev/null || groupadd -r kube +getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \ + -c "Kubernetes user" kube + +%post node +%systemd_post kubelet kube-proxy +# If accounting is not currently enabled systemd reexec +if [[ `systemctl show docker kubelet | grep -q -e CPUAccounting=no -e MemoryAccounting=no; echo $?` -eq 0 ]]; then + systemctl daemon-reexec +fi + +%preun node +%systemd_preun kubelet kube-proxy + +%postun node +%systemd_postun + +############################################ +%changelog +* Tue Mar 27 2018 Spyros Trigazis - 1.10.0-1 +- Bump to upstream v1.10.0 + +* Thu Mar 22 2018 Spyros Trigazis - 1.9.6-1 +- Bump to upstream v1.9.6 + +* Tue Mar 20 2018 Jan Chaloupka - 1.9.5-1 +- Bump to upstream v1.9.5 + resolves: #1554420 + +* Sun Feb 11 2018 Spyros Trigazis - 1.9.3-1 +- Bump to upstream v1.9.3 + +* Fri Feb 09 2018 Jan Chaloupka - 1.9.1-5 +- Add --fail-swap-on=false flag to the /etc/kubernetes/kubelet + resolves: #1542476 + +* Thu Feb 08 2018 Igor Gnatenko - 1.9.1-4 +- Escape macro in %%changelog + +* Wed Feb 07 2018 Fedora Release Engineering - 1.9.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Jan 15 2018 Jan Chaloupka - 1.9.1-2 +- If docker is not available, try docker-ce instead (use boolean dependencies) + resolves: #1534508 + +* Fri Jan 12 2018 Spyros Trigazis - 1.9.1-1 +- Update to upstream v1.9.1 + resolves #1533794 + +* Tue Oct 24 2017 Jan Chaloupka - 1.8.1-1 +- Update to upstream v1.8.1 + resolves: #1497135 + +* Mon Oct 02 2017 Jan Chaloupka - 1.8.0-1 +- Update to upstream v1.8.0 + related: #1497625 + +* Mon Oct 02 2017 Jan Chaloupka - 1.7.7-1 +- Update to upstream v1.7.7 + resolves: #1497625 + +* Mon Sep 18 2017 Jan Chaloupka - 1.7.6-1 +- Update to upstream v1.7.6 + resolves: #1492551 + +* Mon Sep 11 2017 Jan Chaloupka - 1.7.5-1 +- Update to upstream v1.7.5 + resolves: #1490316 + +* Fri Aug 18 2017 Jan Chaloupka - 1.7.4-1 +- Fix the version + related: #1482874 + +* Fri Aug 18 2017 Jan Chaloupka - 1.7.3-2 +- Update to upstream v1.7.4 + resolves: #1482874 + +* Tue Aug 08 2017 Jan Chaloupka - 1.7.3-1 +- Update to upstream v1.7.3 + resolves: #1479685 + +* Thu Aug 03 2017 Fedora Release Engineering - 1.7.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Sun Jul 30 2017 Florian Weimer - 1.7.2-3 +- Rebuild with binutils fix for ppc64le (#1475636) + +* Wed Jul 26 2017 Fedora Release Engineering - 1.7.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jan Chaloupka - 1.7.2-1 +- Update to upstream v1.7.2 + +* Mon Jul 24 2017 Jan Chaloupka - 1.7.1-2 +- Sync kubeadm.conf with upstream service configuration (set Restart,StartLimitInterval,RestartSec) + +* Fri Jul 14 2017 Jan Chaloupka - 1.7.1-1 +- Update to upstream v1.7.1 + resolves: #1471767 + +* Sat Jul 08 2017 Jan Chaloupka - 1.6.7-1 +- Update to upstream v1.6.7 + resolves: #1468823 + resolves: #1468752 + +* Fri May 19 2017 Timothy St. Clair - 1.6.4-1 +- Add kubeadm subpackage to enable upstream deployments + +* Thu May 18 2017 Jan Chaloupka - 1.6.3-1 +- Update to upstream v1.6.3 + resolves: #1452101 + +* Fri May 12 2017 Jan Chaloupka - 1.6.2-2 +- Extend archs with s390x + resolves: #1400000 + +* Tue May 02 2017 Jan Chaloupka - 1.6.2-1 +- Update to upstream v1.6.2 + resolves: #1447338 + +* Tue Apr 11 2017 Jan Chaloupka - 1.6.1-1 +- Update to upstream v1.6.1 + related: #1422889 + +* Fri Mar 31 2017 Jan Chaloupka - 1.5.6-1 +- Update to upstream v1.5.6 + related: #1422889 + +* Mon Mar 27 2017 Jan Chaloupka - 1.5.5-4 +- Update to upstream v1.5.5 + related: #1422889 + +* Mon Mar 27 2017 Jan Chaloupka - 1.5.4-3 +- re-enable debug-info + related: #1422889 + +* Thu Mar 09 2017 Jan Chaloupka - 1.5.4-2 +- Bump to upstream 7243c69eb523aa4377bce883e7c0dd76b84709a1 + related: #1422889 + +* Thu Feb 16 2017 Jan Chaloupka - 1.5.3-1 +- Update to upstream v1.5.3 + resolves: #1422889 + +* Fri Feb 10 2017 Fedora Release Engineering - 1.5.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 18 2017 Jan Chaloupka - 1.5.2-2 +- fix rootScopeNaming generate selfLink + resolves: #1413997 + +* Fri Jan 13 2017 Jan Chaloupka - 1.5.2-1 +- Bump version as well + related: #1412996 + +* Fri Jan 13 2017 Jan Chaloupka - 1.5.1-2 +- Bump to upstream 1.5.2 + resolves: #1412996 + +* Thu Jan 05 2017 Jan Chaloupka - 1.5.1-1 +- Bump to upstream 1.5.1 + resolves: #1410186 + +* Wed Jan 04 2017 Jan Chaloupka - 1.4.7-2 +- Generate the md files before they are converted to man pages + resolves: #1409943 + +* Mon Dec 12 2016 Jan Chaloupka - 1.4.7-1 +- Bump to upstream v1.4.7 + resolves: #1403823 + New conntrack-tools dependency of kube-proxy + Build kubernetes on ppc64le with linkmode=external + resolves: #1392922 + +* Mon Nov 14 2016 jchaloup - 1.4.5-3 +- Patch unit-test subpackage to run tests over k8s distro binaries + +* Wed Nov 09 2016 jchaloup - 1.4.5-2 +- Add missing if devel around generated devel.file-list + related: #1390074 + +* Tue Nov 08 2016 jchaloup - 1.4.5-1 +- Bump to upstream v1.4.5 (flip back to upstream based Kubernetes) + related: #1390074 + +* Mon Oct 31 2016 jchaloup - 1.4.0-0.1.beta3.git52492b4 +- Update to origin v1.4.0-alpha.0 (ppc64le and arm unbuildable with the current golang version) + resolves: #1390074 + +* Mon Oct 24 2016 jchaloup - 1.3.0-0.4.git52492b4 +- Update to origin v1.3.1 + resolves: #1388092 + +* Thu Sep 08 2016 jchaloup - 1.3.0-0.3.rc1.git507d3a7 +- Update to origin v1.3.0-rc1 + resolves: #1374361 + +* Thu Aug 11 2016 Dennis Gilmore -1.3.0-0.2.git4a3f9c5 +- enable armv7hl and aarch64 + +* Tue Aug 09 2016 jchaloup - 1.3.0-0.1.git4a3f9c5 +- Update to origin v1.3.0-alpha.3 + resolves: #1365601 + +* Thu Jul 21 2016 Fedora Release Engineering - 1.2.0-0.27.git4a3f9c5 +- https://fedoraproject.org/wiki/Changes/golang1.7 + +* Sun Jul 17 2016 jchaloup - 1.2.0-0.26.git4a3f9c5 +- Update to origin v1.2.1 + resolves: #1357261 + +* Wed Jul 13 2016 jchaloup - 1.2.0-0.25.git4a3f9c5 +- Enable CPU and Memory accounting on a node + +* Wed Jun 29 2016 jchaloup - 1.2.0-0.24.git4a3f9c5 +- Be more verbose about devel subpackage + resolves: #1269449 + +* Tue Jun 28 2016 jchaloup - 1.2.0-0.23.git4a3f9c5 +- Own /run/kubernetes directory + resolves: #1264699 + +* Sat May 28 2016 jchaloup - 1.2.0-0.22.git4a3f9c5 +- Bump to origin v1.2.0 + resolves: #1340643 + +* Wed May 04 2016 jchaloup - 1.2.0-0.21.git4a3f9c5 +- Extend uni-test subpackage to run other tests + +* Mon Apr 25 2016 jchaloup - 1.2.0-0.20.git4a3f9c5 +- Update support for ppc64le to use go compiler + related: #1306214 + +* Thu Apr 21 2016 jchaloup - 1.2.0-0.19.git4a3f9c5 +- Fix support for ppc64le + related: #1306214 + +* Tue Apr 19 2016 jchaloup - 1.2.0-0.18.git4a3f9c5 +- Bump to origin v1.1.6 + resolves: #1328357 + +* Mon Apr 11 2016 jchaloup - 1.2.0-0.17.alpha6.git4a3f9c5 +- Don't disable extensions/v1beta1 by default to conform with upstream documentation + +* Wed Mar 30 2016 jchaloup - 1.2.0-0.16.alpha6.git4a3f9c5 + Update to origin's v1.1.5 + Build on ppc64le as well + resolves: #1306214 + +* Tue Mar 08 2016 jchaloup - 1.2.0-0.15.alpha6.gitf0cd09a +- hyperkube.server: don't parse args for any command + +* Fri Mar 04 2016 jchaloup - 1.2.0-0.14.alpha6.gitf0cd09a +- Disable extensions/v1beta1 implicitly + +* Tue Mar 01 2016 jchaloup - 1.2.0-0.13.alpha6.gitf0cd09a +- Hyperkube checks flags of individual commands/servers even if it does not define their flags. + Thus resulting in 'uknown shorthand flag' error + +* Mon Feb 29 2016 jchaloup - 1.2.0-0.12.alpha6.gitf0cd09a +- Disable v1beta3 +- hyperkube-kubectl-dont shift os.Args + +* Fri Feb 26 2016 jchaloup - 1.2.0-0.11.alpha6.gitf0cd09a +- add kube- prefix to controller-manager, proxy and scheduler + +* Fri Feb 26 2016 jchaloup - 1.2.0-0.10.alpha6.gitf0cd09a +- Hardlink kube-controller-manager, kuber-scheduler, kubectl, kubelet and kube-proxy into hyperkube +- Keep kube-apiserver binary as it is (it has different permission and capabilities) + +* Thu Feb 25 2016 jchaloup - 1.2.0-0.9.alpha6.gitf0cd09a +- Fix Content-Type of docker client response + resolves: #1311861 + +* Mon Feb 22 2016 Fedora Release Engineering - 1.2.0-0.8.alpha6.gitf0cd09a +- https://fedoraproject.org/wiki/Changes/golang1.6 + +* Mon Feb 22 2016 jchaloup - 1.2.0-0.7.alpha6.git4c8e6f4 +- Bump to origin 1.1.3 + kube-version-change command replaced with kubectl convert (check out docs/admin/cluster-management.md) + related: 1295066 + +* Thu Feb 04 2016 Fedora Release Engineering - 1.2.0-0.6.alpha1.git4c8e6f4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jan 21 2016 jchaloup - 1.2.0-0.5.alpha1.git4c8e6f4 +- Bump to upstream e1d9873c1d5711b83fd3dd7eefe83a88ceb92c08 + related: #1291860 + +* Thu Jan 07 2016 jchaloup - 1.2.0-0.4.alpha1.git4c8e6f4 +- Move definition of all version, git and commit macros at one place + resolves: #1291860 + +* Fri Jan 01 2016 jchaloup - 1.2.0-0.3.alpha1.git4c8e6f4 +- Bump to upstream bf56e235826baded1772fb340266b8419c3e8f30 + Rebase to origin's "v1.1.0.1 - Security Update to v1.1" release + resolves: #1295066 + +* Thu Nov 26 2015 jchaloup - 1.2.0-0.2.alpha1.git4c8e6f4 +- Bump to origin upstream a41c9ff38d52fd508481c3c2bac13d52871fde02 +- Build kubernetes from origin's Godeps using hack/build-go.sh + origin's Godeps = kubernetes upstream + additional patches + +* Tue Oct 20 2015 jchaloup - 1.2.0-0.1.alpha1.git4c8e6f4 +- Bump to upstream 403de3874fba420fd096f2329b45fe2f5ae97e46 + related: #1211266 + +* Wed Oct 14 2015 jchaloup - 1.1.0-0.41.alpha1.gite9a6ef1 +- Bump to origin upstream e9a6ef1cd4c29d45730289a497d18b19d7ba450d + related: #1211266 + +* Fri Oct 09 2015 jchaloup - 1.1.0-0.40.alpha1.git5f38cb0 +- Add missing short option for --server of kubectl +- Update unit-test-subpackage (only test-cmd.sh atm) + related: #1211266 + +* Fri Oct 09 2015 jchaloup - 1.1.0-0.39.alpha1.git5f38cb0 +- Add normalization of flags + related: #1211266 + +* Fri Oct 02 2015 jchaloup - 1.1.0-0.38.alpha1.git5f38cb0 +- Restore unit-test subpackage (not yet tested) + related: #1211266 + +* Wed Sep 30 2015 jchaloup - 1.1.0-0.37.alpha1.git5f38cb0 +- Do not unset default cluster, otherwise k8s ends with error when no cluster set + related: #1211266 + +* Wed Sep 30 2015 jchaloup - 1.1.0-0.36.alpha0.git5f38cb0 +- Bump to o4n 5f38cb0e98c9e854cafba9c7f98dafd51e955ad8 + related: #1211266 + +* Tue Sep 29 2015 jchaloup - 1.1.0-0.35.alpha1.git2695cdc +- Update git version of k8s and o4n, add macros + related: #1211266 + +* Tue Sep 29 2015 jchaloup - 1.1.0-0.34.alpha1.git2695cdc +- Built k8s from o4n tarball +- Bump to upstream 2695cdcd29a8f11ef60278758e11f4817daf3c7c + related: #1211266 + +* Tue Sep 22 2015 jchaloup - 1.1.0-0.33.alpha1.git09cf38e +- Bump to upstream 09cf38e9a80327e2d41654db277d00f19e2c84d0 + related: #1211266 + +* Thu Sep 17 2015 jchaloup - 1.1.0-0.32.alpha1.git400e685 +- Bump to upstream 400e6856b082ecf4b295568acda68d630fc000f1 + related: #1211266 + +* Wed Sep 16 2015 jchaloup - 1.1.0-0.31.gitd549fc4 +- Bump to upstream d549fc400ac3e5901bd089b40168e1e6fb17341d + related: #1211266 + +* Tue Sep 15 2015 jchaloup - 1.1.0-0.30.gitc9570e3 +- Bump to upstream c9570e34d03c6700d83f796c0125d17c5064e57d + related: #1211266 + +* Mon Sep 14 2015 jchaloup - 1.1.0-0.29.git86b4e77 +- Bump to upstream 86b4e777e1947c1bc00e422306a3ca74cbd54dbe + related: #1211266 + +* Thu Sep 10 2015 jchaloup - 1.1.0-0.28.gitf867ba3 +- Bump to upstream f867ba3ba13e3dad422efd21c74f52b9762de37e + related: #1211266 + +* Wed Sep 09 2015 jchaloup - 1.1.0-0.27.git0f4fa4e +- Bump to upstream 0f4fa4ed25ae9a9d1824fe55aeefb4d4ebfecdfd + related: #1211266 + +* Tue Sep 08 2015 jchaloup - 1.1.0-0.26.git196f58b +- Bump to upstream 196f58b9cb25a2222c7f9aacd624737910b03acb + related: #1211266 + +* Mon Sep 07 2015 jchaloup - 1.1.0-0.25.git96e0ed5 +- Bump to upstream 96e0ed5749608d4cc32f61b3674deb04c8fa90ad + related: #1211266 + +* Sat Sep 05 2015 jchaloup - 1.1.0-0.24.git2e2def3 +- Bump to upstream 2e2def36a904fe9a197da5fc70e433e2e884442f + related: #1211266 + +* Fri Sep 04 2015 jchaloup - 1.1.0-0.23.gite724a52 +- Bump to upstream e724a5210adf717f62a72162621ace1e08730c75 + related: #1211266 + +* Thu Sep 03 2015 jchaloup - 1.1.0-0.22.gitb6f2f39 +- Bump to upstream b6f2f396baec5105ff928cf61903c2c368259b21 + related: #1211266 + +* Wed Sep 02 2015 jchaloup - 1.1.0-0.21.gitb4a3698 +- Bump to upstream b4a3698faed81410468eccf9f328ca6df3d0cca3 + related: #1211266 + +* Tue Sep 01 2015 jchaloup - 1.1.0-0.20.git2f9652c +- Bump to upstream 2f9652c7f1d4b8f333c0b5c8c1270db83b913436 + related: #1211266 + +* Mon Aug 31 2015 jchaloup - 1.1.0-0.19.git66a644b +- Bump to upstream 66a644b275ede9ddb98eb3f76e8d1840cafc2147 + related: #1211266 + +* Thu Aug 27 2015 jchaloup - 1.1.0-0.18.gitab73849 +- Bump to upstream ab7384943748312f5e9294f42d42ed3983c7c96c + related: #1211266 + +* Wed Aug 26 2015 jchaloup - 1.1.0-0.17.git00e3442 +- Bump to upstream 00e34429e0242323ed34347cf0ab65b3d62b21f7 + related: #1211266 + +* Tue Aug 25 2015 jchaloup - 1.1.0-0.16.gita945785 +- Bump to upstream a945785409d5b68f3a2721d2209300edb5abf1ce + related: #1211266 + +* Mon Aug 24 2015 jchaloup - 1.1.0-0.15.git5fe7029 +- Bump to upstream 5fe7029e688e1e5873a0b95a622edda5b5156d2b + related: #1211266 + +* Fri Aug 21 2015 jchaloup - 1.1.0-0.14.gitb6f18c7 +- Bump to upstream b6f18c7ce08714c8d4f6019463879a164a41750e + related: #1211266 + +* Thu Aug 20 2015 jchaloup - 1.1.0-0.13.git44fa48e +- Bump to upstream 44fa48e5af44d3e988fa943d96a2de732d8cc666 + related: #1211266 + +* Wed Aug 19 2015 jchaloup - 1.1.0-0.12.gitb5a4a54 +- Bump to upstream b5a4a548df0cffb99bdcc3b9b9e48d4025d0541c + related: #1211266 + +* Tue Aug 18 2015 jchaloup - 1.1.0-0.11.git919c7e9 +- Bump to upstream 919c7e94e23d2dcd5bdd96896e0a7990f9ae3338 + related: #1211266 + +* Tue Aug 18 2015 jchaloup - 1.1.0-0.10.git280b66c +- Bump to upstream 280b66c9012c21e253acd4e730f8684c39ca08ec + related: #1211266 + +* Mon Aug 17 2015 jchaloup - 1.1.0-0.9.git081d9c6 +- Bump to upstream 081d9c64d25c20ec16035036536511811118173d + related: #1211266 + +* Fri Aug 14 2015 jchaloup - 1.1.0-0.8.git8dcbeba +- Bump to upstream 8dcbebae5ef6a7191d9dfb65c68833c6852a21ad + related: #1211266 + +* Thu Aug 13 2015 jchaloup - 1.1.0-0.7.git968cbbe +- Bump to upstream 968cbbee5d4964bd916ba379904c469abb53d623 + related: #1211266 + +* Wed Aug 12 2015 jchaloup - 1.1.0-0.6.gitc91950f +- Bump to upstream c91950f01cb14ad47486dfcd2fdfb4be3ee7f36b + related: #1211266 + +* Tue Aug 11 2015 jchaloup - 1.1.0-0.5.gite44c8e6 +- Bump to upstream e44c8e6661c931f7fd434911b0d3bca140e1df3a + related: #1211266 + +* Mon Aug 10 2015 jchaloup - 1.1.0-0.4.git2bfa9a1 +- Bump to upstream 2bfa9a1f98147cfdc2e9f4cf50e2c430518d91eb + related: #1243827 + +* Thu Aug 06 2015 jchaloup - 1.1.0-0.3.git4c42e13 +- Bump to upstream 4c42e1302d3b351f3cb6074d32aa420bbd45e07d +- Change import path prefix to k8s.io/kubernetes + related: #1243827 + +* Wed Aug 05 2015 jchaloup - 1.1.0-0.2.git159ba48 +- Bump to upstream 159ba489329e9f6ce422541e13f97e1166090ec8 + related: #1243827 + +* Sat Aug 01 2015 jchaloup - 1.1.0-0.1.git6129d3d +- Bump to upstream 6129d3d4eb80714286650818081a64ce2699afed + related: #1243827 + +* Fri Jul 31 2015 jchaloup - 1.0.0-0.18.gitff058a1 +- Bump to upstream ff058a1afeb63474f7a35805941f3b07c27aae0f + related: #1243827 + +* Thu Jul 30 2015 jchaloup - 1.0.0-0.17.git769230e +- Bump to upstream 769230e735993bb0bf924279a40593c147c9a6ab + related: #1243827 + +* Wed Jul 29 2015 jchaloup - 1.0.0-0.16.gitdde7222 +- Bump to upstream dde72229dc9cbbdacfb2e44b22d9d5b357027020 + related: #1243827 + +* Tue Jul 28 2015 jchaloup - 1.0.0-0.15.gitc5bffaa +- Bump to upstream c5bffaaf3166513da6259c44a5d1ba8e86bea5ce + related: #1243827 + +* Sat Jul 25 2015 jchaloup - 1.0.0-0.14.git5bd82ff +- Bump to upstream 5bd82ffe6da8f4e72e71b362635e558bfc412106 + related: #1243827 + +* Fri Jul 24 2015 jchaloup - 1.0.0-0.13.git291acd1 +- Bump to upstream 291acd1a09ac836ec7524b060a19a6498d9878dd + related: #1243827 + +* Thu Jul 23 2015 jchaloup - 1.0.0-0.12.gitfbed349 +- Bump to upstream fbed3492bfa09e59b1c423fdd7c1ecad333a06ef + related: #1243827 + +* Tue Jul 21 2015 jchaloup - 1.0.0-0.11.gitfbc85e9 +- Add runtime dependency of kubernetes-node on socat (so kubectl port-forward works on AH) + +* Tue Jul 21 2015 jchaloup - 1.0.0-0.10.gitfbc85e9 +- Update the build script for go1.5 as well +- Bump to upstream fbc85e9838f25547be94fbffeeb92a756d908ca0 + related: #1243827 + +* Mon Jul 20 2015 jchaloup - 1.0.0-0.9.git2d88675 +- Bump to upstream 2d88675f2203d316d4bac312c7ccad12991b56c2 +- Change KUBE_ETCD_SERVERS to listen on 2379 ports instead of 4001 + resolves: #1243827 +- Add kubernetes-client to provide kubectl command + resolves: #1241469 + +* Mon Jul 20 2015 jchaloup - 1.0.0-0.8.gitb2dafda +- Fix dependency and tests for go-1.5 +- with_debug off as the builds ends with error "ELFRESERVE too small: ..." + +* Sat Jul 18 2015 Eric Paris - 1.0.0-0.7.gitb2dafda +- Update apiserver binary gid + +* Fri Jul 17 2015 jchaloup - 1.0.0-0.6.gitb2dafda +- Bump to upstream b2dafdaef5aceafad503ab56254b60f80da9e980 + related: #1211266 + +* Thu Jul 16 2015 jchaloup - 1.0.0-0.5.git596a8a4 +- Bump to upstream 596a8a40d12498b5335140f50753980bfaea4f6b + related: #1211266 + +* Wed Jul 15 2015 jchaloup - 1.0.0-0.4.git6ba532b +- Bump to upstream 6ba532b218cb5f5ea3f0e8dce5395182f388536c + related: #1211266 + +* Tue Jul 14 2015 jchaloup - 1.0.0-0.3.gitc616182 +- Bump to upstream c6161824db3784e6156131307a5e94647e5557fd + related: #1211266 + +* Mon Jul 13 2015 jchaloup - 1.0.0-0.2.git2c27b1f +- Bump to upstream 2c27b1fa64f4e70f04575d1b217494f49332390e + related: #1211266 + +* Sat Jul 11 2015 jchaloup - 1.0.0-0.1.git1b37059 +- Bump to upstream 1b370599ccf271741e657335c4943cb8c7dba28b + related: #1211266 + +* Fri Jul 10 2015 jchaloup - 0.21.1-0.2.gitccc4cfc +- Bump to upstream ccc4cfc7e11e0f127ac1cea045017dd799be3c63 + related: #1211266 + +* Thu Jul 09 2015 jchaloup - 0.21.1-0.1.git41f8907 +- Update generating of man pages from md (add genmanpages.sh) +- Bump to upstream 41f89075396329cd46c58495c7d3f7e13adcaa96 + related: #1211266 + +* Wed Jul 08 2015 jchaloup - 0.20.2-0.5.git77be29e +- Bump to upstream 77be29e3da71f0a136b6aa4048b2f0575c2598e4 + related: #1211266 + +* Tue Jul 07 2015 jchaloup - 0.20.2-0.4.git639a7da +- Bump to upstream 639a7dac50a331414cc6c47083323388da0d8756 + related: #1211266 + +* Mon Jul 06 2015 jchaloup - 0.20.2-0.3.gitbb6f2f7 +- Bump to upstream bb6f2f7ad90596d624d84cc691eec0f518e90cc8 + related: #1211266 + +* Fri Jul 03 2015 jchaloup - 0.20.2-0.2.git974377b +- Bump to upstream 974377b3064ac59b6e5694bfa568d67128026171 + related: #1211266 + +* Thu Jul 02 2015 jchaloup - 0.20.2-0.1.gitef41ceb +- Bump to upstream ef41ceb3e477ceada84c5522f429f02ab0f5948e + related: #1211266 + +* Tue Jun 30 2015 jchaloup - 0.20.0-0.3.git835eded +- Bump to upstream 835eded2943dfcf13a89518715e4be842a6a3ac0 +- Generate missing man pages + related: #1211266 + +* Mon Jun 29 2015 jchaloup - 0.20.0-0.2.git1c0b765 +- Bump to upstream 1c0b765df6dabfe9bd0e20489ed3bd18e6b3bda8 + Comment out missing man pages + related: #1211266 + +* Fri Jun 26 2015 jchaloup - 0.20.0-0.1.git8ebd896 +- Bump to upstream 8ebd896351513d446d56bc5785c070d2909226a3 + related: #1211266 + +* Fri Jun 26 2015 jchaloup - 0.19.3-0.6.git712f303 +- Bump to upstream 712f303350b35e70a573f3cb19193c8ec7ee7544 + related: #1211266 + +* Thu Jun 25 2015 jchaloup - 0.19.3-0.5.git2803b86 +- Bump to upstream 2803b86a42bf187afa816a7ce14fec754cc2af51 + related: #1211266 + +* Wed Jun 24 2015 Eric Paris - 0.19.3-0.4.git5b4dc4e +- Set CAP_NET_BIND_SERVICE on the kube-apiserver so it can use 443 + +* Wed Jun 24 2015 jchaloup - 0.19.3-0.3.git5b4dc4e +- Bump to upstream 5b4dc4edaa14e1ab4e3baa19df0388fa54dab344 + pkg/cloudprovider/* packages does not conform to golang language specification + related: #1211266 + +* Tue Jun 23 2015 jchaloup - 0.19.3-0.2.gita2ce3ea +- Bump to upstream a2ce3ea5293553b1fe0db3cbc6d53bdafe061d79 + related: #1211266 + +* Mon Jun 22 2015 jchaloup - 0.19.1-0.1.gitff0546d +- Bump to upstream ff0546da4fc23598de59db9f747c535545036463 + related: #1211266 + +* Fri Jun 19 2015 jchaloup - 0.19.0-0.7.gitb2e9fed +- Bump to upstream b2e9fed3490274509506285bdba309c50afb5c39 + related: #1211266 + +* Thu Jun 18 2015 jchaloup - 0.19.0-0.6.gitf660940 +- Bump to upstream f660940dceb3fe6ffb1b14ba495a47d91b5cd910 + related: #1211266 + +* Wed Jun 17 2015 jchaloup - 0.19.0-0.5.git43889c6 +- Bump to upstream 43889c612c4d396dcd8fbf3fbd217e106eaf5bce + related: #1211266 + +* Tue Jun 16 2015 jchaloup - 0.19.0-0.4.gita8269e3 +- Bump to upstream a8269e38c9e2bf81ba18cd6420e2309745d5b0b9 + related: #1211266 + +* Sun Jun 14 2015 jchaloup - 0.19.0-0.3.git5e5c1d1 +- Bump to upstream 5e5c1d10976f2f26d356ca60ef7d0d715c9f00a2 + related: #1211266 + +* Fri Jun 12 2015 jchaloup - 0.19.0-0.2.git0ca96c3 +- Bump to upstream 0ca96c3ac8b47114169f3b716ae4521ed8c7657c + related: #1211266 + +* Thu Jun 11 2015 jchaloup - 0.19.0-0.1.git5a02fc0 +- Bump to upstream 5a02fc07d8a943132b9e68fe7169778253318487 + related: #1211266 + +* Wed Jun 10 2015 jchaloup - 0.18.2-0.3.git0dfb681 +- Bump to upstream 0dfb681ba5d5dba535895ace9d650667904b5df7 + related: #1211266 + +* Tue Jun 09 2015 jchaloup - 0.18.2-0.2.gitb68e08f +- golang-cover is not needed + +* Tue Jun 09 2015 jchaloup - 0.18.2-0.1.gitb68e08f +- Bump to upstream b68e08f55f5ae566c4ea3905d0993a8735d6d34f + related: #1211266 + +* Sat Jun 06 2015 jchaloup - 0.18.1-0.3.git0f1c4c2 +- Bump to upstream 0f1c4c25c344f70c3592040b2ef092ccdce0244f + related: #1211266 + +* Fri Jun 05 2015 jchaloup - 0.18.1-0.2.git7309e1f +- Bump to upstream 7309e1f707ea5dd08c51f803037d7d22c20e2b92 + related: #1211266 + +* Thu Jun 04 2015 jchaloup - 0.18.1-0.1.gita161edb +- Bump to upstream a161edb3960c01ff6e14813858c2eeb85910009b + related: #1211266 + +* Wed Jun 03 2015 jchaloup - 0.18.0-0.3.gitb5a91bd +- Bump to upstream b5a91bda103ed2459f933959241a2b57331747ba +- Don't run %%check section (kept only for local run). Tests are now handled via CI. + related: #1211266 + +* Tue Jun 02 2015 jchaloup - 0.18.0-0.2.git5520386 +- Bump to upstream 5520386b180d3ddc4fa7b7dfe6f52642cc0c25f3 + related: #1211266 + +* Mon Jun 01 2015 jchaloup - 0.18.0-0.1.git0bb78fe +- Bump to upstream 0bb78fe6c53ce38198cc3805c78308cdd4805ac8 + related: #1211266 + +* Fri May 29 2015 jchaloup - 0.17.1-6 +- Bump to upstream ed4898d98c46869e9cbdb44186dfdeda9ff80cc2 + related: #1211266 + +* Thu May 28 2015 jchaloup - 0.17.1-5 +- Bump to upstream 6fa2777e26559fc008eacac83eb165d25bd9a7de + related: #1211266 + +* Tue May 26 2015 jchaloup - 0.17.1-4 +- Bump to upstream 01fcb58673001e56c69e128ab57e0c3f701aeea5 + related: #1211266 + +* Mon May 25 2015 jchaloup - 0.17.1-3 +- Decompose package into master and node subpackage. + Thanks to Avesh for testing and patience. + related: #1211266 + +* Mon May 25 2015 jchaloup - 0.17.1-2 +- Bump to upstream cf7b0bdc2a41d38613ac7f8eeea91cae23553fa2 + related: #1211266 + +* Fri May 22 2015 jchaloup - 0.17.1-1 +- Bump to upstream d9d12fd3f7036c92606fc3ba9046b365212fcd70 + related: #1211266 + +* Wed May 20 2015 jchaloup - 0.17.0-12 +- Bump to upstream a76bdd97100c66a46e2b49288540dcec58a954c4 + related: #1211266 + +* Tue May 19 2015 jchaloup - 0.17.0-11 +- Bump to upstream 10339d72b66a31592f73797a9983e7c207481b22 + related: #1211266 + +* Mon May 18 2015 jchaloup - 0.17.0-10 +- Bump to upstream efb42b302d871f7217394205d84e5ae82335d786 + related: #1211266 + +* Sat May 16 2015 jchaloup - 0.17.0-9 +- Bump to upstream d51e131726b925e7088b90915e99042459b628e0 + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-8 +- Bump to upstream 1ee33ac481a14db7b90e3bbac8cec4ceea822bfb + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-7 +- Bump to upstream d3c6fb0d6a13c0177dcd67556d72963c959234ea + related: #1211266 + +* Fri May 15 2015 jchaloup - 0.17.0-6 +- Bump to upstream f57f31783089f41c0bdca8cb87a1001ca94e1a45 + related: #1211266 + +* Thu May 14 2015 jchaloup - 0.17.0-5 +- Bump to upstream c90d381d0d5cf8ab7b8412106f5a6991d7e13c7d + related: #1211266 + +* Thu May 14 2015 jchaloup - 0.17.0-4 +- Bump to upstream 5010b2dde0f9b9eb820fe047e3b34bc9fa6324de +- Add debug info + related: #1211266 + +* Wed May 13 2015 jchaloup - 0.17.0-3 +- Bump to upstream ec19d41b63f5fe7b2c939e7738a41c0fbe65d796 + related: #1211266 + +* Tue May 12 2015 jchaloup - 0.17.0-2 +- Provide /usr/bin/kube-version-change binary + related: #1211266 + +* Tue May 12 2015 jchaloup - 0.17.0-1 +- Bump to upstream 962f10ee580eea30e5f4ea725c4e9e3743408a58 + related: #1211266 + +* Mon May 11 2015 jchaloup - 0.16.2-7 +- Bump to upstream 63182318c5876b94ac9b264d1224813b2b2ab541 + related: #1211266 + +* Fri May 08 2015 jchaloup - 0.16.2-6 +- Bump to upstream d136728df7e2694df9e082902f6239c11b0f2b00 +- Add NetworkManager as dependency for /etc/resolv.conf + related: #1211266 + +* Thu May 07 2015 jchaloup - 0.16.2-5 +- Bump to upstream ca0f678b9a0a6dc795ac7a595350d0dbe9d0ac3b + related: #1211266 + +* Wed May 06 2015 jchaloup - 0.16.2-4 +- Add docs to kubernetes-unit-test + related: #1211266 + +* Wed May 06 2015 jchaloup - 0.16.2-3 +- Bump to upstream 3a24c0e898cb3060d7905af6df275a3be562451d + related: #1211266 + +* Tue May 05 2015 jchaloup - 0.16.2-2 +- Add api and README.md to kubernetes-unit-test + related: #1211266 + +* Tue May 05 2015 jchaloup - 0.16.2-1 +- Bump to upstream 72048a824ca16c3921354197953fabecede5af47 + related: #1211266 + +* Mon May 04 2015 jchaloup - 0.16.1-2 +- Bump to upstream 1dcd80cdf3f00409d55cea1ef0e7faef0ae1d656 + related: #1211266 + +* Sun May 03 2015 jchaloup - 0.16.1-1 +- Bump to upstream 86751e8c90a3c0e852afb78d26cb6ba8cdbc37ba + related: #1211266 + +* Fri May 01 2015 jchaloup - 0.16.0-2 +- Bump to upstream 72708d74b9801989ddbdc8403fc5ba4aafb7c1ef + related: #1211266 + +* Wed Apr 29 2015 jchaloup - 0.16.0-1 +- Bump to upstream 7dcce2eeb7f28643d599c8b6a244523670d17c93 + related: #1211266 + +* Tue Apr 28 2015 jchaloup - 0.15.0-10 +- Add unit-test subpackage + related: #1211266 + +* Tue Apr 28 2015 jchaloup - 0.15.0-9 +- Bump to upstream 99fc906f78cd2bcb08536c262867fa6803f816d5 + related: #1211266 + +* Mon Apr 27 2015 jchaloup - 0.15.0-8 +- Bump to upstream 051dd96c542799dfab39184d2a7c8bacf9e88d85 + related: #1211266 + +* Fri Apr 24 2015 jchaloup - 0.15.0-7 +- Bump to upstream 9f753c2592481a226d72cea91648db8fb97f0da8 + related: #1211266 + +* Thu Apr 23 2015 jchaloup - 0.15.0-6 +- Bump to upstream cf824ae5e07965ba0b4b15ee88e08e2679f36978 + related: #1211266 + +* Tue Apr 21 2015 jchaloup - 0.15.0-5 +- Bump to upstream 21788d8e6606038a0a465c97f5240b4e66970fbb + related: #1211266 + +* Mon Apr 20 2015 jchaloup - 0.15.0-4 +- Bump to upstream eb1ea269954da2ce557f3305fa88d42e3ade7975 + related: #1211266 + +* Fri Apr 17 2015 jchaloup - 0.15.0-3 +- Obsolete cadvisor as it is integrated in kubelet + related: #1211266 + +* Wed Apr 15 2015 jchaloup - 0.15.0-0.2.git0ea87e4 +- Bump to upstream 0ea87e486407298dc1e3126c47f4076b9022fb09 + related: #1211266 + +* Tue Apr 14 2015 jchaloup - 0.15.0-0.1.gitd02139d +- Bump to upstream d02139d2b454ecc5730cc535d415c1963a7fb2aa + related: #1211266 + +* Sun Apr 12 2015 jchaloup - 0.14.2-0.2.gitd577db9 +- Bump to upstream d577db99873cbf04b8e17b78f17ec8f3a27eca30 + +* Wed Apr 08 2015 jchaloup - 0.14.2-0.1.git2719194 +- Bump to upstream 2719194154ffd38fd1613699a9dd10a00909957e + Use etcd-2.0.8 and higher + +* Tue Apr 07 2015 jchaloup - 0.14.1-0.2.gitd2f4734 +- Bump to upstream d2f473465738e6b6f7935aa704319577f5e890ba + +* Thu Apr 02 2015 jchaloup - 0.14.1-0.1.gita94ffc8 +- Bump to upstream a94ffc8625beb5e2a39edb01edc839cb8e59c444 + +* Wed Apr 01 2015 jchaloup - 0.14.0-0.2.git8168344 +- Bump to upstream 81683441b96537d4b51d146e39929b7003401cd5 + +* Tue Mar 31 2015 jchaloup - 0.14.0-0.1.git9ed8761 +- Bump to upstream 9ed87612d07f75143ac96ad90ff1ff68f13a2c67 +- Remove [B]R from devel branch until the package has stable API + +* Mon Mar 30 2015 jchaloup - 0.13.2-0.6.git8a7a127 +- Bump to upstream 8a7a127352263439e22253a58628d37a93fdaeb2 + +* Fri Mar 27 2015 jchaloup - 0.13.2-0.5.git8d94c43 +- Bump to upstream 8d94c43e705824f23791b66ad5de4ea095d5bb32 + resolves: #1205362 + +* Wed Mar 25 2015 jchaloup - 0.13.2-0.4.git455fe82 +- Bump to upstream 455fe8235be8fd9ba0ce21bf4f50a69d42e18693 + +* Mon Mar 23 2015 jchaloup - 0.13.2-0.3.gitef75888 +- Remove runtime dependency on etcd + resolves: #1202923 + +* Sun Mar 22 2015 jchaloup - 0.13.2-0.2.gitef75888 +- Bump to upstream ef758881d108bb53a128126c503689104d17f477 + +* Fri Mar 20 2015 jchaloup - 0.13.2-0.1.gita8f2cee +- Bump to upstream a8f2cee8c5418676ee33a311fad57d6821d3d29a + +* Fri Mar 13 2015 jchaloup - 0.12.0-0.9.git53b25a7 +- Bump to upstream 53b25a7890e31bdec6f2a95b32200d6cc27ae2ca + fix kube-proxy.service and kubelet + resolves: #1200919 #1200924 + +* Fri Mar 13 2015 jchaloup - 0.12.0-0.8.git39dceb1 +- Bump to upstream 39dceb13a511a83963a766a439cb386d10764310 + +* Thu Mar 12 2015 Eric Paris - 0.12.0-0.7.gita3fd0a9 +- Move from /etc/tmpfiles.d to %%{_tmpfilesdir} + resolves: #1200969 + +* Thu Mar 12 2015 jchaloup - 0.12.0-0.6.gita3fd0a9 +- Place contrib/init/systemd/tmpfiles.d/kubernetes.conf to /etc/tmpfiles.d/kubernetes.conf + +* Thu Mar 12 2015 jchaloup - 0.12.0-0.5.gita3fd0a9 +- Bump to upstream a3fd0a9fd516bb6033f32196ae97aaecf8c096b1 + +* Tue Mar 10 2015 jchaloup - 0.12.0-0.4.gita4d871a +- Bump to upstream a4d871a10086436557f804930812f2566c9d4d39 + +* Fri Mar 06 2015 jchaloup - 0.12.0-0.3.git2700871 +- Bump to upstream 2700871b049d5498167671cea6de8317099ad406 + +* Thu Mar 05 2015 jchaloup - 0.12.0-0.2.git8b627f5 +- Bump to upstream 8b627f516fd3e4f62da90d401ceb3d38de6f8077 + +* Tue Mar 03 2015 jchaloup - 0.12.0-0.1.gitecca426 +- Bump to upstream ecca42643b91a7117de8cd385b64e6bafecefd65 + +* Mon Mar 02 2015 jchaloup - 0.11.0-0.5.git6c5b390 +- Bump to upstream 6c5b390160856cd8334043344ef6e08568b0a5c9 + +* Sat Feb 28 2015 jchaloup - 0.11.0-0.4.git0fec31a +- Bump to upstream 0fec31a11edff14715a1efb27f77262a7c3770f4 + +* Fri Feb 27 2015 jchaloup - 0.11.0-0.3.git08402d7 +- Bump to upstream 08402d798c8f207a2e093de5a670c5e8e673e2de + +* Wed Feb 25 2015 jchaloup - 0.11.0-0.2.git86434b4 +- Bump to upstream 86434b4038ab87ac40219562ad420c3cc58c7c6b + +* Tue Feb 24 2015 jchaloup - 0.11.0-0.1.git754a2a8 +- Bump to upstream 754a2a8305c812121c3845d8293efdd819b6a704 + turn off integration tests until "FAILED: unexpected endpoints: + timed out waiting for the condition" problem is resolved + Adding back devel subpackage ([B]R list outdated) + +* Fri Feb 20 2015 jchaloup - 0.10.1-0.3.git4c87805 +- Bump to upstream 4c87805870b1b22e463c4bd711238ef68c77f0af + +* Tue Feb 17 2015 jchaloup - 0.10.1-0.2.git6f84bda +- Bump to upstream 6f84bdaba853872dbac69c84d3ab4b6964e85d8c + +* Tue Feb 17 2015 jchaloup - 0.10.1-0.1.git7d6130e +- Bump to upstream 7d6130edcdfabd7dd2e6a06fdc8fe5e333f07f5c + +* Sat Feb 07 2015 jchaloup - 0.9.1-0.7.gitc9c98ab +- Bump to upstream c9c98ab19eaa6f0b2ea17152c9a455338853f4d0 + Since some dependencies are broken, we can not build Kubernetes from Fedora deps. + Switching to vendored source codes until Go draft is resolved + +* Wed Feb 04 2015 jchaloup - 0.9.1-0.6.git7f5ed54 +- Bump to upstream 7f5ed541f794348ae6279414cf70523a4d5133cc + +* Tue Feb 03 2015 jchaloup - 0.9.1-0.5.git2ac6bbb +- Bump to upstream 2ac6bbb7eba7e69eac71bd9acd192cda97e67641 + +* Mon Feb 02 2015 jchaloup - 0.9.1-0.4.gite335e2d +- Bump to upstream e335e2d3e26a9a58d3b189ccf41ceb3770d1bfa9 + +* Fri Jan 30 2015 jchaloup - 0.9.1-0.3.git55793ac +- Bump to upstream 55793ac2066745f7243c666316499e1a8cf074f0 + +* Thu Jan 29 2015 jchaloup - 0.9.1-0.2.gitca6de16 +- Bump to upstream ca6de16df7762d4fc9b4ad44baa78d22e3f30742 + +* Tue Jan 27 2015 jchaloup - 0.9.1-0.1.git3623a01 +- Bump to upstream 3623a01bf0e90de6345147eef62894057fe04b29 +- update tests for etcd-2.0 + +* Thu Jan 22 2015 jchaloup - 0.8.2-571.gitb2f287c ++- Bump to upstream b2f287c259d856f4c08052a51cd7772c563aff77 + +* Thu Jan 22 2015 Eric Paris - 0.8.2-570.gitb2f287c +- patch kubelet service file to use docker.service not docker.socket + +* Wed Jan 21 2015 jchaloup - 0.8.2-0.1.git5b04640 +- Bump to upstream 5b046406a957a1e7eda7c0c86dd7a89e9c94fc5f + +* Sun Jan 18 2015 jchaloup - 0.8.0-126.0.git68298f0 +- Add some missing dependencies +- Add devel subpackage + +* Fri Jan 09 2015 Eric Paris - 0.8.0-125.0.git68298f0 +- Bump to upstream 68298f08a4980f95dfbf7b9f58bfec1808fb2670 + +* Tue Dec 16 2014 Eric Paris - 0.7.0-18.0.git52e165a +- Bump to upstream 52e165a4fd720d1703ebc31bd6660e01334227b8 + +* Mon Dec 15 2014 Eric Paris - 0.6-297.0.git5ef34bf +- Bump to upstream 5ef34bf52311901b997119cc49eff944c610081b + +* Wed Dec 03 2014 Eric Paris +- Replace patch to use old googlecode/go.net/ with BuildRequires on golang.org/x/net/ + +* Tue Dec 02 2014 Eric Paris - 0.6-4.0.git993ef88 +- Bump to upstream 993ef88eec9012b221f79abe8f2932ee97997d28 + +* Mon Dec 01 2014 Eric Paris - 0.5-235.0.git6aabd98 +- Bump to upstream 6aabd9804fb75764b70e9172774002d4febcae34 + +* Wed Nov 26 2014 Eric Paris - 0.5-210.0.gitff1e9f4 +- Bump to upstream ff1e9f4c191342c24974c030e82aceaff8ea9c24 + +* Tue Nov 25 2014 Eric Paris - 0.5-174.0.git64e07f7 +- Bump to upstream 64e07f7fe03d8692c685b09770c45f364967a119 + +* Mon Nov 24 2014 Eric Paris - 0.5-125.0.git162e498 +- Bump to upstream 162e4983b947d2f6f858ca7607869d70627f5dff + +* Fri Nov 21 2014 Eric Paris - 0.5-105.0.git3f74a1e +- Bump to upstream 3f74a1e9f56b3c3502762930c0c551ccab0557ea + +* Thu Nov 20 2014 Eric Paris - 0.5-65.0.gitc6158b8 +- Bump to upstream c6158b8aa9c40fbf1732650a8611429536466b21 +- include go-restful build requirement + +* Tue Nov 18 2014 Eric Paris - 0.5-14.0.gitdf0981b +- Bump to upstream df0981bc01c5782ad30fc45cb6f510f365737fc1 + +* Tue Nov 11 2014 Eric Paris - 0.4-680.0.git30fcf24 +- Bump to upstream 30fcf241312f6d0767c7d9305b4c462f1655f790 + +* Mon Nov 10 2014 Eric Paris - 0.4-633.0.git6c70227 +- Bump to upstream 6c70227a2eccc23966d32ea6d558ee05df46e400 + +* Fri Nov 07 2014 Eric Paris - 0.4-595.0.gitb695650 +- Bump to upstream b6956506fa2682afa93770a58ea8c7ba4b4caec1 + +* Thu Nov 06 2014 Eric Paris - 0.4-567.0.git3b1ef73 +- Bump to upstream 3b1ef739d1fb32a822a22216fb965e22cdd28e7f + +* Thu Nov 06 2014 Eric Paris - 0.4-561.0.git06633bf +- Bump to upstream 06633bf4cdc1ebd4fc848f85025e14a794b017b4 +- Make spec file more RHEL/CentOS friendly + +* Tue Nov 04 2014 Eric Paris - 0.4-0.0.git4452163 +- rebase to v0.4 +- include man pages + +* Tue Oct 14 2014 jchaloup - 0.3-0.3.git98ac8e1 +- create /var/lib/kubelet +- Use bash completions from upstream +- Bump to upstream 98ac8e178fcf1627399d659889bcb5fe25abdca4 +- all by Eric Paris + +* Mon Sep 29 2014 Jan Chaloupka - 0.3-0.2.git88fdb65 +- replace * with coresponding files +- remove dependency on gcc + +* Wed Sep 24 2014 Eric Paris - 0.1-0.4.git6ebe69a +- prefer autosetup instead of setup (revert setup change in 0-0.3.git) +https://fedoraproject.org/wiki/Autosetup_packaging_draft +- revert version number to 0.1 + +* Mon Sep 08 2014 Lokesh Mandvekar - 0-0.3.git6ebe69a +- gopath defined in golang package already +- package owns /etc/kubernetes +- bash dependency implicit +- keep buildroot/$RPM_BUILD_ROOT macros consistent +- replace with macros wherever possible +- set version, release and source tarball prep as per +https://fedoraproject.org/wiki/Packaging:SourceURL#Github + +* Mon Sep 08 2014 Eric Paris +- make services restart automatically on error + +* Sat Sep 06 2014 Eric Paris +- update to upstream +- redo build to use project scripts +- use project scripts in %%check +- rework deletion of third_party packages to easily detect changes +- run apiserver and controller-manager as non-root + +* Mon Aug 11 2014 Adam Miller +- update to upstream +- decouple the rest of third_party + +* Thu Aug 7 2014 Eric Paris +- update to head +- update package to include config files + +* Wed Jul 16 2014 Colin Walters +- Initial package