package org.apache.helix.tools;

/*
 * 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.
 */

import java.util.Collections;
import java.util.List;

import org.apache.helix.manager.zk.client.HelixZkClient;

/**
 * Please use the class is in tools.ClusterVerifiers.
 */
@Deprecated
public class ClusterLiveNodesVerifier extends ClusterVerifier {

  final List<String> _expectSortedLiveNodes; // always sorted

  public ClusterLiveNodesVerifier(HelixZkClient zkclient, String clusterName,
      List<String> expectLiveNodes) {
    super(zkclient, clusterName);
    _expectSortedLiveNodes = expectLiveNodes;
    Collections.sort(_expectSortedLiveNodes);
  }

  @Override
  public boolean verify() throws Exception {
    List<String> actualLiveNodes = _accessor.getChildNames(_keyBuilder.liveInstances());
    Collections.sort(actualLiveNodes);
    return _expectSortedLiveNodes.equals(actualLiveNodes);
  }

}
