Files
docker-cli/components/engine/vendor/github.com/docker/swarmkit/manager/dirty.go
Yong Tang 8c590c8511 Update SwarmKit to 78ae345f449ac69aa741c762df7e5f0020f70275
This fix updates SwarmKit to 78ae345f449ac69aa741c762df7e5f0020f70275
(from 037b4913929019d44bc927870bf2d92ce9ca261f)

The following issues in docker are related
- Can not update service in host publish mode (#30199) (fixed)
- Add `ReadonlyRootfs` in ContainerSpec for `--read-only` (#29972) (needed)
- Explicitly disallow network pluginv1 creation in swarm mode
  (See discussion in docker/swarmkit/pull/1899, docker/swarmkit/pull/1894,
  and docker/docker/pull/30332#issuecomment-274277948)

This fix fixes #30199

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: 849816dd0fbd70d0e46567fffc7416b667bff9b5
Component: engine
2017-01-29 08:11:26 -08:00

58 lines
1.7 KiB
Go

package manager
import (
"reflect"
"github.com/docker/swarmkit/api"
"github.com/docker/swarmkit/manager/state/store"
)
// IsStateDirty returns true if any objects have been added to raft which make
// the state "dirty". Currently, the existence of any object other than the
// default cluster or the local node implies a dirty state.
func (m *Manager) IsStateDirty() (bool, error) {
var (
storeSnapshot *api.StoreSnapshot
err error
)
m.raftNode.MemoryStore().View(func(readTx store.ReadTx) {
storeSnapshot, err = m.raftNode.MemoryStore().Save(readTx)
})
if err != nil {
return false, err
}
// Check Nodes and Clusters fields.
nodeID := m.config.SecurityConfig.ClientTLSCreds.NodeID()
if len(storeSnapshot.Nodes) > 1 || (len(storeSnapshot.Nodes) == 1 && storeSnapshot.Nodes[0].ID != nodeID) {
return true, nil
}
clusterID := m.config.SecurityConfig.ClientTLSCreds.Organization()
if len(storeSnapshot.Clusters) > 1 || (len(storeSnapshot.Clusters) == 1 && storeSnapshot.Clusters[0].ID != clusterID) {
return true, nil
}
// Use reflection to check that other fields don't have values. This
// lets us implement a whitelist-type approach, where we don't need to
// remember to add individual types here.
val := reflect.ValueOf(*storeSnapshot)
numFields := val.NumField()
for i := 0; i != numFields; i++ {
field := val.Field(i)
structField := val.Type().Field(i)
if structField.Type.Kind() != reflect.Slice {
panic("unexpected field type in StoreSnapshot")
}
if structField.Name != "Nodes" && structField.Name != "Clusters" && field.Len() != 0 {
// One of the other data types has an entry
return true, nil
}
}
return false, nil
}