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 }