Skip to content

Commit

Permalink
Added browserVersion for selenium-grid scaler
Browse files Browse the repository at this point in the history
Signed-off-by: prashanth <rprashanth27@gmail.com>
  • Loading branch information
prashanth committed Jul 27, 2021
1 parent 253cc66 commit 8296c73
Show file tree
Hide file tree
Showing 3 changed files with 717 additions and 23 deletions.
49 changes: 35 additions & 14 deletions pkg/scalers/selenium_grid_scaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ import (
"fmt"
"io/ioutil"
"net/http"
"strings"

v2beta2 "k8s.io/api/autoscaling/v2beta2"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/metrics/pkg/apis/external_metrics"

kedautil "github.com/kedacore/keda/v2/pkg/util"
)

Expand All @@ -24,9 +25,10 @@ type seleniumGridScaler struct {
}

type seleniumGridScalerMetadata struct {
url string
browserName string
targetValue int64
url string
browserName string
targetValue int64
browserVersion string
}

type seleniumResponse struct {
Expand All @@ -43,15 +45,20 @@ type sessionsInfo struct {
}

type seleniumSession struct {
Id string `json:"id"`
ID string `json:"id"`
Capabilities string `json:"capabilities"`
NodeId string `json:"nodeId"`
NodeID string `json:"nodeId"`
}

type capability struct {
BrowserName string `json:"browserName"`
BrowserName string `json:"browserName"`
BrowserVersion string `json:"browserVersion"`
}

const (
DefaultBrowserVersion string = "latest"
)

func NewSeleniumGridScaler(config *ScalerConfig) (Scaler, error) {
meta, err := parseSeleniumGridScalerMetadata(config)

Expand Down Expand Up @@ -84,6 +91,12 @@ func parseSeleniumGridScalerMetadata(config *ScalerConfig) (*seleniumGridScalerM
return nil, fmt.Errorf("no browser name given in metadata")
}

if val, ok := config.TriggerMetadata["browserVersion"]; ok && val != "" {
meta.browserVersion = val
} else {
meta.browserVersion = DefaultBrowserVersion
}

return &meta, nil
}

Expand All @@ -109,7 +122,7 @@ func (s *seleniumGridScaler) GetMetrics(ctx context.Context, metricName string,

func (s *seleniumGridScaler) GetMetricSpecForScaling() []v2beta2.MetricSpec {
targetValue := resource.NewQuantity(s.metadata.targetValue, resource.DecimalSI)
metricName := kedautil.NormalizeString(fmt.Sprintf("%s-%s", "seleniumgrid", s.metadata.browserName))
metricName := kedautil.NormalizeString(fmt.Sprintf("%s-%s-%s", "seleniumgrid", s.metadata.browserName, s.metadata.browserVersion))
externalMetric := &v2beta2.ExternalMetricSource{
Metric: v2beta2.MetricIdentifier{
Name: metricName,
Expand Down Expand Up @@ -163,16 +176,16 @@ func (s *seleniumGridScaler) getSessionsCount() (*resource.Quantity, error) {
if err != nil {
return nil, err
}
v, err := getCountFromSeleniumResponse(b, s.metadata.browserName)
v, err := getCountFromSeleniumResponse(b, s.metadata.browserName, s.metadata.browserVersion)
if err != nil {
return nil, err
}
return v, nil
}

func getCountFromSeleniumResponse(b []byte, browserName string) (*resource.Quantity, error) {
var count int64 = 0
var seleniumResponse seleniumResponse = seleniumResponse{}
func getCountFromSeleniumResponse(b []byte, browserName string, browserVersion string) (*resource.Quantity, error) {
var count int64
var seleniumResponse = seleniumResponse{}

if err := json.Unmarshal(b, &seleniumResponse); err != nil {
return nil, err
Expand All @@ -183,7 +196,11 @@ func getCountFromSeleniumResponse(b []byte, browserName string) (*resource.Quant
var capability = capability{}
if err := json.Unmarshal([]byte(sessionQueueRequest), &capability); err == nil {
if capability.BrowserName == browserName {
count = count + 1
if strings.HasPrefix(capability.BrowserVersion, browserVersion) {
count++
} else if capability.BrowserVersion == "" && browserVersion == DefaultBrowserVersion {
count++
}
}
}
}
Expand All @@ -193,7 +210,11 @@ func getCountFromSeleniumResponse(b []byte, browserName string) (*resource.Quant
var capability = capability{}
if err := json.Unmarshal([]byte(session.Capabilities), &capability); err == nil {
if capability.BrowserName == browserName {
count = count + 1
if strings.HasPrefix(capability.BrowserVersion, browserVersion) {
count++
} else if browserVersion == DefaultBrowserVersion {
count++
}
}
}
}
Expand Down
65 changes: 56 additions & 9 deletions pkg/scalers/selenium_grid_scaler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import (

func Test_getCountFromSeleniumResponse(t *testing.T) {
type args struct {
b []byte
browserName string
b []byte
browserName string
browserVersion string
}
tests := []struct {
name string
Expand Down Expand Up @@ -69,7 +70,8 @@ func Test_getCountFromSeleniumResponse(t *testing.T) {
}
}
}`),
browserName: "",
browserName: "",
browserVersion: "latest",
},
want: resource.NewQuantity(0, resource.DecimalSI),
wantErr: false,
Expand All @@ -85,7 +87,8 @@ func Test_getCountFromSeleniumResponse(t *testing.T) {
}
}
}`),
browserName: "chrome",
browserName: "chrome",
browserVersion: "latest",
},
want: resource.NewQuantity(2, resource.DecimalSI),
wantErr: false,
Expand All @@ -107,15 +110,39 @@ func Test_getCountFromSeleniumResponse(t *testing.T) {
}
}
}`),
browserName: "chrome",
browserName: "chrome",
browserVersion: "latest",
},
want: resource.NewQuantity(3, resource.DecimalSI),
wantErr: false,
},
{
name: "active sessions with matching browsername and version should return count as 2",
args: args{
b: []byte(`{
"data": {
"sessionsInfo": {
"sessionQueueRequests": ["{\n \"browserName\": \"chrome\",\n \"browserVersion\": \"91.0\"\n}","{\n \"browserName\": \"chrome\"\n}"],
"sessions": [
{
"id": "0f9c5a941aa4d755a54b84be1f6535b1",
"capabilities": "{\n \"acceptInsecureCerts\": false,\n \"browserName\": \"chrome\",\n \"browserVersion\": \"91.0.4472.114\",\n \"chrome\": {\n \"chromedriverVersion\": \"91.0.4472.101 (af52a90bf87030dd1523486a1cd3ae25c5d76c9b-refs\\u002fbranch-heads\\u002f4472@{#1462})\",\n \"userDataDir\": \"\\u002ftmp\\u002f.com.google.Chrome.DMqx9m\"\n },\n \"goog:chromeOptions\": {\n \"debuggerAddress\": \"localhost:35839\"\n },\n \"networkConnectionEnabled\": false,\n \"pageLoadStrategy\": \"normal\",\n \"platformName\": \"linux\",\n \"proxy\": {\n },\n \"se:cdp\": \"http:\\u002f\\u002flocalhost:35839\",\n \"se:cdpVersion\": \"91.0.4472.114\",\n \"se:vncEnabled\": true,\n \"se:vncLocalAddress\": \"ws:\\u002f\\u002flocalhost:7900\\u002fwebsockify\",\n \"setWindowRect\": true,\n \"strictFileInteractability\": false,\n \"timeouts\": {\n \"implicit\": 0,\n \"pageLoad\": 300000,\n \"script\": 30000\n },\n \"unhandledPromptBehavior\": \"dismiss and notify\",\n \"webauthn:extension:largeBlob\": true,\n \"webauthn:virtualAuthenticators\": true\n}",
"nodeId": "d44dcbc5-0b2c-4d5e-abf4-6f6aa5e0983c"
}
]
}
}
}`),
browserName: "chrome",
browserVersion: "91.0",
},
want: resource.NewQuantity(2, resource.DecimalSI),
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := getCountFromSeleniumResponse(tt.args.b, tt.args.browserName)
got, err := getCountFromSeleniumResponse(tt.args.b, tt.args.browserName, tt.args.browserVersion)
if (err != nil) != tt.wantErr {
t.Errorf("getCountFromSeleniumResponse() error = %v, wantErr %v", err, tt.wantErr)
return
Expand Down Expand Up @@ -169,9 +196,29 @@ func Test_parseSeleniumGridScalerMetadata(t *testing.T) {
},
wantErr: false,
want: &seleniumGridScalerMetadata{
url: "http://selenium-hub:4444/graphql",
browserName: "chrome",
targetValue: 1,
url: "http://selenium-hub:4444/graphql",
browserName: "chrome",
targetValue: 1,
browserVersion: "latest",
},
},
{
name: "valid url and browsername should return metadata",
args: args{
config: &ScalerConfig{
TriggerMetadata: map[string]string{
"url": "http://selenium-hub:4444/graphql",
"browserName": "chrome",
"browserVersion": "91.0",
},
},
},
wantErr: false,
want: &seleniumGridScalerMetadata{
url: "http://selenium-hub:4444/graphql",
browserName: "chrome",
targetValue: 1,
browserVersion: "91.0",
},
},
}
Expand Down
Loading

0 comments on commit 8296c73

Please sign in to comment.