mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
add AddInstanceHook mock method, test insertion of new instace
This commit is contained in:
parent
ad98c4854f
commit
2ef71eb6e5
@ -106,6 +106,7 @@ go_test(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/gce",
|
importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/gce",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/cloudprovider:go_default_library",
|
"//pkg/cloudprovider:go_default_library",
|
||||||
|
"//pkg/cloudprovider/providers/gce/cloud:go_default_library",
|
||||||
"//pkg/kubelet/apis:go_default_library",
|
"//pkg/kubelet/apis:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
"//vendor/github.com/stretchr/testify/require:go_default_library",
|
||||||
|
@ -57,6 +57,7 @@ filegroup(
|
|||||||
"//pkg/cloudprovider/providers/gce/cloud/filter:all-srcs",
|
"//pkg/cloudprovider/providers/gce/cloud/filter:all-srcs",
|
||||||
"//pkg/cloudprovider/providers/gce/cloud/gen:all-srcs",
|
"//pkg/cloudprovider/providers/gce/cloud/gen:all-srcs",
|
||||||
"//pkg/cloudprovider/providers/gce/cloud/meta:all-srcs",
|
"//pkg/cloudprovider/providers/gce/cloud/meta:all-srcs",
|
||||||
|
"//pkg/cloudprovider/providers/gce/cloud/mock:all-srcs",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
|
26
pkg/cloudprovider/providers/gce/cloud/mock/BUILD
Normal file
26
pkg/cloudprovider/providers/gce/cloud/mock/BUILD
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["mock.go"],
|
||||||
|
importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/mock",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
deps = [
|
||||||
|
"//pkg/cloudprovider/providers/gce/cloud:go_default_library",
|
||||||
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
52
pkg/cloudprovider/providers/gce/cloud/mock/mock.go
Normal file
52
pkg/cloudprovider/providers/gce/cloud/mock/mock.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package mock encapsulates mocks for testing GCE provider functionality.
|
||||||
|
// These methods are used to override the mock objects' methods in order to
|
||||||
|
// intercept the standard processing and to add custom logic for test purposes.
|
||||||
|
//
|
||||||
|
// // Example usage:
|
||||||
|
// cloud := cloud.NewMockGCE()
|
||||||
|
// cloud.MockTargetPools.AddInstanceHook = mock.AddInstanceHook
|
||||||
|
|
||||||
|
package mock
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
ga "google.golang.org/api/compute/v1"
|
||||||
|
"google.golang.org/api/googleapi"
|
||||||
|
cloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud"
|
||||||
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/meta"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AddInstanceHook(m *cloud.MockTargetPools, ctx context.Context, key *meta.Key, req *ga.TargetPoolsAddInstanceRequest) error {
|
||||||
|
pool, err := m.Get(ctx, key)
|
||||||
|
if err != nil {
|
||||||
|
return &googleapi.Error{
|
||||||
|
Code: http.StatusNotFound,
|
||||||
|
Message: fmt.Sprintf("Key: %s was not found in TargetPools", key.String()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, instance := range req.Instances {
|
||||||
|
pool.Instances = append(pool.Instances, instance.Instance)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -29,6 +29,7 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider"
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||||
"k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud"
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud"
|
||||||
|
"k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/mock"
|
||||||
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -258,22 +259,6 @@ var apiService = &v1.Service{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var nodes = []*v1.Node{
|
|
||||||
&v1.Node{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: nodeName,
|
|
||||||
Labels: map[string]string{
|
|
||||||
kubeletapis.LabelHostname: nodeName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Status: v1.NodeStatus{
|
|
||||||
NodeInfo: v1.NodeSystemInfo{
|
|
||||||
KubeProxyVersion: "v1.7.2",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func fakeGCECloud() (*GCECloud, error) {
|
func fakeGCECloud() (*GCECloud, error) {
|
||||||
client, err := newOauthClient(nil)
|
client, err := newOauthClient(nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -293,6 +278,7 @@ func fakeGCECloud() (*GCECloud, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cloud := cloud.NewMockGCE()
|
cloud := cloud.NewMockGCE()
|
||||||
|
cloud.MockTargetPools.AddInstanceHook = mock.AddInstanceHook
|
||||||
zonesWithNodes := createNodeZones([]string{zone})
|
zonesWithNodes := createNodeZones([]string{zone})
|
||||||
|
|
||||||
gce := GCECloud{
|
gce := GCECloud{
|
||||||
@ -307,7 +293,11 @@ func fakeGCECloud() (*GCECloud, error) {
|
|||||||
c: cloud,
|
c: cloud,
|
||||||
}
|
}
|
||||||
|
|
||||||
gce.InsertInstance(
|
return &gce, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createExternalLoadBalancer(gce *GCECloud) (*v1.LoadBalancerStatus, error) {
|
||||||
|
err := gce.InsertInstance(
|
||||||
gceProjectId,
|
gceProjectId,
|
||||||
zone,
|
zone,
|
||||||
&compute.Instance{
|
&compute.Instance{
|
||||||
@ -318,10 +308,26 @@ func fakeGCECloud() (*GCECloud, error) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return &gce, nil
|
if err != nil {
|
||||||
}
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
nodes := []*v1.Node{
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: nodeName,
|
||||||
|
Labels: map[string]string{
|
||||||
|
kubeletapis.LabelHostname: nodeName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
NodeInfo: v1.NodeSystemInfo{
|
||||||
|
KubeProxyVersion: "v1.7.2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func createExternalLoadBalancer(gce *GCECloud) (*v1.LoadBalancerStatus, error) {
|
|
||||||
status, err := gce.ensureExternalLoadBalancer(
|
status, err := gce.ensureExternalLoadBalancer(
|
||||||
clusterName,
|
clusterName,
|
||||||
clusterID,
|
clusterID,
|
||||||
@ -354,7 +360,7 @@ func TestEnsureExternalLoadBalancer(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, lbName, pool.Name)
|
assert.Equal(t, lbName, pool.Name)
|
||||||
assert.NotEmpty(t, pool.HealthChecks)
|
assert.NotEmpty(t, pool.HealthChecks)
|
||||||
assert.NotEmpty(t, pool.Instances)
|
assert.Equal(t, 1, len(pool.Instances))
|
||||||
|
|
||||||
// Check that HealthCheck is created
|
// Check that HealthCheck is created
|
||||||
hcName := MakeNodesHealthCheckName(clusterID)
|
hcName := MakeNodesHealthCheckName(clusterID)
|
||||||
@ -375,8 +381,64 @@ func TestUpdateExternalLoadBalancer(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
createExternalLoadBalancer(gce)
|
createExternalLoadBalancer(gce)
|
||||||
|
|
||||||
err = gce.updateExternalLoadBalancer(clusterName, apiService, nodes)
|
newNodeName := "test-node-2"
|
||||||
|
gce.InsertInstance(
|
||||||
|
gceProjectId,
|
||||||
|
zone,
|
||||||
|
&compute.Instance{
|
||||||
|
Name: newNodeName,
|
||||||
|
Tags: &compute.Tags{
|
||||||
|
Items: []string{newNodeName},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
newNodes := []*v1.Node{
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: nodeName,
|
||||||
|
Labels: map[string]string{
|
||||||
|
kubeletapis.LabelHostname: nodeName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
NodeInfo: v1.NodeSystemInfo{
|
||||||
|
KubeProxyVersion: "v1.7.2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: newNodeName,
|
||||||
|
Labels: map[string]string{
|
||||||
|
kubeletapis.LabelHostname: newNodeName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
NodeInfo: v1.NodeSystemInfo{
|
||||||
|
KubeProxyVersion: "v1.7.2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gce.updateExternalLoadBalancer(clusterName, apiService, newNodes)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
lbName := cloudprovider.GetLoadBalancerName(apiService)
|
||||||
|
|
||||||
|
// Check that TargetPool is updated with the new node
|
||||||
|
pool, err := gce.GetTargetPool(lbName, gceRegion)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(
|
||||||
|
t,
|
||||||
|
[]string{
|
||||||
|
fmt.Sprintf("/zones/%s/instances/%s", zone, nodeName),
|
||||||
|
fmt.Sprintf("/zones/%s/instances/%s", zone, newNodeName),
|
||||||
|
},
|
||||||
|
pool.Instances,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEnsureExternalLoadBalancerDeleted(t *testing.T) {
|
func TestEnsureExternalLoadBalancerDeleted(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user