123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- /*
- Copyright 2015 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 kubelet
- import (
- "fmt"
- "testing"
- cadvisorapi "github.com/google/cadvisor/info/v2"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
- )
- func testPolicy() DiskSpacePolicy {
- return DiskSpacePolicy{
- DockerFreeDiskMB: 250,
- RootFreeDiskMB: 250,
- }
- }
- func setUp(t *testing.T) (*assert.Assertions, DiskSpacePolicy, *cadvisortest.Mock) {
- assert := assert.New(t)
- policy := testPolicy()
- c := new(cadvisortest.Mock)
- return assert, policy, c
- }
- func TestValidPolicy(t *testing.T) {
- assert, policy, c := setUp(t)
- _, err := newDiskSpaceManager(c, policy)
- assert.NoError(err)
- policy = testPolicy()
- policy.DockerFreeDiskMB = -1
- _, err = newDiskSpaceManager(c, policy)
- assert.Error(err)
- policy = testPolicy()
- policy.RootFreeDiskMB = -1
- _, err = newDiskSpaceManager(c, policy)
- assert.Error(err)
- }
- func TestSpaceAvailable(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- assert.NoError(err)
- mockCadvisor.On("ImagesFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 400 * mb,
- Capacity: 1000 * mb,
- Available: 600 * mb,
- }, nil)
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 9 * mb,
- Capacity: 10 * mb,
- }, nil)
- ok, err := dm.IsRuntimeDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- ok, err = dm.IsRootDiskSpaceAvailable()
- assert.NoError(err)
- assert.False(ok)
- }
- // TestIsRuntimeDiskSpaceAvailableWithSpace verifies IsRuntimeDiskSpaceAvailable results when
- // space is available.
- func TestIsRuntimeDiskSpaceAvailableWithSpace(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- require.NoError(t, err)
- // 500MB available
- mockCadvisor.On("ImagesFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 9500 * mb,
- Capacity: 10000 * mb,
- Available: 500 * mb,
- }, nil)
- ok, err := dm.IsRuntimeDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- }
- // TestIsRuntimeDiskSpaceAvailableWithoutSpace verifies IsRuntimeDiskSpaceAvailable results when
- // space is not available.
- func TestIsRuntimeDiskSpaceAvailableWithoutSpace(t *testing.T) {
- // 1MB available
- assert, policy, mockCadvisor := setUp(t)
- mockCadvisor.On("ImagesFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 999 * mb,
- Capacity: 1000 * mb,
- Available: 1 * mb,
- }, nil)
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- require.NoError(t, err)
- ok, err := dm.IsRuntimeDiskSpaceAvailable()
- assert.NoError(err)
- assert.False(ok)
- }
- // TestIsRootDiskSpaceAvailableWithSpace verifies IsRootDiskSpaceAvailable results when
- // space is available.
- func TestIsRootDiskSpaceAvailableWithSpace(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- policy.RootFreeDiskMB = 10
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- assert.NoError(err)
- // 999MB available
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 1 * mb,
- Capacity: 1000 * mb,
- Available: 999 * mb,
- }, nil)
- ok, err := dm.IsRootDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- }
- // TestIsRootDiskSpaceAvailableWithoutSpace verifies IsRootDiskSpaceAvailable results when
- // space is not available.
- func TestIsRootDiskSpaceAvailableWithoutSpace(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- policy.RootFreeDiskMB = 10
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- assert.NoError(err)
- // 9MB available
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 990 * mb,
- Capacity: 1000 * mb,
- Available: 9 * mb,
- }, nil)
- ok, err := dm.IsRootDiskSpaceAvailable()
- assert.NoError(err)
- assert.False(ok)
- }
- // TestCache verifies that caching works properly with DiskSpaceAvailable calls
- func TestCache(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- assert.NoError(err)
- mockCadvisor.On("ImagesFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 400 * mb,
- Capacity: 1000 * mb,
- Available: 300 * mb,
- }, nil).Once()
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 500 * mb,
- Capacity: 1000 * mb,
- Available: 500 * mb,
- }, nil).Once()
- // Initial calls which should be recorded in mockCadvisor
- ok, err := dm.IsRuntimeDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- ok, err = dm.IsRootDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- // Get the current count of calls to mockCadvisor
- cadvisorCallCount := len(mockCadvisor.Calls)
- // Checking for space again shouldn't need to mock as cache would serve it.
- ok, err = dm.IsRuntimeDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- ok, err = dm.IsRootDiskSpaceAvailable()
- assert.NoError(err)
- assert.True(ok)
- // Ensure no more calls to the mockCadvisor occurred
- assert.Equal(cadvisorCallCount, len(mockCadvisor.Calls))
- }
- // TestFsInfoError verifies errors are returned by DiskSpaceAvailable calls
- // when FsInfo calls return an error
- func TestFsInfoError(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- policy.RootFreeDiskMB = 10
- dm, err := newDiskSpaceManager(mockCadvisor, policy)
- assert.NoError(err)
- mockCadvisor.On("ImagesFsInfo").Return(cadvisorapi.FsInfo{}, fmt.Errorf("can't find fs"))
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{}, fmt.Errorf("EBUSY"))
- ok, err := dm.IsRuntimeDiskSpaceAvailable()
- assert.Error(err)
- assert.True(ok)
- ok, err = dm.IsRootDiskSpaceAvailable()
- assert.Error(err)
- assert.True(ok)
- }
- // Test_getFSInfo verifies multiple possible cases for getFsInfo.
- func Test_getFsInfo(t *testing.T) {
- assert, policy, mockCadvisor := setUp(t)
- // Sunny day case
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 10 * mb,
- Capacity: 100 * mb,
- Available: 90 * mb,
- }, nil).Once()
- dm := &realDiskSpaceManager{
- cadvisor: mockCadvisor,
- policy: policy,
- cachedInfo: map[string]fsInfo{},
- }
- available, err := dm.isSpaceAvailable("root", 10, dm.cadvisor.RootFsInfo)
- assert.True(available)
- assert.NoError(err)
- // Threshold case
- mockCadvisor = new(cadvisortest.Mock)
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 9 * mb,
- Capacity: 100 * mb,
- Available: 9 * mb,
- }, nil).Once()
- dm = &realDiskSpaceManager{
- cadvisor: mockCadvisor,
- policy: policy,
- cachedInfo: map[string]fsInfo{},
- }
- available, err = dm.isSpaceAvailable("root", 10, dm.cadvisor.RootFsInfo)
- assert.False(available)
- assert.NoError(err)
- // Frozen case
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 9 * mb,
- Capacity: 10 * mb,
- Available: 500 * mb,
- }, nil).Once()
- dm = &realDiskSpaceManager{
- cadvisor: mockCadvisor,
- policy: policy,
- cachedInfo: map[string]fsInfo{},
- }
- available, err = dm.isSpaceAvailable("root", 10, dm.cadvisor.RootFsInfo)
- assert.True(available)
- assert.NoError(err)
- // Capacity error case
- mockCadvisor = new(cadvisortest.Mock)
- mockCadvisor.On("RootFsInfo").Return(cadvisorapi.FsInfo{
- Usage: 9 * mb,
- Capacity: 0,
- Available: 500 * mb,
- }, nil).Once()
- dm = &realDiskSpaceManager{
- cadvisor: mockCadvisor,
- policy: policy,
- cachedInfo: map[string]fsInfo{},
- }
- available, err = dm.isSpaceAvailable("root", 10, dm.cadvisor.RootFsInfo)
- assert.True(available)
- assert.Error(err)
- assert.Contains(fmt.Sprintf("%s", err), "could not determine capacity")
- // Available error case skipped as v2.FSInfo uses uint64 and this
- // can not be less than 0
- }
|