// NOTE: This is a snapshot of the schema used to serialize V1 database info
// in the 2.0.x line of InfluxDB. The copy is here so we can support backing
// up from older DB versions, it's not intended to be kept up-to-date.
syntax = "proto2";

package internal;
option go_package = ".;backup_restore";

//========================================================================
//
// Metadata
//
//========================================================================

message Data {
  required uint64 Term = 1;
  required uint64 Index = 2;
  required uint64 ClusterID = 3;

  repeated NodeInfo Nodes = 4;
  repeated DatabaseInfo Databases = 5;
  repeated UserInfo Users = 6;

  required uint64 MaxNodeID = 7;
  required uint64 MaxShardGroupID = 8;
  required uint64 MaxShardID = 9;

  // added for 0.10.0
  repeated NodeInfo DataNodes = 10;
  repeated NodeInfo MetaNodes = 11;
}

message NodeInfo {
  required uint64 ID = 1;
  required string Host = 2;
  optional string TCPHost = 3;
}

message DatabaseInfo {
  required string Name = 1;
  required string DefaultRetentionPolicy = 2;
  repeated RetentionPolicyInfo RetentionPolicies = 3;
  repeated ContinuousQueryInfo ContinuousQueries = 4;
}

message RetentionPolicySpec {
  optional string Name               = 1;
  optional int64  Duration           = 2;
  optional int64  ShardGroupDuration = 3;
  optional uint32 ReplicaN           = 4;
}

message RetentionPolicyInfo {
  required string Name = 1;
  required int64 Duration = 2;
  required int64 ShardGroupDuration = 3;
  required uint32 ReplicaN = 4;
  repeated ShardGroupInfo ShardGroups = 5;
  repeated SubscriptionInfo Subscriptions = 6;
}

message ShardGroupInfo {
  required uint64 ID = 1;
  required int64 StartTime = 2;
  required int64 EndTime = 3;
  required int64 DeletedAt = 4;
  repeated ShardInfo Shards = 5;
  optional int64 TruncatedAt = 6;
}

message ShardInfo {
  required uint64 ID = 1;
  repeated uint64 OwnerIDs = 2 [deprecated=true];
  repeated ShardOwner Owners = 3;
}

message SubscriptionInfo{
  required string Name = 1;
  required string Mode = 2;
  repeated string Destinations = 3;
}

message ShardOwner {
  required uint64 NodeID = 1;
}

message ContinuousQueryInfo {
  required string Name = 1;
  required string Query = 2;
}

message UserInfo {
  required string Name = 1;
  required string Hash = 2;
  required bool Admin = 3;
  repeated UserPrivilege Privileges = 4;
}

message UserPrivilege {
  required string Database = 1;
  required int32 Privilege = 2;
}


//========================================================================
//
// COMMANDS
//
//========================================================================

message Command {
  extensions 100 to max;

  enum Type {
    CreateNodeCommand                = 1;
    DeleteNodeCommand                = 2;
    CreateDatabaseCommand            = 3;
    DropDatabaseCommand              = 4;
    CreateRetentionPolicyCommand     = 5;
    DropRetentionPolicyCommand       = 6;
    SetDefaultRetentionPolicyCommand = 7;
    UpdateRetentionPolicyCommand     = 8;
    CreateShardGroupCommand          = 9;
    DeleteShardGroupCommand          = 10;
    CreateContinuousQueryCommand     = 11;
    DropContinuousQueryCommand       = 12;
    CreateUserCommand                = 13;
    DropUserCommand                  = 14;
    UpdateUserCommand                = 15;
    SetPrivilegeCommand              = 16;
    SetDataCommand                   = 17;
    SetAdminPrivilegeCommand         = 18;
    UpdateNodeCommand                = 19;
    CreateSubscriptionCommand        = 21;
    DropSubscriptionCommand          = 22;
    RemovePeerCommand                = 23;
    CreateMetaNodeCommand            = 24;
    CreateDataNodeCommand            = 25;
    UpdateDataNodeCommand            = 26;
    DeleteMetaNodeCommand            = 27;
    DeleteDataNodeCommand            = 28;
    SetMetaNodeCommand               = 29;
    DropShardCommand                 = 30;
  }

  required Type type = 1;
}

// This isn't used in >= 0.10.0. Kept around for upgrade purposes. Instead
// look at CreateDataNodeCommand and CreateMetaNodeCommand
message CreateNodeCommand {
  extend Command {
    optional CreateNodeCommand command = 101;
  }
  required string Host = 1;
  required uint64 Rand = 2;
}

message DeleteNodeCommand {
  extend Command {
    optional DeleteNodeCommand command = 102;
  }
  required uint64 ID = 1;
  required bool Force = 2;
}

message CreateDatabaseCommand {
  extend Command {
    optional CreateDatabaseCommand command = 103;
  }
  required string Name = 1;
  optional RetentionPolicyInfo RetentionPolicy = 2;
}

message DropDatabaseCommand {
  extend Command {
    optional DropDatabaseCommand command = 104;
  }
  required string Name = 1;
}

message CreateRetentionPolicyCommand {
  extend Command {
    optional CreateRetentionPolicyCommand command = 105;
  }
  required string Database = 1;
  required RetentionPolicyInfo RetentionPolicy = 2;
}

message DropRetentionPolicyCommand {
  extend Command {
    optional DropRetentionPolicyCommand command = 106;
  }
  required string Database = 1;
  required string Name = 2;
}

message SetDefaultRetentionPolicyCommand {
  extend Command {
    optional SetDefaultRetentionPolicyCommand command = 107;
  }
  required string Database = 1;
  required string Name = 2;
}

message UpdateRetentionPolicyCommand {
  extend Command {
    optional UpdateRetentionPolicyCommand command = 108;
  }
  required string Database = 1;
  required string Name = 2;
  optional string NewName = 3;
  optional int64 Duration = 4;
  optional uint32 ReplicaN = 5;
}

message CreateShardGroupCommand {
  extend Command {
    optional CreateShardGroupCommand command = 109;
  }
  required string Database = 1;
  required string Policy = 2;
  required int64 Timestamp = 3;
}

message DeleteShardGroupCommand {
  extend Command {
    optional DeleteShardGroupCommand command = 110;
  }
  required string Database = 1;
  required string Policy = 2;
  required uint64 ShardGroupID = 3;
}

message CreateContinuousQueryCommand {
  extend Command {
    optional CreateContinuousQueryCommand command = 111;
  }
  required string Database = 1;
  required string Name = 2;
  required string Query = 3;
}

message DropContinuousQueryCommand {
  extend Command {
    optional DropContinuousQueryCommand command = 112;
  }
  required string Database = 1;
  required string Name = 2;
}

message CreateUserCommand {
  extend Command {
    optional CreateUserCommand command = 113;
  }
  required string Name = 1;
  required string Hash = 2;
  required bool Admin = 3;
}

message DropUserCommand {
  extend Command {
    optional DropUserCommand command = 114;
  }
  required string Name = 1;
}

message UpdateUserCommand {
  extend Command {
    optional UpdateUserCommand command = 115;
  }
  required string Name = 1;
  required string Hash = 2;
}

message SetPrivilegeCommand {
  extend Command {
    optional SetPrivilegeCommand command = 116;
  }
  required string Username = 1;
  required string Database = 2;
  required int32 Privilege = 3;
}

message SetDataCommand {
  extend Command {
    optional SetDataCommand command = 117;
  }
  required Data Data = 1;
}

message SetAdminPrivilegeCommand {
  extend Command {
    optional SetAdminPrivilegeCommand command = 118;
  }
  required string Username = 1;
  required bool Admin = 2;
}

message UpdateNodeCommand {
  extend Command {
    optional UpdateNodeCommand command = 119;
  }
  required uint64 ID = 1;
  required string Host = 2;
}

message CreateSubscriptionCommand {
  extend Command {
    optional CreateSubscriptionCommand command = 121;
  }
  required string Name = 1;
  required string Database = 2;
  required string RetentionPolicy = 3;
  required string Mode = 4;
  repeated string Destinations = 5;

}

message DropSubscriptionCommand {
  extend Command {
    optional DropSubscriptionCommand command = 122;
  }
  required string Name = 1;
  required string Database = 2;
  required string RetentionPolicy = 3;
}

message RemovePeerCommand {
  extend Command {
    optional RemovePeerCommand command = 123;
  }
  optional uint64 ID = 1;
  required string Addr = 2;
}

message CreateMetaNodeCommand {
  extend Command {
    optional CreateMetaNodeCommand command = 124;
  }
  required string HTTPAddr = 1;
  required string TCPAddr = 2;
  required uint64 Rand = 3;
}

message CreateDataNodeCommand {
  extend Command {
    optional CreateDataNodeCommand command = 125;
  }
  required string HTTPAddr = 1;
  required string TCPAddr = 2;
}

message UpdateDataNodeCommand {
  extend Command {
    optional UpdateDataNodeCommand command = 126;
  }
  required uint64 ID = 1;
  required string Host = 2;
  required string TCPHost = 3;
}

message DeleteMetaNodeCommand {
  extend Command {
    optional DeleteMetaNodeCommand command = 127;
  }
  required uint64 ID = 1;
}

message DeleteDataNodeCommand {
  extend Command {
    optional DeleteDataNodeCommand command = 128;
  }
  required uint64 ID = 1;
}

message Response {
  required bool OK = 1;
  optional string Error = 2;
  optional uint64 Index = 3;
}

// SetMetaNodeCommand is for the initial metanode in a cluster or
// if the single host restarts and its hostname changes, this will update it
message SetMetaNodeCommand {
  extend Command {
    optional SetMetaNodeCommand command = 129;
  }
  required string HTTPAddr = 1;
  required string TCPAddr = 2;
  required uint64 Rand = 3;
}

message DropShardCommand {
  extend Command {
    optional DropShardCommand command = 130;
  }
  required uint64 ID = 1;
}
