/*
 * 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.hdds.conf.ConfigurationSource;
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(ConfigurationSource 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);
  }
}
