Support
Quality
Security
License
Reuse
kandi has reviewed SimianArmy and discovered the below as its top functions. This is intended to give you an instant insight into SimianArmy implemented functionality, and help decide if they suit your requirements.
Tools for keeping your cloud operating in top form. Chaos Monkey is a resiliency tool that helps applications tolerate random instance failures.
index out of range while attempting to write to file
n := strings.TrimSpace(a[1])
v := strings.TrimSpace(a[2])
QUESTION
index out of range while attempting to write to file
Asked 2018-Feb-14 at 08:30I believe the issue is that the buffer isn't getting flushed but am not certain, p
Error
bash-4.4$ ./golang-updateprops -f chaosmonkey.config
panic: runtime error: index out of range
goroutine 1 [running]:
main.ingest(0x7ffeefbff700, 0x12, 0x0, 0x0)
#/golang-updateprops/update_properties.go:98 +0xa9d
main.main()
#/golang-updateprops/update_properties.go:121 +0xb6
Code
package main
import (
"strings"
"bufio"
"fmt"
"regexp"
"flag"
"os"
"io"
"bytes"
)
var (
filename string
)
func isCommentOrBlank(line string) bool {
return strings.HasPrefix(line, "#") || "" == strings.TrimSpace(line)
}
func fileExists(filename string) bool {
if _, err := os.Stat(filename); err == nil {
return true
}
return false
}
func limitLength(s string, length int) string {
if len(s) < length {
return s
}
return s[:length]
}
func padWithSpace(str, pad string, length int) string {
for {
str += pad
if len(str) > length {
return str[0:length]
}
}
}
func ingest(filename string) (err error) {
file, err := os.OpenFile(filename, os.O_RDWR, 0666)
defer file.Close()
if err != nil {
return err
}
reader := bufio.NewReader(file) // Start reading from the file with a reader.
for {
var buffer bytes.Buffer
var l []byte
var isPrefix bool
for {
l, isPrefix, err = reader.ReadLine()
buffer.Write(l)
if !isPrefix { // If we've reached the end of the line or we're at the EOF, break
break
}
}
if err == io.EOF || err != nil {
break
}
line := buffer.String()
pattern := regexp.MustCompile(`^#([^=]+)=(.+)$`)
matches := pattern.FindAllStringSubmatch(line, -1) // matches is [][]string
for _, string := range matches {
n := strings.TrimSpace(string[1])
v := strings.TrimSpace(string[2])
e := strings.ToLower(strings.Replace(n, ".", "/", -1))
// newline creation for if block
nl := "{{if exists \"/" + e + "\" -}}\n"
nl += padWithSpace(n, " ", 80) + " = {{getv \"" + e + "\" \"" + v + "\"}}\n"
nl += "{{end -}}\n"
buffer.WriteString(nl)
file.Sync()
}
// dont proccess comments
if (isCommentOrBlank(line)) {
buffer.WriteString(line)
file.Sync()
} else {
a := strings.Split(line, "=")
n := strings.TrimSpace(a[1])
v := strings.TrimSpace(a[2])
e := strings.ToLower(strings.Replace(n, ".", "/", -1))
nl := padWithSpace(n, " ", 80) + " = {{getv \"" + e + "\" \"" + v + "\"}}\n"
buffer.WriteString(nl)
file.Sync()
}
}
if err != io.EOF {
fmt.Printf(" > Failed!: %v\n", err)
}
return
}
func main() {
flag.StringVar(&filename, "f", "filename", "The file location to be parsed")
flag.Parse()
if !fileExists(filename) {
fmt.Println(" > File does not exist\n")
}
ingest(filename)
}
Config being parsed
# The file contains the properties for Chaos Monkey.
# see documentation at:
# https://github.com/Netflix/SimianArmy/wiki/Configuration
# let chaos run
simianarmy.chaos.enabled = true
# don't allow chaos to kill (ie dryrun mode)
simianarmy.chaos.leashed = true
# set to "false" for Opt-In behavior, "true" for Opt-Out behavior
simianarmy.chaos.ASG.enabled = false
# uncomment this line to use tunable aggression
#simianarmy.client.chaos.class = com.netflix.simianarmy.tunable.TunablyAggressiveChaosMonkey
# default probability for all ASGs
simianarmy.chaos.ASG.probability = 1.0
# increase or decrease the termination limit
simianarmy.chaos.ASG.maxTerminationsPerDay = 1.0
# Strategies
simianarmy.chaos.shutdowninstance.enabled = true
simianarmy.chaos.blockallnetworktraffic.enabled = false
simianarmy.chaos.burncpu.enabled = false
simianarmy.chaos.killprocesses.enabled = false
simianarmy.chaos.nullroute.enabled = false
simianarmy.chaos.failapi.enabled = false
simianarmy.chaos.faildns.enabled = false
simianarmy.chaos.faildynamodb.enabled = false
simianarmy.chaos.fails3.enabled = false
simianarmy.chaos.networkcorruption.enabled = false
simianarmy.chaos.networklatency.enabled = false
simianarmy.chaos.networkloss.enabled = false
# Force-detaching EBS volumes may cause data loss
simianarmy.chaos.detachvolumes.enabled = false
# FillDisk fills the root disk.
# NOTE: This may incur charges for an EBS root volume. See burnmoney option.
simianarmy.chaos.burnio.enabled = false
# BurnIO causes disk activity on the root disk.
# NOTE: This may incur charges for an EBS root volume. See burnmoney option.
simianarmy.chaos.filldisk.enabled = false
# Where we know the chaos strategy will incur charges, we won't run it unless burnmoney is true.
simianarmy.chaos.burnmoney = false
# enable a specific ASG
# simianarmy.chaos.ASG.<asgName>.enabled = true
# simianarmy.chaos.ASG.<asgName>.probability = 1.0
# increase or decrease the termination limit for a specific ASG
# simianarmy.chaos.ASG.<asgName>.maxTerminationsPerDay = 1.0
# Enroll in mandatory terminations. If a group has not had a
# termination within the windowInDays range then it will terminate
# one instance in the group with a 0.5 probability (at some point in
# the next 2 days an instance should be terminated), then
# do nothing again for windowInDays. This forces "enabled" groups
# that have a probability of 0.0 to have terminations periodically.
simianarmy.chaos.mandatoryTermination.enabled = false
simianarmy.chaos.mandatoryTermination.windowInDays = 32
simianarmy.chaos.mandatoryTermination.defaultProbability = 0.5
# Enable notification for Chaos termination for a specific instance group
# simianarmy.chaos.<groupType>.<groupName>.notification.enabled = true
# Set the destination email the termination notification sent to for a specific instance group
# simianarmy.chaos.<groupType>.<groupName>.ownerEmail = foo@bar.com
# Set the source email that sends the termination notification
# simianarmy.chaos.notification.sourceEmail = foo@bar.com
# Enable notification for Chaos termination for all instance groups
#simianarmy.chaos.notification.global.enabled = true
# Set the destination email the termination notification is sent to for all instance groups
#simianarmy.chaos.notification.global.receiverEmail = foo@bar.com
# Set a prefix applied to the subject of all termination notifications
# Probably want to include a trailing space to separate from start of default text
#simianarmy.chaos.notification.subject.prefix = SubjectPrefix
# Set a suffix applied to the subject of all termination notifications
# Probably want to include an escaped space " \ " to separate from end of default text
#simianarmy.chaos.notification.subject.suffix = \ SubjectSuffix
# Set a prefix applied to the body of all termination notifications
# Probably want to include a trailing space to separate from start of default text
#simianarmy.chaos.notification.body.prefix = BodyPrefix
# Set a suffix applied to the body of all termination notifications
# Probably want to include an escaped space " \ " to separate from end of default text
#simianarmy.chaos.notification.body.suffix = \ BodySuffix
# Enable the email subject to be the same as the body, to include terminated instance and group information
#simianarmy.chaos.notification.subject.isBody = true
#set the tag filter on the ASGs to terminate only instances from the ASG with the this tag key and value
#simianarmy.chaos.ASGtag.key = chaos_monkey
#simianarmy.chaos.ASGtag.value = true
ANSWER
Answered 2018-Feb-14 at 04:25The problem seems to be coming from these two lines inside your ingest
function:
n := strings.TrimSpace(a[1])
v := strings.TrimSpace(a[2])
Should that maybe be a[0]
and a[1]
?
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
No vulnerabilities reported
Save this library and start creating your kit
Explore Related Topics
Save this library and start creating your kit