dirty.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package manager
  2. import (
  3. "reflect"
  4. "github.com/docker/swarmkit/api"
  5. "github.com/docker/swarmkit/manager/state/store"
  6. )
  7. // IsStateDirty returns true if any objects have been added to raft which make
  8. // the state "dirty". Currently, the existence of any object other than the
  9. // default cluster or the local node implies a dirty state.
  10. func (m *Manager) IsStateDirty() (bool, error) {
  11. var (
  12. storeSnapshot *api.StoreSnapshot
  13. err error
  14. )
  15. m.raftNode.MemoryStore().View(func(readTx store.ReadTx) {
  16. storeSnapshot, err = m.raftNode.MemoryStore().Save(readTx)
  17. })
  18. if err != nil {
  19. return false, err
  20. }
  21. // Check Nodes and Clusters fields.
  22. nodeID := m.config.SecurityConfig.ClientTLSCreds.NodeID()
  23. if len(storeSnapshot.Nodes) > 1 || (len(storeSnapshot.Nodes) == 1 && storeSnapshot.Nodes[0].ID != nodeID) {
  24. return true, nil
  25. }
  26. clusterID := m.config.SecurityConfig.ClientTLSCreds.Organization()
  27. if len(storeSnapshot.Clusters) > 1 || (len(storeSnapshot.Clusters) == 1 && storeSnapshot.Clusters[0].ID != clusterID) {
  28. return true, nil
  29. }
  30. // Use reflection to check that other fields don't have values. This
  31. // lets us implement a whitelist-type approach, where we don't need to
  32. // remember to add individual types here.
  33. val := reflect.ValueOf(*storeSnapshot)
  34. numFields := val.NumField()
  35. for i := 0; i != numFields; i++ {
  36. field := val.Field(i)
  37. structField := val.Type().Field(i)
  38. if structField.Type.Kind() != reflect.Slice {
  39. panic("unexpected field type in StoreSnapshot")
  40. }
  41. if structField.Name != "Nodes" && structField.Name != "Clusters" && structField.Name != "Networks" && field.Len() != 0 {
  42. // One of the other data types has an entry
  43. return true, nil
  44. }
  45. }
  46. return false, nil
  47. }