From 0365b8971f6bc4743d7bf223ede668f91dd257fe Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:47:54 +0200 Subject: [PATCH] Added redis acceptance test (#750) --- acceptanceTests/cypress.json | 8 +- .../integration/testHelpers/TrafficHelper.js | 27 ++- .../integration/tests/IgnoredUserAgents.js | 14 +- .../cypress/integration/tests/NoRedact.js | 2 +- .../cypress/integration/tests/Redact.js | 2 +- .../cypress/integration/tests/Redis.js | 155 ++++++++++++++++++ .../cypress/integration/tests/RegexMasking.js | 2 +- .../cypress/integration/tests/UiTest.js | 54 +++--- acceptanceTests/extensions_test.go | 101 ++++++++++++ acceptanceTests/go.mod | 4 +- acceptanceTests/go.sum | 54 +++++- acceptanceTests/setup.sh | 9 + acceptanceTests/testsUtils.go | 35 ++++ 13 files changed, 414 insertions(+), 53 deletions(-) create mode 100644 acceptanceTests/cypress/integration/tests/Redis.js create mode 100644 acceptanceTests/extensions_test.go diff --git a/acceptanceTests/cypress.json b/acceptanceTests/cypress.json index fa0878eea..d1886cf6e 100644 --- a/acceptanceTests/cypress.json +++ b/acceptanceTests/cypress.json @@ -13,7 +13,8 @@ "tests/Regex.js", "tests/RegexMasking.js", "tests/IgnoredUserAgents.js", - "tests/UiTest.js" + "tests/UiTest.js", + "tests/Redis.js" ], "env": { @@ -21,6 +22,9 @@ "redactHeaderContent": "User-Header[REDACTED]", "redactBodyContent": "{ \"User\": \"[REDACTED]\" }", "regexMaskingBodyContent": "[REDACTED]", - "minimumEntries": 25 + "minimumEntries": 25, + "greenFilterColor": "rgb(210, 250, 210)", + "redFilterColor": "rgb(250, 214, 220)", + "bodyJsonClass": ".hljs" } } diff --git a/acceptanceTests/cypress/integration/testHelpers/TrafficHelper.js b/acceptanceTests/cypress/integration/testHelpers/TrafficHelper.js index e280c6c2e..925deabcb 100644 --- a/acceptanceTests/cypress/integration/testHelpers/TrafficHelper.js +++ b/acceptanceTests/cypress/integration/testHelpers/TrafficHelper.js @@ -24,7 +24,32 @@ export function verifyMinimumEntries() { const numOfEntries = number.text(); return parseInt(numOfEntries); }; - cy.wrap({ there: getNum }).invoke('there').should('be.gte', minimumEntries); + cy.wrap({there: getNum}).invoke('there').should('be.gte', minimumEntries); }); }); } + +export function leftTextCheck(entryNum, path, expectedText) { + cy.get(`#list #entry-${entryNum} ${path}`).invoke('text').should('eq', expectedText); +} + +export function leftOnHoverCheck(entryNum, path, filterName) { + cy.get(`#list #entry-${entryNum} ${path}`).trigger('mouseover'); + cy.get(`#list #entry-${entryNum} .Queryable-Tooltip`).invoke('text').should('match', new RegExp(filterName)); +} + +export function rightTextCheck(path, expectedText) { + cy.get(`#rightSideContainer ${path}`).should('have.text', expectedText); +} + +export function rightOnHoverCheck(path, expectedText) { + cy.get(`#rightSideContainer ${path}`).trigger('mouseover'); + cy.get(`#rightSideContainer .Queryable-Tooltip`).invoke('text').should('match', new RegExp(expectedText)); +} + +export function checkThatAllEntriesShown() { + cy.get('#entries-length').then(number => { + if (number.text() === '1') + cy.get('[title="Fetch old records"]').click(); + }); +} diff --git a/acceptanceTests/cypress/integration/tests/IgnoredUserAgents.js b/acceptanceTests/cypress/integration/tests/IgnoredUserAgents.js index 7948a70a0..b608d12ac 100644 --- a/acceptanceTests/cypress/integration/tests/IgnoredUserAgents.js +++ b/acceptanceTests/cypress/integration/tests/IgnoredUserAgents.js @@ -1,4 +1,9 @@ -import {isValueExistsInElement, resizeToHugeMizu, verifyMinimumEntries} from "../testHelpers/TrafficHelper"; +import { + checkThatAllEntriesShown, + isValueExistsInElement, + resizeToHugeMizu, + verifyMinimumEntries +} from "../testHelpers/TrafficHelper"; it('Loading Mizu', function () { cy.visit(Cypress.env('testUrl')); @@ -20,13 +25,6 @@ function checkEntries() { }); } -function checkThatAllEntriesShown() { - cy.get('#entries-length').then(number => { - if (number.text() === '1') - cy.get('[title="Fetch old records"]').click(); - }); -} - function checkEntry(entryIndex) { cy.get(`#entry-${entryIndex}`).click(); cy.get('#tbody-Headers').should('be.visible'); diff --git a/acceptanceTests/cypress/integration/tests/NoRedact.js b/acceptanceTests/cypress/integration/tests/NoRedact.js index 5ade83cf5..d3e640a48 100644 --- a/acceptanceTests/cypress/integration/tests/NoRedact.js +++ b/acceptanceTests/cypress/integration/tests/NoRedact.js @@ -7,4 +7,4 @@ it('Loading Mizu', function () { verifyMinimumEntries(); isValueExistsInElement(false, Cypress.env('redactHeaderContent'), '#tbody-Headers'); -isValueExistsInElement(false, Cypress.env('redactBodyContent'), '.hljs'); +isValueExistsInElement(false, Cypress.env('redactBodyContent'), Cypress.env('bodyJsonClass')); diff --git a/acceptanceTests/cypress/integration/tests/Redact.js b/acceptanceTests/cypress/integration/tests/Redact.js index 45fd9e4aa..43f5d81e1 100644 --- a/acceptanceTests/cypress/integration/tests/Redact.js +++ b/acceptanceTests/cypress/integration/tests/Redact.js @@ -7,4 +7,4 @@ it('Loading Mizu', function () { verifyMinimumEntries(); isValueExistsInElement(true, Cypress.env('redactHeaderContent'), '#tbody-Headers'); -isValueExistsInElement(true, Cypress.env('redactBodyContent'), '.hljs'); +isValueExistsInElement(true, Cypress.env('redactBodyContent'), Cypress.env('bodyJsonClass')); diff --git a/acceptanceTests/cypress/integration/tests/Redis.js b/acceptanceTests/cypress/integration/tests/Redis.js new file mode 100644 index 000000000..4de6d8aa4 --- /dev/null +++ b/acceptanceTests/cypress/integration/tests/Redis.js @@ -0,0 +1,155 @@ +import { + leftOnHoverCheck, + leftTextCheck, + rightOnHoverCheck, + rightTextCheck, +} from "../testHelpers/TrafficHelper"; + +const valueTabs = { + response: 'RESPONSE', + request: 'REQUEST', + none: null +} + +it('opening mizu', function () { + cy.visit(Cypress.env('testUrl')); +}); + +checkRedisFilterByMethod({ + method: 'PING', + shouldCheckSummary: false, + valueTab: valueTabs.none +}); + +checkRedisFilterByMethod({ + method: 'SET', + shouldCheckSummary: true, + valueTab: valueTabs.request, + valueRegex: /^\[value, keepttl]$/mg +}); + +checkRedisFilterByMethod({ + method: 'EXISTS', + shouldCheckSummary: true, + valueTab: valueTabs.response, + valueRegex: /^1$/mg +}); + +checkRedisFilterByMethod({ + method: 'GET', + shouldCheckSummary: true, + valueTab: valueTabs.response, + valueRegex: /^value$/mg +}); + +checkRedisFilterByMethod({ + method: 'DEL', + shouldCheckSummary: true, + valueTab: valueTabs.response, + valueRegex: /^1$|^0$/mg +}); + +function checkRedisFilterByMethod(funcDict) { + const {method, shouldCheckSummary} = funcDict + const summaryDict = getSummeryDict(); + const methodDict = getMethodDict(method); + const protocolDict = getProtocolDict(); + + it(`Testing the method: ${method}`, function () { + // applying filter + cy.get('.w-tc-editor-text').clear().type(`method == "${method}"`); + cy.get('[type="submit"]').click(); + cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('greenFilterColor')); + + cy.get('#entries-length').then(number => { + // if the entries list isn't expanded it expands here + if (number.text() === '0' || number.text() === '1') // todo change when TRA-4262 is fixed + cy.get('[title="Fetch old records"]').click(); + + cy.get('#entries-length').should('not.have.text', '0').and('not.have.text', '1').then(() => { + cy.get(`#list [id]`).then(elements => { + const listElmWithIdAttr = Object.values(elements); + let doneCheckOnFirst = false; + + listElmWithIdAttr.forEach(entry => { + if (entry?.id && entry.id.match(RegExp(/entry-(\d{2}|\d{1})$/gm))) { + const entryNum = getEntryNumById(entry.id); + + leftTextCheck(entryNum, methodDict.pathLeft, methodDict.expectedText); + leftTextCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedTextLeft); + if (shouldCheckSummary) + leftTextCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedText); + + if (!doneCheckOnFirst) { + deepCheck(funcDict, protocolDict, methodDict, summaryDict, entry); + doneCheckOnFirst = true; + } + } + }); + }); + }); + }); + }); +} + +function deepCheck(generalDict, protocolDict, methodDict, summaryDict, entry) { + const entryNum = getEntryNumById(entry.id); + const {shouldCheckSummary, valueTab, valueRegex} = generalDict; + + leftOnHoverCheck(entryNum, methodDict.pathLeft, methodDict.expectedOnHover); + leftOnHoverCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedOnHover); + if (shouldCheckSummary) + leftOnHoverCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedOnHover); + + cy.get(`#${entry.id}`).click(); + + rightTextCheck(methodDict.pathRight, methodDict.expectedText); + rightTextCheck(protocolDict.pathRight, protocolDict.expectedTextRight); + if (shouldCheckSummary) + rightTextCheck(summaryDict.pathRight, summaryDict.expectedText); + + rightOnHoverCheck(methodDict.pathRight, methodDict.expectedOnHover); + rightOnHoverCheck(protocolDict.pathRight, protocolDict.expectedOnHover); + if (shouldCheckSummary) + rightOnHoverCheck(summaryDict.pathRight, summaryDict.expectedOnHover); + + if (valueTab) { + if (valueTab === valueTabs.response) + cy.contains('Response').click(); + cy.get(Cypress.env('bodyJsonClass')).then(text => { + expect(text.text()).to.match(valueRegex) + }); + } +} + +function getSummeryDict() { + return { + pathLeft: '> :nth-child(2) > :nth-child(1) > :nth-child(2) > :nth-child(2)', + pathRight: '> :nth-child(2) > :nth-child(1) > :nth-child(1) > :nth-child(2) > :nth-child(2)', + expectedText: 'key', + expectedOnHover: `summary == "key"` + }; +} + +function getMethodDict(method) { + return { + pathLeft: '> :nth-child(2) > :nth-child(1) > :nth-child(1) > :nth-child(2)', + pathRight: '> :nth-child(2) > :nth-child(1) > :nth-child(1) > :nth-child(1) > :nth-child(2)', + expectedText: method, + expectedOnHover: `method == "${method}"` + }; +} + +function getProtocolDict() { + return { + pathLeft: '> :nth-child(1) > :nth-child(1)', + pathRight: '> :nth-child(1) > :nth-child(1) > :nth-child(1) > :nth-child(1)', + expectedTextLeft: 'REDIS', + expectedTextRight: 'Redis Serialization Protocol', + expectedOnHover: `redis` + }; +} + +function getEntryNumById (id) { + return parseInt(id.split('-')[1]); +} diff --git a/acceptanceTests/cypress/integration/tests/RegexMasking.js b/acceptanceTests/cypress/integration/tests/RegexMasking.js index de8676a76..c0f53e388 100644 --- a/acceptanceTests/cypress/integration/tests/RegexMasking.js +++ b/acceptanceTests/cypress/integration/tests/RegexMasking.js @@ -6,4 +6,4 @@ it('Loading Mizu', function () { verifyMinimumEntries(); -isValueExistsInElement(true, Cypress.env('regexMaskingBodyContent'), '.hljs'); +isValueExistsInElement(true, Cypress.env('regexMaskingBodyContent'), Cypress.env('bodyJsonClass')); diff --git a/acceptanceTests/cypress/integration/tests/UiTest.js b/acceptanceTests/cypress/integration/tests/UiTest.js index 6baf0a523..f9825cd9d 100644 --- a/acceptanceTests/cypress/integration/tests/UiTest.js +++ b/acceptanceTests/cypress/integration/tests/UiTest.js @@ -1,9 +1,14 @@ import {findLineAndCheck, getExpectedDetailsDict} from "../testHelpers/StatusBarHelper"; -import {resizeToHugeMizu, resizeToNormalMizu, verifyMinimumEntries} from "../testHelpers/TrafficHelper"; -const greenFilterColor = 'rgb(210, 250, 210)'; -const redFilterColor = 'rgb(250, 214, 220)'; +import { + leftTextCheck, + resizeToHugeMizu, + resizeToNormalMizu, + rightOnHoverCheck, + leftOnHoverCheck, + rightTextCheck, + verifyMinimumEntries +} from "../testHelpers/TrafficHelper"; const refreshWaitTimeout = 10000; -const bodyJsonClass = '.hljs'; it('opening mizu', function () { cy.visit(Cypress.env('testUrl')); @@ -133,7 +138,7 @@ function checkFilterNoResults(filterName) { // applying the filter cy.get('.w-tc-editor-text').type(filterName); - cy.get('.w-tc-editor').should('have.attr', 'style').and('include', greenFilterColor); + cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('greenFilterColor')); cy.get('[type="submit"]').click(); // waiting for the entries number to load @@ -166,7 +171,7 @@ function checkIllegalFilter(illegalFilterName) { const totalEntries = number.text(); cy.get('.w-tc-editor-text').type(illegalFilterName); - cy.get('.w-tc-editor').should('have.attr', 'style').and('include', redFilterColor); + cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('redFilterColor')); cy.get('[type="submit"]').click(); cy.get('[role="alert"]').should('be.visible'); @@ -191,7 +196,7 @@ function checkFilter(filterDetails){ // applying the filter with alt+enter or with the button cy.get('.w-tc-editor-text').type(`${name}${applyByEnter ? '{alt+enter}' : ''}`); - cy.get('.w-tc-editor').should('have.attr', 'style').and('include', greenFilterColor); + cy.get('.w-tc-editor').should('have.attr', 'style').and('include', Cypress.env('greenFilterColor')); if (!applyByEnter) cy.get('[type="submit"]').click(); @@ -234,30 +239,11 @@ function deeperChcek(leftSidePath, rightSidePath, filterName, leftSideExpectedTe }); } -function leftTextCheck(entryNum, path, expectedText) { - cy.get(`#list #entry-${entryNum} ${path}`).invoke('text').should('eq', expectedText); -} - -function leftOnHoverCheck(entryNum, path, filterName) { - cy.get(`#list #entry-${entryNum} ${path}`).trigger('mouseover'); - cy.get(`#list #entry-${entryNum} .Queryable-Tooltip`).should('have.text', filterName); -} - -function rightTextCheck(path, expectedText) { - cy.get(`.TrafficPage-Container > :nth-child(2) ${path}`).should('have.text', expectedText); -} - -function rightOnHoverCheck(path, expectedText) { - cy.get(`.TrafficPage-Container > :nth-child(2) ${path}`).trigger('mouseover'); - cy.get(`.TrafficPage-Container > :nth-child(2) .Queryable-Tooltip`).should('have.text', expectedText); -} - - function checkRightSideResponseBody() { cy.contains('Response').click(); clickCheckbox('Decode Base64'); - cy.get(`${bodyJsonClass}`).then(value => { + cy.get(`${Cypress.env('bodyJsonClass')}`).then(value => { const encodedBody = value.text(); const decodedBody = atob(encodedBody); const responseBody = JSON.parse(decodedBody); @@ -278,11 +264,11 @@ function checkRightSideResponseBody() { expect(responseBody.headers['Accept-Encoding']).to.match(expectdJsonBody.headers['Accept-Encoding']); expect(responseBody.headers['X-Forwarded-Uri']).to.match(expectdJsonBody.headers['X-Forwarded-Uri']); - cy.get(`${bodyJsonClass}`).should('have.text', encodedBody); + cy.get(`${Cypress.env('bodyJsonClass')}`).should('have.text', encodedBody); clickCheckbox('Decode Base64'); - cy.get(`${bodyJsonClass} > `).its('length').should('be.gt', 1).then(linesNum => { - cy.get(`${bodyJsonClass} > >`).its('length').should('be.gt', linesNum).then(jsonItemsNum => { + cy.get(`${Cypress.env('bodyJsonClass')} > `).its('length').should('be.gt', 1).then(linesNum => { + cy.get(`${Cypress.env('bodyJsonClass')} > >`).its('length').should('be.gt', linesNum).then(jsonItemsNum => { checkPrettyAndLineNums(jsonItemsNum, decodedBody); clickCheckbox('Line numbers'); @@ -304,7 +290,7 @@ function clickCheckbox(type) { function checkPrettyAndLineNums(jsonItemsLen, decodedBody) { decodedBody = decodedBody.replaceAll(' ', ''); - cy.get(`${bodyJsonClass} >`).then(elements => { + cy.get(`${Cypress.env('bodyJsonClass')} >`).then(elements => { const lines = Object.values(elements); lines.forEach((line, index) => { if (line.getAttribute) { @@ -324,13 +310,13 @@ function getCleanLine(lineElement) { } function checkPrettyOrNothing(jsonItems, decodedBody) { - cy.get(`${bodyJsonClass} > `).should('have.length', jsonItems).then(text => { + cy.get(`${Cypress.env('bodyJsonClass')} > `).should('have.length', jsonItems).then(text => { const json = text.text(); expect(json).to.equal(decodedBody); }); } function checkOnlyLineNumberes(jsonItems, decodedText) { - cy.get(`${bodyJsonClass} >`).should('have.length', 1).and('have.text', decodedText); - cy.get(`${bodyJsonClass} > >`).should('have.length', jsonItems) + cy.get(`${Cypress.env('bodyJsonClass')} >`).should('have.length', 1).and('have.text', decodedText); + cy.get(`${Cypress.env('bodyJsonClass')} > >`).should('have.length', jsonItems) } diff --git a/acceptanceTests/extensions_test.go b/acceptanceTests/extensions_test.go new file mode 100644 index 000000000..9be121b1e --- /dev/null +++ b/acceptanceTests/extensions_test.go @@ -0,0 +1,101 @@ +package acceptanceTests + +import ( + "context" + "fmt" + "github.com/go-redis/redis/v8" + "os/exec" + "testing" +) + +func TestRedis(t *testing.T) { + if testing.Short() { + t.Skip("ignored acceptance test") + } + + cliPath, cliPathErr := getCliPath() + if cliPathErr != nil { + t.Errorf("failed to get cli path, err: %v", cliPathErr) + return + } + + tapCmdArgs := getDefaultTapCommandArgs() + + tapNamespace := getDefaultTapNamespace() + tapCmdArgs = append(tapCmdArgs, tapNamespace...) + + tapCmd := exec.Command(cliPath, tapCmdArgs...) + t.Logf("running command: %v", tapCmd.String()) + + t.Cleanup(func() { + if err := cleanupCommand(tapCmd); err != nil { + t.Logf("failed to cleanup tap command, err: %v", err) + } + }) + + if err := tapCmd.Start(); err != nil { + t.Errorf("failed to start tap command, err: %v", err) + return + } + + apiServerUrl := getApiServerUrl(defaultApiServerPort) + + if err := waitTapPodsReady(apiServerUrl); err != nil { + t.Errorf("failed to start tap pods on time, err: %v", err) + return + } + + ctx := context.Background() + + redisExternalIp, err := getServiceExternalIp(ctx, defaultNamespaceName, "redis") + if err != nil { + t.Errorf("failed to get redis external ip, err: %v", err) + return + } + + rdb := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%v:6379", redisExternalIp), + }) + + for i := 0; i < defaultEntriesCount/5; i++ { + requestErr := rdb.Ping(ctx).Err() + if requestErr != nil { + t.Errorf("failed to send redis request, err: %v", requestErr) + return + } + } + + for i := 0; i < defaultEntriesCount/5; i++ { + requestErr := rdb.Set(ctx, "key", "value", -1).Err() + if requestErr != nil { + t.Errorf("failed to send redis request, err: %v", requestErr) + return + } + } + + for i := 0; i < defaultEntriesCount/5; i++ { + requestErr := rdb.Exists(ctx, "key").Err() + if requestErr != nil { + t.Errorf("failed to send redis request, err: %v", requestErr) + return + } + } + + for i := 0; i < defaultEntriesCount/5; i++ { + requestErr := rdb.Get(ctx, "key").Err() + if requestErr != nil { + t.Errorf("failed to send redis request, err: %v", requestErr) + return + } + } + + for i := 0; i < defaultEntriesCount/5; i++ { + requestErr := rdb.Del(ctx, "key").Err() + if requestErr != nil { + t.Errorf("failed to send redis request, err: %v", requestErr) + return + } + } + + runCypressTests(t, "npx cypress run --spec \"cypress/integration/tests/Redis.js\"") +} diff --git a/acceptanceTests/go.mod b/acceptanceTests/go.mod index 3bba434f2..d245e4aa5 100644 --- a/acceptanceTests/go.mod +++ b/acceptanceTests/go.mod @@ -3,9 +3,11 @@ module github.com/up9inc/mizu/tests go 1.16 require ( - github.com/gorilla/websocket v1.4.2 + github.com/go-redis/redis/v8 v8.11.4 github.com/up9inc/mizu/shared v0.0.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b + k8s.io/apimachinery v0.21.2 + k8s.io/client-go v0.21.2 ) replace github.com/up9inc/mizu/shared v0.0.0 => ../shared diff --git a/acceptanceTests/go.sum b/acceptanceTests/go.sum index 825dbcd0f..d006daa49 100644 --- a/acceptanceTests/go.sum +++ b/acceptanceTests/go.sum @@ -57,8 +57,11 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -79,6 +82,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -96,6 +101,7 @@ github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwo github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -154,7 +160,10 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -185,6 +194,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -194,8 +206,10 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -212,10 +226,10 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -243,6 +257,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -304,13 +319,23 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -375,6 +400,7 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -470,14 +496,17 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -504,10 +533,12 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -522,21 +553,27 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 h1:dXfMednGJh/SUUFjTLsWJz3P+TQt9qnR11GgeI3vWKs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -577,6 +614,7 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -598,6 +636,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -635,6 +674,9 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -647,6 +689,7 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -655,6 +698,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -673,6 +717,7 @@ k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= k8s.io/apimachinery v0.21.2 h1:vezUc/BHqWlQDnZ+XkrpXSmnANSLbpnlpwo0Lhk0gpc= k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= k8s.io/cli-runtime v0.21.2/go.mod h1:8u/jFcM0QpoI28f6sfrAAIslLCXUYKD5SsPPMWiHYrI= +k8s.io/client-go v0.21.2 h1:Q1j4L/iMN4pTw6Y4DWppBoUxgKO8LbffEMVEV00MUp0= k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= k8s.io/component-base v0.21.2/go.mod h1:9lvmIThzdlrJj5Hp8Z/TOgIkdfsNARQ1pT+3PByuiuc= @@ -686,6 +731,7 @@ k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kubectl v0.21.2/go.mod h1:PgeUclpG8VVmmQIl8zpLar3IQEpFc9mrmvlwY3CK1xo= k8s.io/metrics v0.21.2/go.mod h1:wzlOINZMCtWq8dR9gHlyaOemmYlOpAoldEIXE82gAhI= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/acceptanceTests/setup.sh b/acceptanceTests/setup.sh index d95b72eea..64d833537 100644 --- a/acceptanceTests/setup.sh +++ b/acceptanceTests/setup.sh @@ -36,15 +36,24 @@ kubectl create deployment httpbin2 --image=kennethreitz/httpbin -n mizu-tests kubectl create deployment httpbin --image=kennethreitz/httpbin -n mizu-tests2 +echo "Creating redis deployment" +kubectl create deployment redis --image=redis -n mizu-tests + echo "Creating httpbin services" kubectl expose deployment httpbin --type=NodePort --port=80 -n mizu-tests kubectl expose deployment httpbin2 --type=NodePort --port=80 -n mizu-tests kubectl expose deployment httpbin --type=NodePort --port=80 -n mizu-tests2 +echo "Creating redis service" +kubectl expose deployment redis --type=LoadBalancer --port=6379 -n mizu-tests + echo "Starting proxy" kubectl proxy --port=8080 & +echo "Starting tunnel" +minikube tunnel & + echo "Setting minikube docker env" eval $(minikube docker-env) diff --git a/acceptanceTests/testsUtils.go b/acceptanceTests/testsUtils.go index b9feefb62..4c790e1a3 100644 --- a/acceptanceTests/testsUtils.go +++ b/acceptanceTests/testsUtils.go @@ -2,13 +2,19 @@ package acceptanceTests import ( "bytes" + "context" "encoding/json" "fmt" "io/ioutil" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/util/homedir" "net/http" "os" "os/exec" "path" + "path/filepath" "strings" "syscall" "testing" @@ -68,6 +74,35 @@ func getApiServerUrl(port uint16) string { return fmt.Sprintf("http://localhost:%v", port) } +func getServiceExternalIp(ctx context.Context, namespace string, service string) (string, error) { + home := homedir.HomeDir() + configLoadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: filepath.Join(home, ".kube", "config")} + clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + configLoadingRules, + &clientcmd.ConfigOverrides{ + CurrentContext: "", + }, + ) + + restClientConfig, err := clientConfig.ClientConfig() + if err != nil { + return "", err + } + + clientSet, err := kubernetes.NewForConfig(restClientConfig) + if err != nil { + return "", err + } + + serviceObj, err := clientSet.CoreV1().Services(namespace).Get(ctx, service, metav1.GetOptions{}) + if err != nil { + return "", err + } + + externalIp := serviceObj.Status.LoadBalancer.Ingress[0].IP + return externalIp, nil +} + func getDefaultCommandArgs() []string { setFlag := "--set" telemetry := "telemetry=false"