Merge pull request #122967 from burgerdev/fix-kubeadm-DeployedDNSAddon
kubeadm: support digests in DeployedDNSAddon()
This commit is contained in:
		@@ -41,6 +41,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/images"
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/images"
 | 
				
			||||||
	kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
						kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/cmd/kubeadm/app/util/image"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -48,7 +49,7 @@ const (
 | 
				
			|||||||
	coreDNSReplicas       = 2
 | 
						coreDNSReplicas       = 2
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeployedDNSAddon returns the type of DNS addon currently deployed
 | 
					// DeployedDNSAddon returns the image tag of the DNS addon currently deployed
 | 
				
			||||||
func DeployedDNSAddon(client clientset.Interface) (string, error) {
 | 
					func DeployedDNSAddon(client clientset.Interface) (string, error) {
 | 
				
			||||||
	deploymentsClient := client.AppsV1().Deployments(metav1.NamespaceSystem)
 | 
						deploymentsClient := client.AppsV1().Deployments(metav1.NamespaceSystem)
 | 
				
			||||||
	deployments, err := deploymentsClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "k8s-app=kube-dns"})
 | 
						deployments, err := deploymentsClient.List(context.TODO(), metav1.ListOptions{LabelSelector: "k8s-app=kube-dns"})
 | 
				
			||||||
@@ -60,10 +61,7 @@ func DeployedDNSAddon(client clientset.Interface) (string, error) {
 | 
				
			|||||||
	case 0:
 | 
						case 0:
 | 
				
			||||||
		return "", nil
 | 
							return "", nil
 | 
				
			||||||
	case 1:
 | 
						case 1:
 | 
				
			||||||
		addonImage := deployments.Items[0].Spec.Template.Spec.Containers[0].Image
 | 
							return image.TagFromImage(deployments.Items[0].Spec.Template.Spec.Containers[0].Image), nil
 | 
				
			||||||
		addonImageParts := strings.Split(addonImage, ":")
 | 
					 | 
				
			||||||
		addonVersion := addonImageParts[len(addonImageParts)-1]
 | 
					 | 
				
			||||||
		return addonVersion, nil
 | 
					 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return "", errors.Errorf("multiple DNS addon deployments found: %v", deployments.Items)
 | 
							return "", errors.Errorf("multiple DNS addon deployments found: %v", deployments.Items)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -585,7 +585,7 @@ func TestDeployedDNSReplicas(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tt := range tests {
 | 
						for _, tt := range tests {
 | 
				
			||||||
		t.Run(tt.name, func(t *testing.T) {
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
			client := newMockClientForTest(t, 2, tt.deploymentSize)
 | 
								client := newMockClientForTest(t, 2, tt.deploymentSize, "")
 | 
				
			||||||
			got, err := deployedDNSReplicas(client, 5)
 | 
								got, err := deployedDNSReplicas(client, 5)
 | 
				
			||||||
			if (err != nil) != tt.wantErr {
 | 
								if (err != nil) != tt.wantErr {
 | 
				
			||||||
				t.Errorf("deployedDNSReplicas() error = %v, wantErr %v", err, tt.wantErr)
 | 
									t.Errorf("deployedDNSReplicas() error = %v, wantErr %v", err, tt.wantErr)
 | 
				
			||||||
@@ -614,7 +614,7 @@ func TestCoreDNSAddon(t *testing.T) {
 | 
				
			|||||||
			name: "cfg is empty",
 | 
								name: "cfg is empty",
 | 
				
			||||||
			args: args{
 | 
								args: args{
 | 
				
			||||||
				cfg:           &kubeadmapi.ClusterConfiguration{},
 | 
									cfg:           &kubeadmapi.ClusterConfiguration{},
 | 
				
			||||||
				client:        newMockClientForTest(t, 2, 1),
 | 
									client:        newMockClientForTest(t, 2, 1, ""),
 | 
				
			||||||
				printManifest: false,
 | 
									printManifest: false,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantOut: "",
 | 
								wantOut: "",
 | 
				
			||||||
@@ -633,7 +633,7 @@ func TestCoreDNSAddon(t *testing.T) {
 | 
				
			|||||||
						ServiceSubnet: "10.0.0.0/16",
 | 
											ServiceSubnet: "10.0.0.0/16",
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				client:        newMockClientForTest(t, 2, 1),
 | 
									client:        newMockClientForTest(t, 2, 1, ""),
 | 
				
			||||||
				printManifest: false,
 | 
									printManifest: false,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantOut: "[addons] Applied essential addon: CoreDNS\n",
 | 
								wantOut: "[addons] Applied essential addon: CoreDNS\n",
 | 
				
			||||||
@@ -652,7 +652,7 @@ func TestCoreDNSAddon(t *testing.T) {
 | 
				
			|||||||
						ServiceSubnet: "10.0.0.0/16",
 | 
											ServiceSubnet: "10.0.0.0/16",
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				client:        newMockClientForTest(t, 2, 1),
 | 
									client:        newMockClientForTest(t, 2, 1, ""),
 | 
				
			||||||
				printManifest: true,
 | 
									printManifest: true,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantOut: dedent.Dedent(`---
 | 
								wantOut: dedent.Dedent(`---
 | 
				
			||||||
@@ -899,7 +899,7 @@ func TestEnsureDNSAddon(t *testing.T) {
 | 
				
			|||||||
						ServiceSubnet: "10.0.0.0/16",
 | 
											ServiceSubnet: "10.0.0.0/16",
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				client:        newMockClientForTest(t, 0, 1),
 | 
									client:        newMockClientForTest(t, 0, 1, ""),
 | 
				
			||||||
				printManifest: false,
 | 
									printManifest: false,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantOut: "[addons] Applied essential addon: CoreDNS\n",
 | 
								wantOut: "[addons] Applied essential addon: CoreDNS\n",
 | 
				
			||||||
@@ -917,7 +917,7 @@ func TestEnsureDNSAddon(t *testing.T) {
 | 
				
			|||||||
						ServiceSubnet: "10.0.0.0/16",
 | 
											ServiceSubnet: "10.0.0.0/16",
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				client:        newMockClientForTest(t, 0, 1),
 | 
									client:        newMockClientForTest(t, 0, 1, ""),
 | 
				
			||||||
				printManifest: true,
 | 
									printManifest: true,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantOut: dedent.Dedent(`---
 | 
								wantOut: dedent.Dedent(`---
 | 
				
			||||||
@@ -1375,7 +1375,7 @@ func TestCreateDNSService(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tt := range tests {
 | 
						for _, tt := range tests {
 | 
				
			||||||
		t.Run(tt.name, func(t *testing.T) {
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
			client := newMockClientForTest(t, 1, 1)
 | 
								client := newMockClientForTest(t, 1, 1, "")
 | 
				
			||||||
			if err := createDNSService(tt.args.dnsService, tt.args.serviceBytes, client); (err != nil) != tt.wantErr {
 | 
								if err := createDNSService(tt.args.dnsService, tt.args.serviceBytes, client); (err != nil) != tt.wantErr {
 | 
				
			||||||
				t.Errorf("createDNSService() error = %v, wantErr %v", err, tt.wantErr)
 | 
									t.Errorf("createDNSService() error = %v, wantErr %v", err, tt.wantErr)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -1383,9 +1383,66 @@ func TestCreateDNSService(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDeployedDNSAddon(t *testing.T) {
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name        string
 | 
				
			||||||
 | 
							image       string
 | 
				
			||||||
 | 
							wantVersion string
 | 
				
			||||||
 | 
							wantErr     bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "default",
 | 
				
			||||||
 | 
								image:       "registry.k8s.io/coredns/coredns:v1.11.1",
 | 
				
			||||||
 | 
								wantVersion: "v1.11.1",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "with digest",
 | 
				
			||||||
 | 
								image:       "registry.k8s.io/coredns/coredns:v1.11.1@sha256:a0ead06651cf580044aeb0a0feba63591858fb2e43ade8c9dea45a6a89ae7e5e",
 | 
				
			||||||
 | 
								wantVersion: "v1.11.1",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "without registry",
 | 
				
			||||||
 | 
								image:       "coredns/coredns:coredns-s390x",
 | 
				
			||||||
 | 
								wantVersion: "coredns-s390x",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "without registry and tag",
 | 
				
			||||||
 | 
								image:       "coredns/coredns",
 | 
				
			||||||
 | 
								wantVersion: "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "with explicit port",
 | 
				
			||||||
 | 
								image:       "localhost:4711/coredns/coredns:v1.11.2-pre.1",
 | 
				
			||||||
 | 
								wantVersion: "v1.11.2-pre.1",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:        "with explicit port but without tag",
 | 
				
			||||||
 | 
								image:       "localhost:4711/coredns/coredns@sha256:a0ead06651cf580044aeb0a0feba63591858fb2e43ade8c9dea45a6a89ae7e5e",
 | 
				
			||||||
 | 
								wantVersion: "",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
 | 
								client := newMockClientForTest(t, 1, 1, tt.image)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								version, err := DeployedDNSAddon(client)
 | 
				
			||||||
 | 
								if (err != nil) != tt.wantErr {
 | 
				
			||||||
 | 
									t.Errorf("DeployedDNSAddon() error = %v, wantErr %v", err, tt.wantErr)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if version != tt.wantVersion {
 | 
				
			||||||
 | 
									t.Errorf("DeployedDNSAddon() for image %q returned %q, want %q", tt.image, version, tt.wantVersion)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// replicas is replica of each DNS deployment
 | 
					// replicas is replica of each DNS deployment
 | 
				
			||||||
// deploymentSize is the number of deployments with `k8s-app=kube-dns` label.
 | 
					// deploymentSize is the number of deployments with `k8s-app=kube-dns` label.
 | 
				
			||||||
func newMockClientForTest(t *testing.T, replicas int32, deploymentSize int) *clientsetfake.Clientset {
 | 
					func newMockClientForTest(t *testing.T, replicas int32, deploymentSize int, image string) *clientsetfake.Clientset {
 | 
				
			||||||
 | 
						if image == "" {
 | 
				
			||||||
 | 
							image = "registry.k8s.io/coredns/coredns:v1.11.1"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	client := clientsetfake.NewSimpleClientset()
 | 
						client := clientsetfake.NewSimpleClientset()
 | 
				
			||||||
	for i := 0; i < deploymentSize; i++ {
 | 
						for i := 0; i < deploymentSize; i++ {
 | 
				
			||||||
		_, err := client.AppsV1().Deployments(metav1.NamespaceSystem).Create(context.TODO(), &apps.Deployment{
 | 
							_, err := client.AppsV1().Deployments(metav1.NamespaceSystem).Create(context.TODO(), &apps.Deployment{
 | 
				
			||||||
@@ -1402,7 +1459,11 @@ func newMockClientForTest(t *testing.T, replicas int32, deploymentSize int) *cli
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
			Spec: apps.DeploymentSpec{
 | 
								Spec: apps.DeploymentSpec{
 | 
				
			||||||
				Replicas: &replicas,
 | 
									Replicas: &replicas,
 | 
				
			||||||
				Template: v1.PodTemplateSpec{},
 | 
									Template: v1.PodTemplateSpec{
 | 
				
			||||||
 | 
										Spec: v1.PodSpec{
 | 
				
			||||||
 | 
											Containers: []v1.Container{{Image: image}},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		}, metav1.CreateOptions{})
 | 
							}, metav1.CreateOptions{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user