Compare commits

...

3 Commits

Author SHA1 Message Date
M. Mert Yıldıran
69ee8752d0 Create and push the latest tag if the branch is main (stable) (#831)
* Fix the styling issue in the badges

* Create and push the `latest` tag if the branch is `main` (stable)

* Build the for `latest` tag as well
2022-02-19 18:09:18 +03:00
M. Mert Yıldıran
27fa0afb72 TRA-4331 Implement full data streaming over WebSocket (#819)
* Implement full data streaming over WebSocket

* Fix the linting error

* Make the empty being the criteria

* Use a label to break the nested loop
2022-02-17 17:01:44 +03:00
Adam Kol
c98c99e488 Cypress fix: resizing mizu when needed (#821) 2022-02-17 13:19:44 +02:00
9 changed files with 85 additions and 32 deletions

View File

@@ -58,6 +58,7 @@ jobs:
up9inc/mizu up9inc/mizu
tags: | tags: |
type=raw,${{ steps.versioning.outputs.version }} type=raw,${{ steps.versioning.outputs.version }}
type=raw,value=latest,enable=${{ steps.condval.outputs.value == 'stable' }}
flavor: | flavor: |
latest=auto latest=auto
prefix= prefix=
@@ -143,6 +144,7 @@ jobs:
${{ steps.base_image_step.outputs.image }} ${{ steps.base_image_step.outputs.image }}
tags: | tags: |
type=raw,${{ steps.versioning.outputs.version }} type=raw,${{ steps.versioning.outputs.version }}
type=raw,value=latest,enable=${{ steps.condval.outputs.value == 'stable' }}
flavor: | flavor: |
latest=auto latest=auto
prefix= prefix=
@@ -205,6 +207,7 @@ jobs:
up9inc/mizu up9inc/mizu
tags: | tags: |
type=raw,${{ steps.versioning.outputs.version }} type=raw,${{ steps.versioning.outputs.version }}
type=raw,value=latest,enable=${{ steps.condval.outputs.value == 'stable' }}
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@v1 uses: docker/login-action@v1

View File

@@ -8,10 +8,10 @@
<img alt="GitHub Latest Release" src="https://img.shields.io/github/v/release/up9inc/mizu?logo=GitHub&style=flat-square"> <img alt="GitHub Latest Release" src="https://img.shields.io/github/v/release/up9inc/mizu?logo=GitHub&style=flat-square">
</a> </a>
<a href="https://hub.docker.com/r/up9inc/mizu"> <a href="https://hub.docker.com/r/up9inc/mizu">
<img alt="Docker pulls" src="https://img.shields.io/docker/pulls/up9inc/mizu?color=%23099cec"> <img alt="Docker pulls" src="https://img.shields.io/docker/pulls/up9inc/mizu?color=%23099cec&logo=Docker&style=flat-square">
</a> </a>
<a href="https://hub.docker.com/r/up9inc/mizu"> <a href="https://hub.docker.com/r/up9inc/mizu">
<img alt="Image size" src="https://img.shields.io/docker/image-size/up9inc/mizu/latest"> <img alt="Image size" src="https://img.shields.io/docker/image-size/up9inc/mizu/latest?logo=Docker&style=flat-square">
</a> </a>
<a href="https://join.slack.com/t/up9/shared_invite/zt-tfjnduli-QzlR8VV4Z1w3YnPIAJfhlQ"> <a href="https://join.slack.com/t/up9/shared_invite/zt-tfjnduli-QzlR8VV4Z1w3YnPIAJfhlQ">
<img alt="Slack" src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social"> <img alt="Slack" src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social">

View File

@@ -15,7 +15,8 @@
"tests/IgnoredUserAgents.js", "tests/IgnoredUserAgents.js",
"tests/UiTest.js", "tests/UiTest.js",
"tests/Redis.js", "tests/Redis.js",
"tests/Rabbit.js" "tests/Rabbit.js",
"tests/serviceMapFunction.js"
], ],
"env": { "env": {
@@ -26,6 +27,9 @@
"minimumEntries": 25, "minimumEntries": 25,
"greenFilterColor": "rgb(210, 250, 210)", "greenFilterColor": "rgb(210, 250, 210)",
"redFilterColor": "rgb(250, 214, 220)", "redFilterColor": "rgb(250, 214, 220)",
"bodyJsonClass": ".hljs" "bodyJsonClass": ".hljs",
"mizuWidth": 1920,
"normalMizuHeight": 1080,
"hugeMizuHeight": 3500
} }
} }

View File

@@ -4,6 +4,8 @@ export const valueTabs = {
none: null none: null
} }
const maxEntriesInDom = 13;
export function isValueExistsInElement(shouldInclude, content, domPathToContainer){ export function isValueExistsInElement(shouldInclude, content, domPathToContainer){
it(`should ${shouldInclude ? '' : 'not'} include '${content}'`, function () { it(`should ${shouldInclude ? '' : 'not'} include '${content}'`, function () {
cy.get(domPathToContainer).then(htmlText => { cy.get(domPathToContainer).then(htmlText => {
@@ -15,11 +17,11 @@ export function isValueExistsInElement(shouldInclude, content, domPathToContaine
} }
export function resizeToHugeMizu() { export function resizeToHugeMizu() {
cy.viewport(1920, 3500); cy.viewport(Cypress.env('mizuWidth'), Cypress.env('hugeMizuHeight'));
} }
export function resizeToNormalMizu() { export function resizeToNormalMizu() {
cy.viewport(1920, 1080); cy.viewport(Cypress.env('mizuWidth'), Cypress.env('normalMizuHeight'));
} }
export function verifyMinimumEntries() { export function verifyMinimumEntries() {
@@ -61,7 +63,7 @@ export function checkThatAllEntriesShown() {
} }
export function checkFilterByMethod(funcDict) { export function checkFilterByMethod(funcDict) {
const {protocol, method, summary} = funcDict; const {protocol, method, summary, hugeMizu} = funcDict;
const summaryDict = getSummeryDict(summary); const summaryDict = getSummeryDict(summary);
const methodDict = getMethodDict(method); const methodDict = getMethodDict(method);
const protocolDict = getProtocolDict(protocol.name, protocol.text); const protocolDict = getProtocolDict(protocol.name, protocol.text);
@@ -82,20 +84,24 @@ export function checkFilterByMethod(funcDict) {
const listElmWithIdAttr = Object.values(elements); const listElmWithIdAttr = Object.values(elements);
let doneCheckOnFirst = false; let doneCheckOnFirst = false;
listElmWithIdAttr.forEach(entry => { cy.get('#entries-length').invoke('text').then(len => {
if (entry?.id && entry.id.match(RegExp(/entry-(\d{2}|\d{1})$/gm))) { resizeIfNeeded(len);
const entryNum = getEntryNumById(entry.id); 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, methodDict.pathLeft, methodDict.expectedText);
leftTextCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedTextLeft); leftTextCheck(entryNum, protocolDict.pathLeft, protocolDict.expectedTextLeft);
if (summaryDict) if (summaryDict)
leftTextCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedText); leftTextCheck(entryNum, summaryDict.pathLeft, summaryDict.expectedText);
if (!doneCheckOnFirst) { if (!doneCheckOnFirst) {
deepCheck(funcDict, protocolDict, methodDict, entry); deepCheck(funcDict, protocolDict, methodDict, entry);
doneCheckOnFirst = true; doneCheckOnFirst = true;
}
} }
} });
resizeIfNeeded(len);
}); });
}); });
}); });
@@ -103,6 +109,13 @@ export function checkFilterByMethod(funcDict) {
}); });
} }
function resizeIfNeeded(entriesLen) {
if (entriesLen > maxEntriesInDom){
Cypress.config().viewportHeight === Cypress.env('normalMizuHeight') ?
resizeToHugeMizu() : resizeToNormalMizu()
}
}
function deepCheck(generalDict, protocolDict, methodDict, entry) { function deepCheck(generalDict, protocolDict, methodDict, entry) {
const entryNum = getEntryNumById(entry.id); const entryNum = getEntryNumById(entry.id);
const {summary, value} = generalDict; const {summary, value} = generalDict;

View File

@@ -1,8 +1,8 @@
import {checkFilterByMethod, valueTabs,} from "../testHelpers/TrafficHelper"; import {checkFilterByMethod, valueTabs,} from "../testHelpers/TrafficHelper";
it('opening mizu', function () { it('opening mizu', function () {
cy.visit(Cypress.env('testUrl')); cy.visit(Cypress.env('testUrl'));
cy.get('#total-entries').invoke('text').should('match', /^[4-7][0-9]$/m)
}); });
const rabbitProtocolDetails = {name: 'AMQP', text: 'Advanced Message Queuing Protocol 0-9-1'}; const rabbitProtocolDetails = {name: 'AMQP', text: 'Advanced Message Queuing Protocol 0-9-1'};

View File

@@ -110,20 +110,31 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even
logger.Log.Error(err) logger.Log.Error(err)
} }
out:
for { for {
_, msg, err := ws.ReadMessage() // params[0]: query
if err != nil { // params[1]: enableFullEntries (empty: disable, non-empty: enable)
if _, ok := err.(*websocket.CloseError); ok { params := make([][]byte, 2)
logger.Log.Debugf("Received websocket close message, socket id: %d", socketId) for i := range params {
} else { _, params[i], err = ws.ReadMessage()
logger.Log.Errorf("Error reading message, socket id: %d, error: %v", socketId, err) if err != nil {
} if _, ok := err.(*websocket.CloseError); ok {
logger.Log.Debugf("Received websocket close message, socket id: %d", socketId)
} else {
logger.Log.Errorf("Error reading message, socket id: %d, error: %v", socketId, err)
}
break break out
}
}
enableFullEntries := false
if len(params[1]) > 0 {
enableFullEntries = true
} }
if !isTapper && !isQuerySet { if !isTapper && !isQuerySet {
query := string(msg) query := string(params[0])
err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query)
if err != nil { if err != nil {
toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{
@@ -150,10 +161,15 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even
var entry *tapApi.Entry var entry *tapApi.Entry
err = json.Unmarshal(bytes, &entry) err = json.Unmarshal(bytes, &entry)
base := tapApi.Summarize(entry) var message []byte
if enableFullEntries {
message, _ = models.CreateFullEntryWebSocketMessage(entry)
} else {
base := tapApi.Summarize(entry)
message, _ = models.CreateBaseEntryWebSocketMessage(base)
}
baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) if err := SendToSocket(socketId, message); err != nil {
if err := SendToSocket(socketId, baseEntryBytes); err != nil {
logger.Log.Error(err) logger.Log.Error(err)
} }
} }
@@ -185,7 +201,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even
connection.Query(query, data, meta) connection.Query(query, data, meta)
} else { } else {
eventHandlers.WebSocketMessage(socketId, msg) eventHandlers.WebSocketMessage(socketId, params[0])
} }
} }
} }

View File

@@ -42,6 +42,11 @@ type WebSocketEntryMessage struct {
Data *tapApi.BaseEntry `json:"data,omitempty"` Data *tapApi.BaseEntry `json:"data,omitempty"`
} }
type WebSocketFullEntryMessage struct {
*shared.WebSocketMessageMetadata
Data *tapApi.Entry `json:"data,omitempty"`
}
type WebSocketTappedEntryMessage struct { type WebSocketTappedEntryMessage struct {
*shared.WebSocketMessageMetadata *shared.WebSocketMessageMetadata
Data *tapApi.OutputChannelItem Data *tapApi.OutputChannelItem
@@ -88,6 +93,16 @@ func CreateBaseEntryWebSocketMessage(base *tapApi.BaseEntry) ([]byte, error) {
return json.Marshal(message) return json.Marshal(message)
} }
func CreateFullEntryWebSocketMessage(entry *tapApi.Entry) ([]byte, error) {
message := &WebSocketFullEntryMessage{
WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{
MessageType: shared.WebSocketMessageTypeFullEntry,
},
Data: entry,
}
return json.Marshal(message)
}
func CreateWebsocketTappedEntryMessage(base *tapApi.OutputChannelItem) ([]byte, error) { func CreateWebsocketTappedEntryMessage(base *tapApi.OutputChannelItem) ([]byte, error) {
message := &WebSocketTappedEntryMessage{ message := &WebSocketTappedEntryMessage{
WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{

View File

@@ -15,6 +15,7 @@ type WebSocketMessageType string
const ( const (
WebSocketMessageTypeEntry WebSocketMessageType = "entry" WebSocketMessageTypeEntry WebSocketMessageType = "entry"
WebSocketMessageTypeFullEntry WebSocketMessageType = "fullEntry"
WebSocketMessageTypeTappedEntry WebSocketMessageType = "tappedEntry" WebSocketMessageTypeTappedEntry WebSocketMessageType = "tappedEntry"
WebSocketMessageTypeUpdateStatus WebSocketMessageType = "status" WebSocketMessageTypeUpdateStatus WebSocketMessageType = "status"
WebSocketMessageTypeAnalyzeStatus WebSocketMessageType = "analyzeStatus" WebSocketMessageTypeAnalyzeStatus WebSocketMessageType = "analyzeStatus"

View File

@@ -122,6 +122,7 @@ export const TrafficPage: React.FC<TrafficPageProps> = ({setAnalyzeStatus}) => {
ws.current.onopen = () => { ws.current.onopen = () => {
setWsConnection(WsConnectionStatus.Connected); setWsConnection(WsConnectionStatus.Connected);
ws.current.send(query); ws.current.send(query);
ws.current.send("");
} }
ws.current.onclose = () => { ws.current.onclose = () => {
setWsConnection(WsConnectionStatus.Closed); setWsConnection(WsConnectionStatus.Closed);