001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019package org.apache.hadoop.hbase.chaos.factories;
020
021import org.apache.hadoop.hbase.chaos.actions.Action;
022import org.apache.hadoop.hbase.chaos.actions.AddCPULoadAction;
023import org.apache.hadoop.hbase.chaos.actions.CorruptPacketsCommandAction;
024import org.apache.hadoop.hbase.chaos.actions.DelayPacketsCommandAction;
025import org.apache.hadoop.hbase.chaos.actions.DumpClusterStatusAction;
026import org.apache.hadoop.hbase.chaos.actions.DuplicatePacketsCommandAction;
027import org.apache.hadoop.hbase.chaos.actions.FillDiskCommandAction;
028import org.apache.hadoop.hbase.chaos.actions.LosePacketsCommandAction;
029import org.apache.hadoop.hbase.chaos.actions.ReorderPacketsCommandAction;
030import org.apache.hadoop.hbase.chaos.monkies.ChaosMonkey;
031import org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey;
032import org.apache.hadoop.hbase.chaos.policies.PeriodicRandomActionPolicy;
033
034/**
035 * A chaos monkey to create distributed cluster related issues, requires a user with
036 * passwordless ssh access to the cluster and sudo privileges.
037 */
038public class DistributedIssuesMonkeyFactory extends MonkeyFactory {
039
040  private long action1Period;
041  private long action2Period;
042
043  private long cpuLoadDuration;
044  private long cpuLoadProcesses;
045  private long networkIssueTimeout;
046  private long networkIssueDuration;
047  private float networkIssueRation;
048  private long networkIssueDelay;
049  private String networkIssueInterface;
050  private long fillDiskTimeout;
051  private String fillDiskPath;
052  private long fillDiskFileSize;
053  private long fillDiskIssueduration;
054
055  @Override public ChaosMonkey build() {
056    loadProperties();
057
058    Action[] actions1 = new Action[] {
059      new AddCPULoadAction(cpuLoadDuration, cpuLoadProcesses, networkIssueTimeout),
060      new CorruptPacketsCommandAction(networkIssueRation, networkIssueDuration,
061          networkIssueTimeout, networkIssueInterface),
062      new DuplicatePacketsCommandAction(networkIssueRation, networkIssueDuration,
063          networkIssueTimeout, networkIssueInterface),
064      new LosePacketsCommandAction(networkIssueRation, networkIssueDuration,
065          networkIssueTimeout, networkIssueInterface),
066      new DelayPacketsCommandAction(networkIssueDelay, networkIssueDuration,
067          networkIssueTimeout, networkIssueInterface),
068      new ReorderPacketsCommandAction(networkIssueRation, networkIssueDuration,
069          networkIssueDelay, networkIssueTimeout, networkIssueInterface),
070      new FillDiskCommandAction(fillDiskFileSize, fillDiskIssueduration, fillDiskPath,
071          fillDiskTimeout)};
072
073    // Action to log more info for debugging
074    Action[] actions2 = new Action[] {new DumpClusterStatusAction()};
075
076    return new PolicyBasedChaosMonkey(util, new PeriodicRandomActionPolicy(action1Period, actions1),
077        new PeriodicRandomActionPolicy(action2Period, actions2));
078  }
079
080  private void loadProperties() {
081    action1Period = Long.parseLong(this.properties
082        .getProperty(MonkeyConstants.PERIODIC_ACTION1_PERIOD,
083            MonkeyConstants.DEFAULT_PERIODIC_ACTION1_PERIOD + ""));
084    action2Period = Long.parseLong(this.properties
085        .getProperty(MonkeyConstants.PERIODIC_ACTION2_PERIOD,
086            MonkeyConstants.DEFAULT_PERIODIC_ACTION2_PERIOD + ""));
087    cpuLoadDuration = Long.parseLong(this.properties.getProperty(
088        MonkeyConstants.CPU_LOAD_DURATION,
089        MonkeyConstants.DEFAULT_CPU_LOAD_DURATION + ""));
090    cpuLoadProcesses = Long.parseLong(this.properties.getProperty(
091        MonkeyConstants.CPU_LOAD_PROCESSES,
092        MonkeyConstants.DEFAULT_CPU_LOAD_PROCESSES + ""));
093    networkIssueTimeout = Long.parseLong(this.properties
094        .getProperty(MonkeyConstants.NETWORK_ISSUE_COMMAND_TIMEOUT,
095            MonkeyConstants.DEFAULT_NETWORK_ISSUE_COMMAND_TIMEOUT + ""));
096    networkIssueDuration = Long.parseLong(this.properties
097        .getProperty(MonkeyConstants.NETWORK_ISSUE_DURATION,
098            MonkeyConstants.DEFAULT_NETWORK_ISSUE_DURATION + ""));
099    networkIssueRation = Float.parseFloat(this.properties
100        .getProperty(MonkeyConstants.NETWORK_ISSUE_RATIO,
101            MonkeyConstants.DEFAULT_NETWORK_ISSUE_RATIO + ""));
102    networkIssueDelay = Long.parseLong(this.properties
103        .getProperty(MonkeyConstants.NETWORK_ISSUE_DELAY,
104            MonkeyConstants.DEFAULT_NETWORK_ISSUE_DELAY + ""));
105    networkIssueInterface = this.properties
106        .getProperty(MonkeyConstants.NETWORK_ISSUE_INTERFACE,
107            MonkeyConstants.DEFAULT_NETWORK_ISSUE_INTERFACE + "");
108    fillDiskTimeout = Long.parseLong(this.properties
109        .getProperty(MonkeyConstants.FILL_DISK_COMMAND_TIMEOUT,
110            MonkeyConstants.DEFAULT_FILL_DISK_COMMAND_TIMEOUT + ""));
111    fillDiskPath = this.properties
112        .getProperty(MonkeyConstants.FILL_DISK_PATH,
113            MonkeyConstants.DEFAULT_FILL_DISK_PATH + "");
114    fillDiskFileSize = Long.parseLong(this.properties
115        .getProperty(MonkeyConstants.FILL_DISK_FILE_SIZE,
116            MonkeyConstants.DEFAULT_FILL_DISK_FILE_SIZE + ""));
117    fillDiskIssueduration = Long.parseLong(this.properties
118        .getProperty(MonkeyConstants.FILL_DISK_ISSUE_DURATION,
119            MonkeyConstants.DEFAULT_FILL_DISK_ISSUE_DURATION + ""));
120  }
121}