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

package org.apache.hadoop.hdds.scm.safemode;

import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps;
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes;

/**
 * Safe mode pre-check for SCM operations.
 * */
public class SafeModePrecheck implements Precheck<ScmOps> {

  private AtomicBoolean inSafeMode;
  public static final String PRECHECK_TYPE = "SafeModePrecheck";

  public SafeModePrecheck(Configuration conf) {
    boolean safeModeEnabled = conf.getBoolean(
        HddsConfigKeys.HDDS_SCM_SAFEMODE_ENABLED,
        HddsConfigKeys.HDDS_SCM_SAFEMODE_ENABLED_DEFAULT);
    if (safeModeEnabled) {
      inSafeMode = new AtomicBoolean(true);
    } else {
      inSafeMode = new AtomicBoolean(false);
    }
  }

  @Override
  public boolean check(ScmOps op) throws SCMException {
    if (inSafeMode.get() && SafeModeRestrictedOps
        .isRestrictedInSafeMode(op)) {
      throw new SCMException("SafeModePrecheck failed for " + op,
          ResultCodes.SAFE_MODE_EXCEPTION);
    }
    return inSafeMode.get();
  }

  @Override
  public String type() {
    return PRECHECK_TYPE;
  }

  public boolean isInSafeMode() {
    return inSafeMode.get();
  }

  public void setInSafeMode(boolean inSafeMode) {
    this.inSafeMode.set(inSafeMode);
  }
}
