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}