/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * These .proto interfaces are private and unstable.
 * Please see http://wiki.apache.org/hadoop/Compatibility
 * for what changes are allowed for a *unstable* .proto interface.
 */
syntax = "proto2";
option java_package = "org.apache.hadoop.hdds.protocol.proto";
option java_outer_classname = "StorageContainerLocationProtocolProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
package hadoop.hdds.container;

import "hdds.proto";

/**
  All functions are dispatched as Request/Response under Ozone.
  if you add newe functions, please add them using same pattern.
*/
message ScmContainerLocationRequest {
  required Type cmdType = 1; // Type of the command

  // A string that identifies this command, we generate  Trace ID in Ozone
  // frontend and this allows us to trace that command all over ozone.
  optional string traceID = 2;
  optional uint32 version = 3;

  optional ContainerRequestProto containerRequest = 6;
  optional GetContainerRequestProto getContainerRequest = 7;
  optional GetContainerWithPipelineRequestProto getContainerWithPipelineRequest = 8;
  optional SCMListContainerRequestProto scmListContainerRequest = 9;
  optional SCMDeleteContainerRequestProto scmDeleteContainerRequest = 10;
  optional NodeQueryRequestProto nodeQueryRequest = 11;
  optional SCMCloseContainerRequestProto scmCloseContainerRequest = 12;
  optional PipelineRequestProto pipelineRequest = 13;
  optional ListPipelineRequestProto listPipelineRequest = 14;
  optional ActivatePipelineRequestProto activatePipelineRequest = 15;
  optional DeactivatePipelineRequestProto deactivatePipelineRequest = 16;
  optional ClosePipelineRequestProto closePipelineRequest = 17;
  optional GetScmInfoRequestProto getScmInfoRequest = 18;
  optional InSafeModeRequestProto inSafeModeRequest = 19;
  optional ForceExitSafeModeRequestProto forceExitSafeModeRequest = 20;
  optional StartReplicationManagerRequestProto startReplicationManagerRequest = 21;
  optional StopReplicationManagerRequestProto stopReplicationManagerRequest = 22;
  optional ReplicationManagerStatusRequestProto seplicationManagerStatusRequest = 23;
  optional GetPipelineRequestProto getPipelineRequest = 24;
  optional GetContainerWithPipelineBatchRequestProto getContainerWithPipelineBatchRequest = 25;
  optional GetSafeModeRuleStatusesRequestProto getSafeModeRuleStatusesRequest = 26;
  optional DecommissionNodesRequestProto decommissionNodesRequest = 27;
  optional RecommissionNodesRequestProto recommissionNodesRequest = 28;
  optional StartMaintenanceNodesRequestProto startMaintenanceNodesRequest = 29;
  optional DatanodeUsageInfoRequestProto DatanodeUsageInfoRequest = 30;
  optional GetExistContainerWithPipelinesInBatchRequestProto getExistContainerWithPipelinesInBatchRequest = 31;
  optional GetContainerTokenRequestProto containerTokenRequest = 32;
  optional StartContainerBalancerRequestProto startContainerBalancerRequest = 33;
  optional StopContainerBalancerRequestProto stopContainerBalancerRequest = 34;
  optional ContainerBalancerStatusRequestProto containerBalancerStatusRequest = 35;
  optional FinalizeScmUpgradeRequestProto finalizeScmUpgradeRequest = 36;
  optional QueryUpgradeFinalizationProgressRequestProto queryUpgradeFinalizationProgressRequest = 37;
  optional GetContainerCountRequestProto getContainerCountRequest = 38;
  optional GetContainerReplicasRequestProto getContainerReplicasRequest = 39;
  optional ReplicationManagerReportRequestProto replicationManagerReportRequest = 40;
  optional ResetDeletedBlockRetryCountRequestProto resetDeletedBlockRetryCountRequest = 41 [deprecated=true];
  optional TransferLeadershipRequestProto transferScmLeadershipRequest = 42;
  optional GetFailedDeletedBlocksTxnRequestProto getFailedDeletedBlocksTxnRequest = 43 [deprecated=true];
  optional DecommissionScmRequestProto decommissionScmRequest = 44;
  optional SingleNodeQueryRequestProto singleNodeQueryRequest = 45;
  optional GetContainersOnDecomNodeRequestProto getContainersOnDecomNodeRequest = 46;
  optional GetMetricsRequestProto getMetricsRequest = 47;
  optional ContainerBalancerStatusInfoRequestProto containerBalancerStatusInfoRequest = 48;
  optional ReconcileContainerRequestProto reconcileContainerRequest = 49;
  optional GetDeletedBlocksTxnSummaryRequestProto getDeletedBlocksTxnSummaryRequest = 50;
  optional SCMListContainerIDsRequestProto scmListContainerIDsRequest = 51;
  optional SuppressContainerRequestProto suppressContainerRequest = 52;
}

message ScmContainerLocationResponse {
  required Type cmdType = 1; // Type of the command

  optional string traceID = 2;

  optional bool success = 3 [default = true];

  optional string message = 4;

  required Status status = 5;

  optional ContainerResponseProto containerResponse = 6;
  optional GetContainerResponseProto getContainerResponse = 7;
  optional GetContainerWithPipelineResponseProto getContainerWithPipelineResponse = 8;
  optional SCMListContainerResponseProto scmListContainerResponse = 9;
  optional SCMDeleteContainerResponseProto scmDeleteContainerResponse = 10;
  optional NodeQueryResponseProto nodeQueryResponse = 11;
  optional SCMCloseContainerResponseProto scmCloseContainerResponse = 12;
  optional PipelineResponseProto pipelineResponse = 13;
  optional ListPipelineResponseProto listPipelineResponse = 14;
  optional ActivatePipelineResponseProto activatePipelineResponse = 15;
  optional DeactivatePipelineResponseProto deactivatePipelineResponse = 16;
  optional ClosePipelineResponseProto closePipelineResponse = 17;
  optional GetScmInfoResponseProto getScmInfoResponse = 18;
  optional InSafeModeResponseProto inSafeModeResponse = 19;
  optional ForceExitSafeModeResponseProto forceExitSafeModeResponse = 20;
  optional StartReplicationManagerResponseProto startReplicationManagerResponse = 21;
  optional StopReplicationManagerResponseProto stopReplicationManagerResponse = 22;
  optional ReplicationManagerStatusResponseProto replicationManagerStatusResponse = 23;
  optional GetPipelineResponseProto getPipelineResponse = 24;
  optional GetContainerWithPipelineBatchResponseProto getContainerWithPipelineBatchResponse = 25;
  optional GetSafeModeRuleStatusesResponseProto getSafeModeRuleStatusesResponse = 26;
  optional DecommissionNodesResponseProto decommissionNodesResponse = 27;
  optional RecommissionNodesResponseProto recommissionNodesResponse = 28;
  optional StartMaintenanceNodesResponseProto startMaintenanceNodesResponse = 29;
  optional DatanodeUsageInfoResponseProto DatanodeUsageInfoResponse = 30;
  optional GetExistContainerWithPipelinesInBatchResponseProto getExistContainerWithPipelinesInBatchResponse = 31;
  optional GetContainerTokenResponseProto containerTokenResponse = 32;
  optional StartContainerBalancerResponseProto startContainerBalancerResponse = 33;
  optional StopContainerBalancerResponseProto stopContainerBalancerResponse = 34;
  optional ContainerBalancerStatusResponseProto containerBalancerStatusResponse = 35;
  optional FinalizeScmUpgradeResponseProto finalizeScmUpgradeResponse = 36;
  optional QueryUpgradeFinalizationProgressResponseProto queryUpgradeFinalizationProgressResponse = 37;
  optional GetContainerCountResponseProto getContainerCountResponse = 38;
  optional GetContainerReplicasResponseProto getContainerReplicasResponse = 39;
  optional ReplicationManagerReportResponseProto getReplicationManagerReportResponse = 40;
  optional ResetDeletedBlockRetryCountResponseProto resetDeletedBlockRetryCountResponse = 41 [deprecated=true];
  optional TransferLeadershipResponseProto transferScmLeadershipResponse = 42;
  optional GetFailedDeletedBlocksTxnResponseProto getFailedDeletedBlocksTxnResponse = 43 [deprecated=true];
  optional DecommissionScmResponseProto decommissionScmResponse = 44;
  optional SingleNodeQueryResponseProto singleNodeQueryResponse = 45;
  optional GetContainersOnDecomNodeResponseProto getContainersOnDecomNodeResponse = 46;
  optional GetMetricsResponseProto getMetricsResponse = 47;
  optional ContainerBalancerStatusInfoResponseProto containerBalancerStatusInfoResponse = 48;
  optional ReconcileContainerResponseProto reconcileContainerResponse = 49;
  optional GetDeletedBlocksTxnSummaryResponseProto getDeletedBlocksTxnSummaryResponse = 50;
  optional SCMListContainerIDsResponseProto scmListContainerIDsResponse = 51;
  optional SuppressContainerResponseProto suppressContainerResponse = 52;

  enum Status {
    OK = 1;
    CONTAINER_ALREADY_EXISTS = 2;
    CONTAINER_IS_MISSING = 3;
    SCM_NOT_LEADER = 4;
  }
}

enum Type {

  AllocateContainer = 1;
  GetContainer = 2;
  GetContainerWithPipeline = 3;
  ListContainer = 4;
  DeleteContainer = 5;
  QueryNode = 6;
  CloseContainer = 7;
  AllocatePipeline = 8;
  ListPipelines = 9;
  ActivatePipeline = 10;
  DeactivatePipeline = 11;
  ClosePipeline = 12;
  GetScmInfo = 13;
  InSafeMode = 14;
  ForceExitSafeMode = 15;
  StartReplicationManager = 16;
  StopReplicationManager = 17;
  GetReplicationManagerStatus = 18;
  GetPipeline = 19;
  GetContainerWithPipelineBatch = 20;
  GetSafeModeRuleStatuses = 21;
  DecommissionNodes = 22;
  RecommissionNodes = 23;
  StartMaintenanceNodes = 24;
  DatanodeUsageInfo = 25;
  GetExistContainerWithPipelinesInBatch = 26;
  GetContainerToken = 27;
  StartContainerBalancer = 28;
  StopContainerBalancer = 29;
  GetContainerBalancerStatus = 30;
  FinalizeScmUpgrade = 31;
  QueryUpgradeFinalizationProgress = 32;
  GetContainerCount = 33;
  GetContainerReplicas = 34;
  GetReplicationManagerReport = 35;
  ResetDeletedBlockRetryCount = 36;
  GetClosedContainerCount = 37;
  TransferLeadership = 38;
  GetFailedDeletedBlocksTransaction = 39;
  DecommissionScm = 40;
  SingleNodeQuery = 41;
  GetContainersOnDecomNode = 42;
  GetMetrics = 43;
  GetContainerBalancerStatusInfo = 44;
  ReconcileContainer = 45;
  GetDeletedBlocksTransactionSummary = 46;
  ListContainerIDs = 47;
  SuppressContainer = 48;
}

/**
* Request send to SCM asking where the container should be created.
*/
message ContainerRequestProto {
  // Ozone only support replication of either 1 or 3.
  optional ReplicationFactor replicationFactor = 2;
  required ReplicationType  replicationType = 3;
  required string owner = 4;
  optional string traceID = 5;
  optional ECReplicationConfig ecReplicationConfig = 6;
}

/**
 * Reply from SCM indicating that the container.
 */
message ContainerResponseProto {
  enum Error {
    success = 1;
    errorContainerAlreadyExists = 2;
    errorContainerMissing = 3;
    scmNotLeader = 4;
  }
  required Error errorCode = 1;
  required ContainerWithPipeline containerWithPipeline = 2;
  optional string errorMessage = 3;
}

message GetContainerRequestProto {
  required int64 containerID = 1;
  optional string traceID = 2;

}

message GetContainerResponseProto {
  required ContainerInfoProto containerInfo = 1;
}

message GetContainerWithPipelineRequestProto {
  required int64 containerID = 1;
  optional string traceID = 2;

}

message GetContainerWithPipelineResponseProto {
  required ContainerWithPipeline containerWithPipeline = 1;
}

message GetContainerReplicasRequestProto {
  required int64 containerID = 1;
  optional string traceID = 2;
}

message GetContainerReplicasResponseProto {
  repeated SCMContainerReplicaProto containerReplica = 1;
}

message GetContainerWithPipelineBatchRequestProto {
  repeated int64 containerIDs = 1;
  optional string traceID = 2;
}

message GetExistContainerWithPipelinesInBatchRequestProto {
  repeated int64 containerIDs = 1;
  optional string traceID = 2;
}

message GetSafeModeRuleStatusesRequestProto {
}

message SafeModeRuleStatusProto {
  required string ruleName = 1;
  required bool validate = 2;
  required string statusText = 3;
}

message GetSafeModeRuleStatusesResponseProto {
  repeated SafeModeRuleStatusProto safeModeRuleStatusesProto = 1;
}

message GetContainerWithPipelineBatchResponseProto {
  repeated ContainerWithPipeline containerWithPipelines = 1;
}

message GetExistContainerWithPipelinesInBatchResponseProto {
  repeated ContainerWithPipeline containerWithPipelines = 1;
}

message SCMListContainerIDsRequestProto {
  required uint32 count = 1;
  optional ContainerID startContainerID = 2;
  optional LifeCycleState state = 3;
  optional string traceID = 4;
}

message SCMListContainerIDsResponseProto {
  repeated ContainerID containerIDs = 1;
}

message SCMListContainerRequestProto {
  required uint32 count = 1;
  optional uint64 startContainerID = 2;
  optional string traceID = 3;
  optional LifeCycleState state = 4;
  optional ReplicationFactor factor = 5;
  optional ReplicationType type = 6;
  optional ECReplicationConfig ecReplicationConfig = 7;
  optional bool suppressed = 8;
}

message SCMListContainerResponseProto {
  repeated ContainerInfoProto containers = 1;
  optional int64 containerCount = 2;
}

message SCMDeleteContainerRequestProto {
  required int64 containerID = 1;
  optional string traceID = 2;

}

message SCMDeleteContainerResponseProto {
  // Empty response
}

message SCMCloseContainerRequestProto {
  required int64 containerID = 1;
  optional string traceID = 2;
}

message SCMCloseContainerResponseProto {
  enum Status {
    OK = 1;
    CONTAINER_ALREADY_CLOSED = 2;
    CONTAINER_ALREADY_CLOSING = 3;
  }
  optional Status status = 1;
}

/*
 NodeQueryRequest sends a request to SCM asking to send a list of nodes that
 match the NodeState that we are requesting.
*/
message NodeQueryRequestProto {
  optional NodeState state = 1;
  required QueryScope scope = 2;
  optional string poolName = 3; // if scope is pool, then pool name is needed.
  optional string traceID = 4;
  optional NodeOperationalState opState = 5;
}

message NodeQueryResponseProto {
  repeated Node datanodes = 1;
}

message SingleNodeQueryRequestProto {
  required UUID uuid = 1;
}

message SingleNodeQueryResponseProto {
  optional Node datanode = 1;
}

/*
  Datanode usage info request message.
*/
message DatanodeUsageInfoRequestProto {
  optional string ipaddress = 1;
  optional string uuid = 2;
  optional bool mostUsed = 3;
  optional uint32 count = 4;
}

message DatanodeUsageInfoResponseProto {
  repeated DatanodeUsageInfoProto info = 1;
}

/*
  Decommission a list of hosts
*/
message DecommissionNodesRequestProto {
  repeated string hosts = 1;
  optional bool force = 2;
}


message DatanodeAdminErrorResponseProto {
  required string host = 1;
  required string error = 2;
}

message DecommissionNodesResponseProto {
  repeated DatanodeAdminErrorResponseProto failedHosts = 1;
}

/*
  Recommission a list of hosts in maintenance or decommission states
*/
message RecommissionNodesRequestProto {
  repeated string hosts = 1;
}

message RecommissionNodesResponseProto {
  repeated DatanodeAdminErrorResponseProto failedHosts = 1;
}

/*
  Place a list of hosts into maintenance mode
*/
message StartMaintenanceNodesRequestProto {
  repeated string hosts = 1;
  optional int64 endInHours = 2;
  optional bool force = 3;
}

message StartMaintenanceNodesResponseProto {
  repeated DatanodeAdminErrorResponseProto failedHosts = 1;
}

/**
  Request to create a replication pipeline.
 */
message PipelineRequestProto {
  required ReplicationType replicationType = 1;
  required ReplicationFactor replicationFactor = 2;

  // if datanodes are specified then pipelines are created using those
  // datanodes.
  optional NodePool nodePool = 3;
  optional string pipelineID = 4;
  optional string traceID = 5;
}

message PipelineResponseProto {
  enum Error {
    success = 1;
    errorPipelineAlreadyExists = 2;
  }
  required Error errorCode = 1;
  optional Pipeline  pipeline = 2;
  optional string errorMessage = 3;
}

message ListPipelineRequestProto {
  optional string traceID = 1;
}

message ListPipelineResponseProto {
  repeated Pipeline pipelines = 1;
}

message GetPipelineRequestProto {
  required PipelineID pipelineID = 1;
  optional string traceID = 2;
}

message GetPipelineResponseProto {
  required Pipeline pipeline = 1;
}

message GetContainerCountRequestProto {
  optional LifeCycleState state = 1;
}

message GetContainerCountResponseProto {
  required int64 containerCount = 1;
}

message ActivatePipelineRequestProto {
  required PipelineID pipelineID = 1;
  optional string traceID = 2;
}

message ActivatePipelineResponseProto {
}

message DeactivatePipelineRequestProto {
  required PipelineID pipelineID = 1;
  optional string traceID = 2;
}

message DeactivatePipelineResponseProto {
}

message ClosePipelineRequestProto {
  required PipelineID pipelineID = 1;
  optional string traceID = 2;

}

message ClosePipelineResponseProto {
}

message InSafeModeRequestProto {
  optional string traceID = 1;
}

message InSafeModeResponseProto {
  required bool inSafeMode = 1;
}

message ForceExitSafeModeRequestProto {
  optional string traceID = 1;
}

message ForceExitSafeModeResponseProto {
  required bool exitedSafeMode = 1;
}

message StartReplicationManagerRequestProto {
  optional string traceID = 1;
}

message StartReplicationManagerResponseProto {
}

message StopReplicationManagerRequestProto {
  optional string traceID = 1;
}

message StopReplicationManagerResponseProto {
}

message ReplicationManagerStatusRequestProto {
  optional string traceID = 1;
}

message ReplicationManagerStatusResponseProto {
  required bool isRunning = 1;
}

message ReplicationManagerReportRequestProto {
  optional string traceID = 1;
}

message ReplicationManagerReportResponseProto {
  required ReplicationManagerReportProto report = 1;
}

message GetFailedDeletedBlocksTxnRequestProto {
  optional string traceID = 1;
  required int32 count = 2;
  optional int64 startTxId = 3;
}

message GetFailedDeletedBlocksTxnResponseProto {
  repeated DeletedBlocksTransactionInfo deletedBlocksTransactions = 1;
}

message ResetDeletedBlockRetryCountRequestProto {
  optional string traceID = 1;
  repeated int64 transactionId = 2;
}

message ResetDeletedBlockRetryCountResponseProto {
  required int32 resetCount = 1;
}

message GetDeletedBlocksTxnSummaryRequestProto {
}

message GetDeletedBlocksTxnSummaryResponseProto {
  optional DeletedBlocksTransactionSummary summary = 1;
}

message FinalizeScmUpgradeRequestProto {
  required string upgradeClientId = 1;
}
message FinalizeScmUpgradeResponseProto {
  required hadoop.hdds.UpgradeFinalizationStatus status = 1;
}
message QueryUpgradeFinalizationProgressRequestProto {
  required string upgradeClientId = 1;
  optional bool takeover = 2;
  optional bool readonly = 3;
}
message QueryUpgradeFinalizationProgressResponseProto {
  required hadoop.hdds.UpgradeFinalizationStatus status = 1;
}

message ContainerTokenSecretProto {
    required string ownerId = 1;
    required ContainerID containerId = 2;
    required uint64 expiryDate = 3;
    optional string certSerialId = 4 [deprecated=true];
    optional UUID secretKeyId = 5;
}

message GetContainerTokenRequestProto {
  required ContainerID containerID = 1;
}

message GetContainerTokenResponseProto {
  required TokenProto token = 1;
}

message StartContainerBalancerRequestProto {
  optional string traceID = 1;
  optional double threshold = 2;
  optional int32 idleiterations = 3 [deprecated = true];
  optional double maxDatanodesRatioToInvolvePerIteration = 4 [deprecated =
      true];
  optional int64 maxSizeToMovePerIterationInGB = 5;
  optional int64 maxSizeEnteringTargetInGB = 6;
  optional int64 maxSizeLeavingSourceInGB = 7;
  optional int32 maxDatanodesPercentageToInvolvePerIteration = 8;
  optional int32 iterations = 9;
  optional int32 balancingInterval = 10;
  optional int32 moveTimeout = 11;
  optional int32 moveReplicationTimeout = 12;
  optional bool networkTopologyEnable = 13;
  optional string includeNodes = 14;
  optional string excludeNodes = 15;
  optional string excludeContainers = 16;
  optional string includeContainers = 17;
}

message StartContainerBalancerResponseProto {
  required bool start = 1;
  optional string message = 2;
}

message StopContainerBalancerRequestProto {
  optional string traceID = 1;
}

message StopContainerBalancerResponseProto {
}

message ContainerBalancerStatusRequestProto {
  optional string traceID = 1;
}

message ContainerBalancerStatusResponseProto {
  required bool isRunning = 1;
}

message ContainerBalancerStatusInfoRequestProto {
  optional string traceID = 1;
}

message ContainerBalancerStatusInfoResponseProto {
  optional bool isRunning = 1;
  optional ContainerBalancerStatusInfoProto containerBalancerStatusInfo = 2;
}
message ContainerBalancerStatusInfoProto {
  optional uint64 startedAt = 1;
  optional ContainerBalancerConfigurationProto configuration = 2;
  repeated ContainerBalancerTaskIterationStatusInfoProto iterationsStatusInfo = 3;
}

message ContainerBalancerTaskIterationStatusInfoProto {
  optional int32 iterationNumber = 1;
  optional string iterationResult = 2;
  optional int64 sizeScheduledForMove = 3;
  optional int64 dataSizeMoved = 4;
  optional int64 containerMovesScheduled = 5;
  optional int64 containerMovesCompleted = 6;
  optional int64 containerMovesFailed = 7;
  optional int64 containerMovesTimeout = 8;
  repeated NodeTransferInfoProto sizeEnteringNodes = 9;
  repeated NodeTransferInfoProto sizeLeavingNodes = 10;
  optional int64 iterationDuration = 11;
}

message NodeTransferInfoProto {
  optional string uuid = 1;
  optional int64 dataVolume = 2;
}

message DecommissionScmRequestProto {
  required string scmId = 1;
}

message DecommissionScmResponseProto {
  required bool success = 1;
  optional string errorMsg = 2;
}

message GetContainersOnDecomNodeRequestProto {
  required DatanodeDetailsProto datanodeDetails = 1;
}

message ContainersOnDecomNodeProto {
  required string name = 1;
  repeated ContainerID id = 2;
}

message GetContainersOnDecomNodeResponseProto {
  repeated ContainersOnDecomNodeProto containersOnDecomNode = 1;
}

message GetMetricsRequestProto {
  optional string query = 1;
}

message GetMetricsResponseProto {
  optional string metricsJson = 1;
}

message ReconcileContainerRequestProto {
  required int64 containerID = 1;
}

message ReconcileContainerResponseProto {
}

message SuppressContainerRequestProto {
  repeated int64 containerIDs = 1;
  optional bool suppress = 2;
}

message SuppressContainerResponseProto {
  // Container IDs that failed to suppress or unsuppress. Empty if all succeeded.
  repeated int64 failedContainerIDs = 1;
}

/**
 * Protocol used from an HDFS node to StorageContainerManager.  See the request
 * and response messages for details of the RPC calls.
 */
service StorageContainerLocationProtocolService {
  rpc submitRequest (ScmContainerLocationRequest) returns (ScmContainerLocationResponse);
}
