syntax = "proto3";

package docker.cluster.api;

import "types.proto";
import "objects.proto";
import weak "gogoproto/gogo.proto";

// StoreSnapshot is used to store snapshots of the store.
message StoreSnapshot {
	// TODO(aaronl): The current method of assembling a StoreSnapshot
	// structure and marshalling it is not optimal. It may be better to
	// write out nodes, networks, tasks, etc. one at a time to an io.Writer
	// using gogo-protobuf's io.DelimitedWriter. A new value of the version
	// field could support this approach.

	repeated Node nodes = 1;
	repeated Service services = 2;
	repeated Network networks = 3;
	repeated Task tasks = 4;
	repeated Volume volumes = 5;

}

// ClusterSnapshot stores cluster membership information in snapshots.
message ClusterSnapshot {
	repeated RaftNode members = 1;
	repeated uint64 removed = 2;
}

message Snapshot {
	enum Version {
		// V0 is the initial version of the StoreSnapshot message.
		V0 = 0;
	}

	Version version = 1;

	ClusterSnapshot membership = 2 [(gogoproto.nullable) = false];
	StoreSnapshot store = 3 [(gogoproto.nullable) = false];
}
