From 38ae0e0051157a7952362937e4822345f2975247 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 3 Dec 2018 17:05:29 +0300 Subject: [PATCH 1/4] Migrated to go mod --- .travis.yml | 7 ++----- Gopkg.lock | 31 ------------------------------- Gopkg.toml | 29 ----------------------------- README.md | 6 +++--- go.mod | 8 ++++++++ go.sum | 8 ++++++++ 6 files changed, 21 insertions(+), 68 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml create mode 100644 go.mod create mode 100644 go.sum diff --git a/.travis.yml b/.travis.yml index 901663a..49ddbcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,22 +2,19 @@ sudo: required language: go go: - - 1.9.x + - 1.11.x services: - docker script: + - export GO111MODULE="on" - go test -race -v github.com/seleniumkit/sctl/cmd -coverprofile=coverage.txt -covermode=atomic -coverpkg github.com/seleniumkit/sctl/cmd - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X github.com/seleniumkit/sctl/cmd.buildStamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'` -X github.com/seleniumkit/sctl/cmd.gitRevision=`git describe --tags || git rev-parse HEAD`" - gox -os "linux darwin" -arch "amd64" -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags "-X main.buildStamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'` -X main.gitRevision=`git describe --tags || git rev-parse HEAD`" -before_install: - - go get -u github.com/golang/dep/cmd/dep - install: - go get -u github.com/mitchellh/gox # cross compile - - dep ensure deploy: - provider: releases diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 2e069c6..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,31 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/aandryashin/matchers" - packages = ["."] - revision = "435295ea180e58dbfa526db1ebab8c801b4c2b75" - -[[projects]] - name = "github.com/inconshreveable/mousetrap" - packages = ["."] - revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - version = "v1.0" - -[[projects]] - name = "github.com/spf13/cobra" - packages = ["."] - revision = "856b96dcb49d6427babe192998a35190a12c2230" - -[[projects]] - name = "github.com/spf13/pflag" - packages = ["."] - revision = "bf8481a6aebc13a8aab52e699ffe2e79771f5a3f" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e84315d6d1e4a29e09089acbf38f74dae8e026bf7083299dd07f7e66da6c05d6" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index 72c97b0..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,29 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - branch = "master" - name = "github.com/aandryashin/matchers" - -[[constraint]] - name = "github.com/spf13/cobra" diff --git a/README.md b/README.md index c3d1881..79178e1 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ This repository contains source code for simple Selenium quota management binary. ## Building -We use [dep](https://github.com/golang/dep) for dependencies management so ensure it's installed before proceeding with next steps. To build the code: +To build the code: -1. Checkout this source tree: ```$ git clone https://github.com/seleniumkit/sctl.git``` -2. Download dependencies: ```$ dep ensure``` +1. Ensure you have [Golang](http://golang.org/) 1.11 and above. +2. Checkout this source tree: ```$ git clone https://github.com/seleniumkit/sctl.git``` 3. Build as usually: ```$ go build``` ## Running diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e3433c1 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/seleniumkit/sctl + +require ( + github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d + github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..8232124 --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= +github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d h1:3DcijoKnes3z4/+YyF/0relm9aJJ8ypfyHHz0OWz1Z8= +github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc h1:WqY+0ieFwdU1nXJJPuhI6mqTo5mIUaPNM+xFvFK9RcA= +github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= From 02fe173cd694dcc1486635366757c904a38949d5 Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 3 Dec 2018 17:16:11 +0300 Subject: [PATCH 2/4] Migrated to types imported from Ggr --- .gitignore | 1 + cmd/data.go | 64 ++++++++++--------------------------------------- cmd/generate.go | 42 ++++++++++++++++---------------- cmd/stat.go | 4 ++-- go.mod | 1 + go.sum | 9 +++++++ 6 files changed, 47 insertions(+), 74 deletions(-) diff --git a/.gitignore b/.gitignore index 7a31611..8ba53cd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.iml sctl vendor +coverage.* diff --git a/cmd/data.go b/cmd/data.go index 9feac20..07b727b 100644 --- a/cmd/data.go +++ b/cmd/data.go @@ -1,67 +1,29 @@ package cmd -import "encoding/xml" - -// Input data - -type JsonHost struct { +type Host struct { Port int `json:"port"` Count int `json:"count"` Username string `json:"username"` Password string `json:"password"` } -type JsonRegion map[string]JsonHost - -type JsonRegions map[string]JsonRegion - -type JsonHosts map[string]JsonRegions - -type JsonVersions map[string]string - -type JsonBrowser struct { - DefaultVersion string `json:"defaultVersion"` - Versions JsonVersions `json:"versions"` -} - -type JsonQuota map[string]JsonBrowser +type Region map[string]Host -type JsonInput struct { - Hosts JsonHosts `json:"hosts"` - Quota map[string]JsonQuota `json:"quota"` - Aliases map[string][]string `json:"aliases"` -} +type Regions map[string]Region -// Output data +type Hosts map[string]Regions -type XmlBrowsers struct { - XMLName xml.Name `xml:"qa:browsers"` - XmlNS string `xml:"xmlns:qa,attr"` - Browsers []XmlBrowser `xml:"browser"` -} +type Versions map[string]string -type XmlBrowser struct { - Name string `xml:"name,attr"` - DefaultVersion string `xml:"defaultVersion,attr"` - Versions []XmlVersion `xml:"version"` +type Browser struct { + DefaultVersion string `json:"defaultVersion"` + Versions Versions `json:"versions"` } -type XmlVersion struct { - Number string `xml:"number,attr"` - Regions []XmlRegion `xml:"region"` -} - -type XmlHosts []XmlHost - -type XmlRegion struct { - Name string `xml:"name,attr"` - Hosts XmlHosts `xml:"host"` -} +type Quota map[string]Browser -type XmlHost struct { - Name string `xml:"name,attr"` - Port int `xml:"port,attr"` - Count int `xml:"count,attr"` - Username string `xml:"username,attr,omitempty"` - Password string `xml:"password,attr,omitempty"` +type Input struct { + Hosts Hosts `json:"hosts"` + Quota map[string]Quota `json:"quota"` + Aliases map[string][]string `json:"aliases"` } diff --git a/cmd/generate.go b/cmd/generate.go index 76372f9..6a67c92 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -5,6 +5,7 @@ import ( "encoding/xml" "errors" "fmt" + ggr "github.com/aerokube/ggr/config" "github.com/spf13/cobra" "io/ioutil" "os" @@ -53,8 +54,8 @@ func init() { generateCmd.PersistentFlags().BoolVar(&dryRun, "dryRun", false, "whether to send output to stdout instead of writing files") } -func convert(input JsonInput) map[string]XmlBrowsers { - ret := make(map[string]XmlBrowsers) +func convert(input Input) map[string]ggr.Browsers { + ret := make(map[string]ggr.Browsers) hostsMap := input.Hosts quotaMap := input.Quota aliasesMap := input.Aliases @@ -74,14 +75,14 @@ func convert(input JsonInput) map[string]XmlBrowsers { return ret } -func createQuota(quotaName string, hostsMap JsonHosts, quota JsonQuota) XmlBrowsers { - browsers := []XmlBrowser{} +func createQuota(quotaName string, hostsMap Hosts, quota Quota) ggr.Browsers { + var browsers []ggr.Browser for browserName, browser := range quota { - xmlVersions := []XmlVersion{} + var xmlVersions []ggr.Version for versionName, hostsRef := range browser.Versions { regions := hostsMap[hostsRef] if regions != nil { - xmlVersion := XmlVersion{ + xmlVersion := ggr.Version{ Number: versionName, Regions: jsonRegionsToXmlRegions(regions), } @@ -91,27 +92,26 @@ func createQuota(quotaName string, hostsMap JsonHosts, quota JsonQuota) XmlBrows os.Exit(1) } } - xmlBrowser := XmlBrowser{ + xmlBrowser := ggr.Browser{ Name: browserName, DefaultVersion: browser.DefaultVersion, Versions: xmlVersions, } browsers = append(browsers, xmlBrowser) } - return XmlBrowsers{ + return ggr.Browsers{ Browsers: browsers, - XmlNS: "urn:config.gridrouter.qatools.ru", } } -func jsonRegionsToXmlRegions(regions JsonRegions) []XmlRegion { - xmlRegions := []XmlRegion{} +func jsonRegionsToXmlRegions(regions Regions) []ggr.Region { + var xmlRegions []ggr.Region for regionName, region := range regions { - xmlHosts := XmlHosts{} + xmlHosts := ggr.Hosts{} for hostPattern, host := range region { hostNames := parseHostPattern(hostPattern) for _, hostName := range hostNames { - xmlHosts = append(xmlHosts, XmlHost{ + xmlHosts = append(xmlHosts, ggr.Host{ Name: hostName, Port: host.Port, Count: host.Count, @@ -120,7 +120,7 @@ func jsonRegionsToXmlRegions(regions JsonRegions) []XmlRegion { }) } } - xmlRegions = append(xmlRegions, XmlRegion{ + xmlRegions = append(xmlRegions, ggr.Region{ Name: regionName, Hosts: xmlHosts, }) @@ -128,23 +128,23 @@ func jsonRegionsToXmlRegions(regions JsonRegions) []XmlRegion { return xmlRegions } -func parseInputFile(filePath string) (*JsonInput, error) { +func parseInputFile(filePath string) (*Input, error) { bytes, err := ioutil.ReadFile(filePath) if err != nil { return nil, errors.New(fmt.Sprintf("error reading input file [%s]: %v", filePath, err)) } - input := new(JsonInput) + input := new(Input) if err := json.Unmarshal(bytes, input); err != nil { return nil, errors.New(fmt.Sprintf("error parsing input file [%s]: %v", filePath, err)) } return input, nil } -func marshalBrowsers(browsers XmlBrowsers) ([]byte, error) { +func marshalBrowsers(browsers ggr.Browsers) ([]byte, error) { return xml.MarshalIndent(browsers, "", " ") } -func output(quotaName string, browsers XmlBrowsers, outputDirectory string) error { +func output(quotaName string, browsers ggr.Browsers, outputDirectory string) error { filePath := path.Join(outputDirectory, quotaName+".xml") if dryRun { return printOutputFile(filePath, browsers) @@ -153,7 +153,7 @@ func output(quotaName string, browsers XmlBrowsers, outputDirectory string) erro } } -func printOutputFile(filePath string, browsers XmlBrowsers) error { +func printOutputFile(filePath string, browsers ggr.Browsers) error { bytes, err := marshalBrowsers(browsers) if err != nil { return err @@ -165,7 +165,7 @@ func printOutputFile(filePath string, browsers XmlBrowsers) error { return nil } -func saveOutputFile(filePath string, browsers XmlBrowsers) error { +func saveOutputFile(filePath string, browsers ggr.Browsers) error { bytes, err := marshalBrowsers(browsers) if err != nil { return err @@ -195,4 +195,4 @@ func parseHostPattern(pattern string) []string { } } return []string{pattern} -} \ No newline at end of file +} diff --git a/cmd/stat.go b/cmd/stat.go index 17d124f..7ded098 100644 --- a/cmd/stat.go +++ b/cmd/stat.go @@ -26,7 +26,7 @@ func init() { statCmd.PersistentFlags().StringVar("aName, "quotaName", "", "quota name") } -func printStat(input JsonInput, quotaName string) { +func printStat(input Input, quotaName string) { hostsMap := input.Hosts quotaMap := input.Quota aliasesMap := input.Aliases @@ -57,7 +57,7 @@ func printStat(input JsonInput, quotaName string) { } -func processJsonQuota(quotaName string, quota JsonQuota, hostsMap JsonHosts) { +func processJsonQuota(quotaName string, quota Quota, hostsMap Hosts) { fmt.Println(quotaName) fmt.Println("---") for browserName, browser := range quota { diff --git a/go.mod b/go.mod index e3433c1..6811c6e 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ module github.com/seleniumkit/sctl require ( github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e + github.com/aerokube/ggr v0.0.0-20181115182236-8957bfa069df github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc // indirect diff --git a/go.sum b/go.sum index 8232124..641c26c 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,17 @@ +github.com/aandryashin/matchers v0.0.0-20160729131923-5eb67beb188b/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e h1:ogUKYFNcdYUIBSLibE4+EjbTJazoHr5JsWWx21Lpn8c= github.com/aandryashin/matchers v0.0.0-20161126170413-435295ea180e/go.mod h1:cbmYNkm9xeQlNoWEPtOUcvNok2gSD7ErMnYkRW+eHi8= +github.com/aandryashin/reloader v0.0.0-20161127125235-da4f1b43ce40/go.mod h1:gvg2/m9OQ4ZwK4Qk/mnfgokCb4qDN4BGyle+QGw4VOc= +github.com/abbot/go-http-auth v0.0.0-20161224193827-d45c47bedec7/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM= +github.com/aerokube/ggr v0.0.0-20181115182236-8957bfa069df h1:OGZ+YIqvdaJDdgYBF7UAWvHLWYNRUc8zyRS+Ar4O6tY= +github.com/aerokube/ggr v0.0.0-20181115182236-8957bfa069df/go.mod h1:c4gg5wIR9PyppUSe4swKbNiSLO0vivf7THFs3rkcBIU= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d h1:3DcijoKnes3z4/+YyF/0relm9aJJ8ypfyHHz0OWz1Z8= github.com/spf13/cobra v0.0.0-20161014222036-856b96dcb49d/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc h1:WqY+0ieFwdU1nXJJPuhI6mqTo5mIUaPNM+xFvFK9RcA= github.com/spf13/pflag v0.0.0-20161011120826-bf8481a6aebc/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +golang.org/x/crypto v0.0.0-20161221235747-f6b343c37ca8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From 31ad98667c02a0975f002f72c12036f1ef5d9cfa Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 3 Dec 2018 17:57:38 +0300 Subject: [PATCH 3/4] Supporting platforms in JSON (fixes #8) --- README.md | 7 ++++--- cmd/data.go | 5 +++-- cmd/generate.go | 23 +++++++++++++++++++---- cmd/generate_test.go | 27 +++++++++++++++++++++++---- test-data/input.json | 4 +++- test-data/output.xml | 13 +++++++++++-- 6 files changed, 63 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 79178e1..86255ba 100644 --- a/README.md +++ b/README.md @@ -65,15 +65,16 @@ In **quota** section we define quota names, browser names, their versions and us "test-quota": { "firefox" : { "defaultVersion": "33.0", + "defaultPlatform": "LINUX", "versions": { "33.0": "cloud", - "42.0": "cloud" + "42.0@LINUX": "cloud" } } } } ``` -Here **test-quota** is free-form name of the quota, **firefox** is the browser name. Finally **versions** section contains a mapping of browser version to host group name, e.g. **firefox 33.0** will correspond to all hosts defined in **cloud** hosts group. +To specify a platform use `@`-notation, e.g. `42.0@LINUX`. Here **test-quota** is free-form name of the quota, **firefox** is the browser name. Finally **versions** section contains a mapping of browser version to host group name, e.g. **firefox 33.0** will correspond to all hosts defined in **cloud** hosts group. In **aliases** section we define aliases for quota blocks from **quota** section. For each defined alias quota contents will be copied to a separate file with new name. Cloud provider attributes `username` and `password` can be included in the input file: @@ -90,4 +91,4 @@ Cloud provider attributes `username` and `password` can be included in the input } } } -``` +``` \ No newline at end of file diff --git a/cmd/data.go b/cmd/data.go index 07b727b..7d70120 100644 --- a/cmd/data.go +++ b/cmd/data.go @@ -16,8 +16,9 @@ type Hosts map[string]Regions type Versions map[string]string type Browser struct { - DefaultVersion string `json:"defaultVersion"` - Versions Versions `json:"versions"` + DefaultVersion string `json:"defaultVersion"` + DefaultPlatform string `json:"defaultPlatform"` + Versions Versions `json:"versions"` } type Quota map[string]Browser diff --git a/cmd/generate.go b/cmd/generate.go index 6a67c92..3e9ee61 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -13,6 +13,7 @@ import ( "regexp" "sort" "strconv" + "strings" ) const ( @@ -82,10 +83,14 @@ func createQuota(quotaName string, hostsMap Hosts, quota Quota) ggr.Browsers { for versionName, hostsRef := range browser.Versions { regions := hostsMap[hostsRef] if regions != nil { + version, platform := parseVersionPlatform(versionName) xmlVersion := ggr.Version{ - Number: versionName, + Number: version, Regions: jsonRegionsToXmlRegions(regions), } + if platform != "" { + xmlVersion.Platform = platform + } xmlVersions = append(xmlVersions, xmlVersion) } else { fmt.Printf("Missing host reference %s for browser %s:%s:%s\n", hostsRef, quotaName, browserName, versionName) @@ -93,9 +98,10 @@ func createQuota(quotaName string, hostsMap Hosts, quota Quota) ggr.Browsers { } } xmlBrowser := ggr.Browser{ - Name: browserName, - DefaultVersion: browser.DefaultVersion, - Versions: xmlVersions, + Name: browserName, + DefaultVersion: browser.DefaultVersion, + DefaultPlatform: browser.DefaultPlatform, + Versions: xmlVersions, } browsers = append(browsers, xmlBrowser) } @@ -104,6 +110,15 @@ func createQuota(quotaName string, hostsMap Hosts, quota Quota) ggr.Browsers { } } +func parseVersionPlatform(s string) (string, string) { + const separator = "@" + pieces := strings.Split(s, separator) + if len(pieces) > 1 { + return pieces[0], strings.Join(pieces[1:], separator) + } + return s, "" +} + func jsonRegionsToXmlRegions(regions Regions) []ggr.Region { var xmlRegions []ggr.Region for regionName, region := range regions { diff --git a/cmd/generate_test.go b/cmd/generate_test.go index 0faa368..a8c6150 100644 --- a/cmd/generate_test.go +++ b/cmd/generate_test.go @@ -31,20 +31,25 @@ func TestConvert(t *testing.T) { browser := browsers[0] AssertThat(t, browser.Name, EqualTo{"firefox"}) AssertThat(t, browser.DefaultVersion, EqualTo{"33.0"}) + AssertThat(t, browser.DefaultPlatform, EqualTo{"LINUX"}) versions := browser.Versions - AssertThat(t, len(versions), EqualTo{3}) + AssertThat(t, len(versions), EqualTo{4}) sort.Slice(versions, func(i, j int) bool { return versions[i].Number < versions[j].Number }) firstVersion := versions[0] - AssertThat(t, firstVersion.Number == "33.0", Is{true}) + AssertThat(t, firstVersion.Number, EqualTo{"33.0"}) secondVersion := versions[1] - AssertThat(t, secondVersion.Number == "42.0", Is{true}) + AssertThat(t, secondVersion.Number, EqualTo{"42.0"}) thirdVersion := versions[2] - AssertThat(t, thirdVersion.Number == "43.0", Is{true}) + AssertThat(t, thirdVersion.Number, EqualTo{"43.0"}) + AssertThat(t, thirdVersion.Platform, EqualTo{"LINUX"}) + fourthVersion := versions[3] + AssertThat(t, fourthVersion.Number, EqualTo{"43.0"}) + AssertThat(t, fourthVersion.Platform, EqualTo{"WINDOWS"}) firstRegions := firstVersion.Regions AssertThat(t, len(firstRegions), EqualTo{2}) @@ -80,3 +85,17 @@ func TestConvert(t *testing.T) { AssertThat(t, host.Password, EqualTo{"Password1"}) } } + +func TestParseVersionPlatform(t *testing.T) { + v, p := parseVersionPlatform("some-string") + AssertThat(t, v, EqualTo{"some-string"}) + AssertThat(t, p, EqualTo{""}) + + v, p = parseVersionPlatform("version@platform") + AssertThat(t, v, EqualTo{"version"}) + AssertThat(t, p, EqualTo{"platform"}) + + v, p = parseVersionPlatform("version@platform@platform") + AssertThat(t, v, EqualTo{"version"}) + AssertThat(t, p, EqualTo{"platform@platform"}) +} diff --git a/test-data/input.json b/test-data/input.json index 3352025..bfd1c98 100644 --- a/test-data/input.json +++ b/test-data/input.json @@ -30,10 +30,12 @@ "test-quota": { "firefox" : { "defaultVersion": "33.0", + "defaultPlatform": "LINUX", "versions": { "33.0": "cloud", "42.0": "cloud", - "43.0": "cloud-provider" + "43.0@LINUX": "cloud-provider", + "43.0@WINDOWS": "cloud-provider" } } } diff --git a/test-data/output.xml b/test-data/output.xml index dd6ff5a..9c8da31 100644 --- a/test-data/output.xml +++ b/test-data/output.xml @@ -1,5 +1,5 @@ - + @@ -92,7 +92,16 @@ - + + + + + + + + + + From d2783e1558f0724ca181babf21270ec79448df2a Mon Sep 17 00:00:00 2001 From: Ivan Krutov Date: Mon, 3 Dec 2018 19:53:32 +0300 Subject: [PATCH 4/4] Supporting VNC in JSON (fixes #9) --- README.md | 25 +++++++++++++++++++++++++ cmd/data.go | 1 + cmd/generate.go | 17 +++++++++++++++-- cmd/generate_test.go | 27 ++++++++++++++++++++------- test-data/input.json | 13 +++++++++++-- test-data/output.xml | 13 +++++-------- 6 files changed, 77 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 86255ba..6b0e1b2 100644 --- a/README.md +++ b/README.md @@ -91,4 +91,29 @@ Cloud provider attributes `username` and `password` can be included in the input } } } +``` + +To specify VNC proxying settings - use `vnc` attribute as follows: +``` + "vnc-hosts": { + "some-dc" : { + "selenoid-host.example.com": { + "port": 4444, + "count": 1, + "vnc": "selenoid" + } + } + } +``` +When `vnc` equals to `selenoid` then VNC will be set to `ws://host:port/vnc`, otherwise it will be set to specified value with `$hostName` placeholder is replaced by respective host name: +``` + "vnc-hosts": { + "some-dc" : { + "some-host-[1:5].example.com": { + "port": 4444, + "count": 5, + "vnc": "vnc://$hostName:5900" + } + } + } ``` \ No newline at end of file diff --git a/cmd/data.go b/cmd/data.go index 7d70120..a723497 100644 --- a/cmd/data.go +++ b/cmd/data.go @@ -5,6 +5,7 @@ type Host struct { Count int `json:"count"` Username string `json:"username"` Password string `json:"password"` + VNC string `json:"vnc"` } type Region map[string]Host diff --git a/cmd/generate.go b/cmd/generate.go index 3e9ee61..488013e 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -126,13 +126,17 @@ func jsonRegionsToXmlRegions(regions Regions) []ggr.Region { for hostPattern, host := range region { hostNames := parseHostPattern(hostPattern) for _, hostName := range hostNames { - xmlHosts = append(xmlHosts, ggr.Host{ + h := ggr.Host{ Name: hostName, Port: host.Port, Count: host.Count, Username: host.Username, Password: host.Password, - }) + } + if host.VNC != "" { + h.VNC = preProcessVNC(hostName, host.Port, host.VNC) + } + xmlHosts = append(xmlHosts, h) } } xmlRegions = append(xmlRegions, ggr.Region{ @@ -143,6 +147,15 @@ func jsonRegionsToXmlRegions(regions Regions) []ggr.Region { return xmlRegions } +func preProcessVNC(hostName string, port int, vnc string) string { + const selenoid = "selenoid" + const hostPattern = "$hostName" + if vnc == selenoid { + return fmt.Sprintf("ws://%s:%d/vnc", hostName, port) + } + return strings.Replace(vnc, hostPattern, hostName, -1) +} + func parseInputFile(filePath string) (*Input, error) { bytes, err := ioutil.ReadFile(filePath) if err != nil { diff --git a/cmd/generate_test.go b/cmd/generate_test.go index a8c6150..b75ab7e 100644 --- a/cmd/generate_test.go +++ b/cmd/generate_test.go @@ -9,7 +9,7 @@ import ( func TestParseInputFile(t *testing.T) { input, err := parseInputFile("../test-data/input.json") AssertThat(t, err, Is{nil}) - AssertThat(t, len(input.Hosts), EqualTo{2}) + AssertThat(t, len(input.Hosts), EqualTo{3}) AssertThat(t, len(input.Quota), EqualTo{1}) } @@ -46,10 +46,10 @@ func TestConvert(t *testing.T) { AssertThat(t, secondVersion.Number, EqualTo{"42.0"}) thirdVersion := versions[2] AssertThat(t, thirdVersion.Number, EqualTo{"43.0"}) - AssertThat(t, thirdVersion.Platform, EqualTo{"LINUX"}) + AssertThat(t, thirdVersion.Platform, EqualTo{"WINDOWS"}) fourthVersion := versions[3] - AssertThat(t, fourthVersion.Number, EqualTo{"43.0"}) - AssertThat(t, fourthVersion.Platform, EqualTo{"WINDOWS"}) + AssertThat(t, fourthVersion.Number, EqualTo{"45.0"}) + AssertThat(t, fourthVersion.Platform, EqualTo{"LINUX"}) firstRegions := firstVersion.Regions AssertThat(t, len(firstRegions), EqualTo{2}) @@ -73,13 +73,21 @@ func TestConvert(t *testing.T) { AssertThat(t, firstHost.Password == "" && secondHost.Password == "", Is{true}) } - secondRegions := thirdVersion.Regions - AssertThat(t, len(secondRegions), EqualTo{1}) - region := secondRegions[0] + thirdRegions := thirdVersion.Regions + AssertThat(t, len(thirdRegions), EqualTo{1}) + region := thirdRegions[0] AssertThat(t, region.Name == "provider-1", Is{true}) AssertThat(t, len(region.Hosts), EqualTo{5}) + fourthRegions := fourthVersion.Regions + AssertThat(t, len(fourthRegions), EqualTo{1}) + fourthRegion := fourthRegions[0] + AssertThat(t, fourthRegion.Name == "some-dc", Is{true}) + AssertThat(t, len(fourthRegion.Hosts), EqualTo{1}) + vncHost := fourthRegion.Hosts[0] + AssertThat(t, vncHost.VNC, EqualTo{"ws://selenoid-host.example.com:4444/vnc"}) + for _, host := range region.Hosts { AssertThat(t, host.Username, EqualTo{"user1"}) AssertThat(t, host.Password, EqualTo{"Password1"}) @@ -99,3 +107,8 @@ func TestParseVersionPlatform(t *testing.T) { AssertThat(t, v, EqualTo{"version"}) AssertThat(t, p, EqualTo{"platform@platform"}) } + +func TestPreProcessVNC(t *testing.T) { + AssertThat(t, preProcessVNC("selenoid-host.example.com", 4444, "selenoid"), EqualTo{"ws://selenoid-host.example.com:4444/vnc"}) + AssertThat(t, preProcessVNC("vnc-host.example.com", 5900, "vnc://$hostName:5900"), EqualTo{"vnc://vnc-host.example.com:5900"}) +} diff --git a/test-data/input.json b/test-data/input.json index bfd1c98..702d0b8 100644 --- a/test-data/input.json +++ b/test-data/input.json @@ -23,6 +23,15 @@ "password": "Password1" } } + }, + "vnc-hosts": { + "some-dc": { + "selenoid-host.example.com": { + "port": 4444, + "count": 1, + "vnc": "selenoid" + } + } } }, @@ -34,8 +43,8 @@ "versions": { "33.0": "cloud", "42.0": "cloud", - "43.0@LINUX": "cloud-provider", - "43.0@WINDOWS": "cloud-provider" + "43.0@WINDOWS": "cloud-provider", + "45.0@LINUX": "vnc-hosts" } } } diff --git a/test-data/output.xml b/test-data/output.xml index 9c8da31..c36aaf3 100644 --- a/test-data/output.xml +++ b/test-data/output.xml @@ -92,7 +92,7 @@ - + @@ -101,13 +101,10 @@ - - - - - - - + + +