github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/dirty_test.go (about)

     1  package manager
     2  
     3  import (
     4  	"context"
     5  	"io/ioutil"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/docker/swarmkit/api"
    10  	"github.com/docker/swarmkit/ca"
    11  	"github.com/docker/swarmkit/ca/testutils"
    12  	"github.com/docker/swarmkit/manager/state"
    13  	"github.com/docker/swarmkit/manager/state/store"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestIsStateDirty(t *testing.T) {
    19  	ctx := context.Background()
    20  
    21  	temp, err := ioutil.TempFile("", "test-socket")
    22  	assert.NoError(t, err)
    23  	assert.NoError(t, temp.Close())
    24  	assert.NoError(t, os.Remove(temp.Name()))
    25  
    26  	defer os.RemoveAll(temp.Name())
    27  
    28  	stateDir, err := ioutil.TempDir("", "test-raft")
    29  	assert.NoError(t, err)
    30  	defer os.RemoveAll(stateDir)
    31  
    32  	tc := testutils.NewTestCA(t, func(p ca.CertPaths) *ca.KeyReadWriter {
    33  		return ca.NewKeyReadWriter(p, []byte("kek"), nil)
    34  	})
    35  	defer tc.Stop()
    36  
    37  	managerSecurityConfig, err := tc.NewNodeConfig(ca.ManagerRole)
    38  	assert.NoError(t, err)
    39  
    40  	m, err := New(&Config{
    41  		RemoteAPI:        &RemoteAddrs{ListenAddr: "127.0.0.1:0"},
    42  		ControlAPI:       temp.Name(),
    43  		StateDir:         stateDir,
    44  		SecurityConfig:   managerSecurityConfig,
    45  		AutoLockManagers: true,
    46  		UnlockKey:        []byte("kek"),
    47  		RootCAPaths:      tc.Paths.RootCA,
    48  	})
    49  	assert.NoError(t, err)
    50  	assert.NotNil(t, m)
    51  
    52  	go m.Run(ctx)
    53  	defer m.Stop(ctx, false)
    54  
    55  	// State should never be dirty just after creating the manager
    56  	isDirty, err := m.IsStateDirty()
    57  	assert.NoError(t, err)
    58  	assert.False(t, isDirty)
    59  
    60  	// Wait for cluster and node to be created.
    61  	watch, cancel := state.Watch(m.raftNode.MemoryStore().WatchQueue())
    62  	defer cancel()
    63  	<-watch
    64  	<-watch
    65  
    66  	// Updating the node should not cause the state to become dirty
    67  	assert.NoError(t, m.raftNode.MemoryStore().Update(func(tx store.Tx) error {
    68  		node := store.GetNode(tx, m.config.SecurityConfig.ClientTLSCreds.NodeID())
    69  		require.NotNil(t, node)
    70  		node.Spec.Availability = api.NodeAvailabilityPause
    71  		return store.UpdateNode(tx, node)
    72  	}))
    73  	isDirty, err = m.IsStateDirty()
    74  	assert.NoError(t, err)
    75  	assert.False(t, isDirty)
    76  
    77  	// Adding a service should cause the state to become dirty
    78  	assert.NoError(t, m.raftNode.MemoryStore().Update(func(tx store.Tx) error {
    79  		return store.CreateService(tx, &api.Service{ID: "foo"})
    80  	}))
    81  	isDirty, err = m.IsStateDirty()
    82  	assert.NoError(t, err)
    83  	assert.True(t, isDirty)
    84  }