[refactor/TRA-3693] type:latency to slo and latency field to response-time (#282)

* type:latency to slo and latency field to response-time

* remove comment from import

* Friendly message on ignored rules and format

* formatting

* change conditional to catch negative values and ignore it

* Fix Bug Alon Reported

* sliceUtils to shared
This commit is contained in:
Selton Fiuza 2021-09-29 11:51:03 -03:00 committed by GitHub
parent 26efaa101d
commit c26eb843e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 56 additions and 42 deletions

View File

@ -101,7 +101,7 @@ func MatchRequestPolicy(harEntry har.Entry, service string) (resultPolicyToSend
func PassedValidationRules(rulesMatched []RulesMatched) (bool, int64, int) { func PassedValidationRules(rulesMatched []RulesMatched) (bool, int64, int) {
var numberOfRulesMatched = len(rulesMatched) var numberOfRulesMatched = len(rulesMatched)
var latency int64 = -1 var responseTime int64 = -1
if numberOfRulesMatched == 0 { if numberOfRulesMatched == 0 {
return false, 0, numberOfRulesMatched return false, 0, numberOfRulesMatched
@ -109,15 +109,15 @@ func PassedValidationRules(rulesMatched []RulesMatched) (bool, int64, int) {
for _, rule := range rulesMatched { for _, rule := range rulesMatched {
if rule.Matched == false { if rule.Matched == false {
return false, latency, numberOfRulesMatched return false, responseTime, numberOfRulesMatched
} else { } else {
if strings.ToLower(rule.Rule.Type) == "latency" { if strings.ToLower(rule.Rule.Type) == "responseTime" {
if rule.Rule.Latency < latency || latency == -1 { if rule.Rule.ResponseTime < responseTime || responseTime == -1 {
latency = rule.Rule.Latency responseTime = rule.Rule.ResponseTime
} }
} }
} }
} }
return true, latency, numberOfRulesMatched return true, responseTime, numberOfRulesMatched
} }

View File

@ -76,7 +76,7 @@ func RunMizuTap() {
targetNamespaces := getNamespaces(kubernetesProvider) targetNamespaces := getNamespaces(kubernetesProvider)
if config.Config.IsNsRestrictedMode() { if config.Config.IsNsRestrictedMode() {
if len(targetNamespaces) != 1 || !mizu.Contains(targetNamespaces, config.Config.MizuResourcesNamespace) { if len(targetNamespaces) != 1 || !shared.Contains(targetNamespaces, config.Config.MizuResourcesNamespace) {
logger.Log.Errorf("Not supported mode. Mizu can't resolve IPs in other namespaces when running in namespace restricted mode.\n"+ logger.Log.Errorf("Not supported mode. Mizu can't resolve IPs in other namespaces when running in namespace restricted mode.\n"+
"You can use the same namespace for --%s and --%s", configStructs.NamespacesTapName, config.MizuResourcesNamespaceConfigName) "You can use the same namespace for --%s and --%s", configStructs.NamespacesTapName, config.MizuResourcesNamespaceConfigName)
return return
@ -84,7 +84,7 @@ func RunMizuTap() {
} }
var namespacesStr string var namespacesStr string
if !mizu.Contains(targetNamespaces, mizu.K8sAllNamespaces) { if !shared.Contains(targetNamespaces, mizu.K8sAllNamespaces) {
namespacesStr = fmt.Sprintf("namespaces \"%s\"", strings.Join(targetNamespaces, "\", \"")) namespacesStr = fmt.Sprintf("namespaces \"%s\"", strings.Join(targetNamespaces, "\", \""))
} else { } else {
namespacesStr = "all namespaces" namespacesStr = "all namespaces"
@ -99,7 +99,7 @@ func RunMizuTap() {
if len(state.currentlyTappedPods) == 0 { if len(state.currentlyTappedPods) == 0 {
var suggestionStr string var suggestionStr string
if !mizu.Contains(targetNamespaces, mizu.K8sAllNamespaces) { if !shared.Contains(targetNamespaces, mizu.K8sAllNamespaces) {
suggestionStr = ". Select a different namespace with -n or tap all namespaces with -A" suggestionStr = ". Select a different namespace with -n or tap all namespaces with -A"
} }
logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Did not find any pods matching the regex argument%s", suggestionStr)) logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Did not find any pods matching the regex argument%s", suggestionStr))
@ -639,7 +639,7 @@ func getNamespaces(kubernetesProvider *kubernetes.Provider) []string {
if config.Config.Tap.AllNamespaces { if config.Config.Tap.AllNamespaces {
return []string{mizu.K8sAllNamespaces} return []string{mizu.K8sAllNamespaces}
} else if len(config.Config.Tap.Namespaces) > 0 { } else if len(config.Config.Tap.Namespaces) > 0 {
return mizu.Unique(config.Config.Tap.Namespaces) return shared.Unique(config.Config.Tap.Namespaces)
} else { } else {
return []string{kubernetesProvider.CurrentNamespace()} return []string{kubernetesProvider.CurrentNamespace()}
} }

View File

@ -4,7 +4,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/up9inc/mizu/cli/logger" "github.com/up9inc/mizu/cli/logger"
"github.com/up9inc/mizu/cli/mizu" "github.com/up9inc/mizu/shared"
"io/ioutil" "io/ioutil"
"os" "os"
"reflect" "reflect"
@ -89,7 +89,7 @@ func initFlag(f *pflag.Flag) {
configElemValue := reflect.ValueOf(&Config).Elem() configElemValue := reflect.ValueOf(&Config).Elem()
var flagPath []string var flagPath []string
if mizu.Contains([]string{ConfigFilePathCommandName}, f.Name) { if shared.Contains([]string{ConfigFilePathCommandName}, f.Name) {
flagPath = []string{f.Name} flagPath = []string{f.Name}
} else { } else {
flagPath = []string{cmdName, f.Name} flagPath = []string{cmdName, f.Name}

View File

@ -1,8 +1,8 @@
package shared package shared
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"log"
"strings" "strings"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
@ -83,14 +83,14 @@ type RulesPolicy struct {
} }
type RulePolicy struct { type RulePolicy struct {
Type string `yaml:"type"` Type string `yaml:"type"`
Service string `yaml:"service"` Service string `yaml:"service"`
Path string `yaml:"path"` Path string `yaml:"path"`
Method string `yaml:"method"` Method string `yaml:"method"`
Key string `yaml:"key"` Key string `yaml:"key"`
Value string `yaml:"value"` Value string `yaml:"value"`
Latency int64 `yaml:"latency"` ResponseTime int64 `yaml:"response-time"`
Name string `yaml:"name"` Name string `yaml:"name"`
} }
type RulesMatched struct { type RulesMatched struct {
@ -99,14 +99,17 @@ type RulesMatched struct {
} }
func (r *RulePolicy) validateType() bool { func (r *RulePolicy) validateType() bool {
permitedTypes := []string{"json", "header", "latency"} permitedTypes := []string{"json", "header", "slo"}
_, found := Find(permitedTypes, r.Type) _, found := Find(permitedTypes, r.Type)
if !found { if !found {
fmt.Printf("\nRule with name %s will be ignored. Err: only json, header and latency types are supported on rule definition.\n", r.Name) log.Printf("Error: %s. ", r.Name)
log.Printf("Only json, header and slo types are supported on rule definition. This rule will be ignored\n")
found = false
} }
if strings.ToLower(r.Type) == "latency" { if strings.ToLower(r.Type) == "slo" {
if r.Latency == 0 { if r.ResponseTime <= 0 {
fmt.Printf("\nRule with name %s will be ignored. Err: when type=latency, the field Latency should be specified and have a value >= 1\n\n", r.Name) log.Printf("Error: %s. ", r.Name)
log.Printf("When type=slo, the field response-time should be specified and have a value >= 1\n\n")
found = false found = false
} }
} }
@ -124,10 +127,6 @@ func (rules *RulesPolicy) ValidateRulesPolicy() []int {
return invalidIndex return invalidIndex
} }
func (rules *RulesPolicy) RemoveRule(idx int) {
rules.Rules = append(rules.Rules[:idx], rules.Rules[idx+1:]...)
}
func Find(slice []string, val string) (int, bool) { func Find(slice []string, val string) (int, bool) {
for i, item := range slice { for i, item := range slice {
if item == val { if item == val {
@ -148,10 +147,15 @@ func DecodeEnforcePolicy(path string) (RulesPolicy, error) {
return enforcePolicy, err return enforcePolicy, err
} }
invalidIndex := enforcePolicy.ValidateRulesPolicy() invalidIndex := enforcePolicy.ValidateRulesPolicy()
var k = 0
if len(invalidIndex) != 0 { if len(invalidIndex) != 0 {
for i := range invalidIndex { for i, rule := range enforcePolicy.Rules {
enforcePolicy.RemoveRule(invalidIndex[i]) if !ContainsInt(invalidIndex, i) {
enforcePolicy.Rules[k] = rule
k++
}
} }
enforcePolicy.Rules = enforcePolicy.Rules[:k]
} }
return enforcePolicy, nil return enforcePolicy, nil
} }

View File

@ -1,4 +1,4 @@
package mizu package shared
func Contains(slice []string, containsValue string) bool { func Contains(slice []string, containsValue string) bool {
for _, sliceValue := range slice { for _, sliceValue := range slice {
@ -10,6 +10,16 @@ func Contains(slice []string, containsValue string) bool {
return false return false
} }
func ContainsInt(slice []int, containsValue int) bool {
for _, sliceValue := range slice {
if sliceValue == containsValue {
return true
}
}
return false
}
func Unique(slice []string) []string { func Unique(slice []string) []string {
keys := make(map[string]bool) keys := make(map[string]bool)
var list []string var list []string

View File

@ -1,8 +1,8 @@
package mizu_test package shared_test
import ( import (
"fmt" "fmt"
"github.com/up9inc/mizu/cli/mizu" "github.com/up9inc/mizu/shared"
"reflect" "reflect"
"testing" "testing"
) )
@ -21,7 +21,7 @@ func TestContainsExists(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.ContainsValue, func(t *testing.T) { t.Run(test.ContainsValue, func(t *testing.T) {
actual := mizu.Contains(test.Slice, test.ContainsValue) actual := shared.Contains(test.Slice, test.ContainsValue)
if actual != test.Expected { if actual != test.Expected {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }
@ -43,7 +43,7 @@ func TestContainsNotExists(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.ContainsValue, func(t *testing.T) { t.Run(test.ContainsValue, func(t *testing.T) {
actual := mizu.Contains(test.Slice, test.ContainsValue) actual := shared.Contains(test.Slice, test.ContainsValue)
if actual != test.Expected { if actual != test.Expected {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }
@ -63,7 +63,7 @@ func TestContainsEmptySlice(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.ContainsValue, func(t *testing.T) { t.Run(test.ContainsValue, func(t *testing.T) {
actual := mizu.Contains(test.Slice, test.ContainsValue) actual := shared.Contains(test.Slice, test.ContainsValue)
if actual != test.Expected { if actual != test.Expected {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }
@ -83,7 +83,7 @@ func TestContainsNilSlice(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.ContainsValue, func(t *testing.T) { t.Run(test.ContainsValue, func(t *testing.T) {
actual := mizu.Contains(test.Slice, test.ContainsValue) actual := shared.Contains(test.Slice, test.ContainsValue)
if actual != test.Expected { if actual != test.Expected {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }
@ -102,7 +102,7 @@ func TestUniqueNoDuplicateValues(t *testing.T) {
for index, test := range tests { for index, test := range tests {
t.Run(fmt.Sprintf("%v", index), func(t *testing.T) { t.Run(fmt.Sprintf("%v", index), func(t *testing.T) {
actual := mizu.Unique(test.Slice) actual := shared.Unique(test.Slice)
if !reflect.DeepEqual(test.Expected, actual) { if !reflect.DeepEqual(test.Expected, actual) {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }
@ -121,7 +121,7 @@ func TestUniqueDuplicateValues(t *testing.T) {
for index, test := range tests { for index, test := range tests {
t.Run(fmt.Sprintf("%v", index), func(t *testing.T) { t.Run(fmt.Sprintf("%v", index), func(t *testing.T) {
actual := mizu.Unique(test.Slice) actual := shared.Unique(test.Slice)
if !reflect.DeepEqual(test.Expected, actual) { if !reflect.DeepEqual(test.Expected, actual) {
t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual) t.Errorf("unexpected result - Expected: %v, actual: %v", test.Expected, actual)
} }

View File

@ -68,7 +68,7 @@ export const EntryItem: React.FC<EntryProps> = ({entry, setFocusedEntryId, isSel
let rule = 'latency' in entry.rules let rule = 'latency' in entry.rules
if (rule) { if (rule) {
if (entry.rules.latency !== -1) { if (entry.rules.latency !== -1) {
if (entry.rules.latency >= entry.latency) { if (entry.rules.latency >= entry.latency || !('latency' in entry)) {
additionalRulesProperties = styles.ruleSuccessRow additionalRulesProperties = styles.ruleSuccessRow
ruleSuccess = true ruleSuccess = true
} else { } else {