Compare commits

...

2 Commits

Author SHA1 Message Date
RoyUP9
8ea2dabb34 Added send to socket error validation (#1085) 2022-05-15 14:44:48 +03:00
leon-up9
366d34b8d0 Ui/fix/selectList-sticky-header-fix (#1084)
* selectList sticky header

* selectList changed & servicemap adapted

* ignore eslint

Co-authored-by: Leon <>
Co-authored-by: AmitUp9 <96980485+AmitUp9@users.noreply.github.com>
2022-05-15 14:39:09 +03:00
6 changed files with 111 additions and 68 deletions

View File

@@ -5,20 +5,19 @@ import (
basenine "github.com/up9inc/basenine/client/go" basenine "github.com/up9inc/basenine/client/go"
"github.com/up9inc/mizu/agent/pkg/models" "github.com/up9inc/mizu/agent/pkg/models"
"github.com/up9inc/mizu/logger"
tapApi "github.com/up9inc/mizu/tap/api" tapApi "github.com/up9inc/mizu/tap/api"
) )
type EntryStreamerSocketConnector interface { type EntryStreamerSocketConnector interface {
SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) error
SendMetadata(socketId int, metadata *basenine.Metadata) SendMetadata(socketId int, metadata *basenine.Metadata) error
SendToastError(socketId int, err error) SendToastError(socketId int, err error) error
CleanupSocket(socketId int) CleanupSocket(socketId int)
} }
type DefaultEntryStreamerSocketConnector struct{} type DefaultEntryStreamerSocketConnector struct{}
func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) { func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) error {
var message []byte var message []byte
if params.EnableFullEntries { if params.EnableFullEntries {
message, _ = models.CreateFullEntryWebSocketMessage(entry) message, _ = models.CreateFullEntryWebSocketMessage(entry)
@@ -29,26 +28,32 @@ func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tap
} }
if err := SendToSocket(socketId, message); err != nil { if err := SendToSocket(socketId, message); err != nil {
logger.Log.Error(err) return err
} }
return nil
} }
func (e *DefaultEntryStreamerSocketConnector) SendMetadata(socketId int, metadata *basenine.Metadata) { func (e *DefaultEntryStreamerSocketConnector) SendMetadata(socketId int, metadata *basenine.Metadata) error {
metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata)
if err := SendToSocket(socketId, metadataBytes); err != nil { if err := SendToSocket(socketId, metadataBytes); err != nil {
logger.Log.Error(err) return err
} }
return nil
} }
func (e *DefaultEntryStreamerSocketConnector) SendToastError(socketId int, err error) { func (e *DefaultEntryStreamerSocketConnector) SendToastError(socketId int, err error) error {
toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{
Type: "error", Type: "error",
AutoClose: 5000, AutoClose: 5000,
Text: fmt.Sprintf("Syntax error: %s", err.Error()), Text: fmt.Sprintf("Syntax error: %s", err.Error()),
}) })
if err := SendToSocket(socketId, toastBytes); err != nil { if err := SendToSocket(socketId, toastBytes); err != nil {
logger.Log.Error(err) return err
} }
return nil
} }
func (e *DefaultEntryStreamerSocketConnector) CleanupSocket(socketId int) { func (e *DefaultEntryStreamerSocketConnector) CleanupSocket(socketId int) {

View File

@@ -34,14 +34,18 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
meta := make(chan []byte) meta := make(chan []byte)
query := params.Query query := params.Query
err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) if err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query); err != nil {
if err != nil { if err := entryStreamerSocketConnector.SendToastError(socketId, err); err != nil {
entryStreamerSocketConnector.SendToastError(socketId, err) return err
}
entryStreamerSocketConnector.CleanupSocket(socketId)
return err
} }
leftOff, err := e.fetch(socketId, params, entryStreamerSocketConnector) leftOff, err := e.fetch(socketId, params, entryStreamerSocketConnector)
if err != nil { if err != nil {
logger.Log.Errorf("Fetch error: %v", err.Error()) logger.Log.Errorf("Fetch error: %v", err)
} }
handleDataChannel := func(c *basenine.Connection, data chan []byte) { handleDataChannel := func(c *basenine.Connection, data chan []byte) {
@@ -53,13 +57,15 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
} }
var entry *tapApi.Entry var entry *tapApi.Entry
err = json.Unmarshal(bytes, &entry) if err = json.Unmarshal(bytes, &entry); err != nil {
if err != nil { logger.Log.Debugf("Error unmarshalling entry: %v", err)
logger.Log.Debugf("Error unmarshalling entry: %v", err.Error())
continue continue
} }
entryStreamerSocketConnector.SendEntry(socketId, entry, params) if err := entryStreamerSocketConnector.SendEntry(socketId, entry, params); err != nil {
logger.Log.Errorf("Error sending entry to socket, err: %v", err)
return
}
} }
} }
@@ -72,13 +78,15 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
} }
var metadata *basenine.Metadata var metadata *basenine.Metadata
err = json.Unmarshal(bytes, &metadata) if err = json.Unmarshal(bytes, &metadata); err != nil {
if err != nil { logger.Log.Debugf("Error unmarshalling metadata: %v", err)
logger.Log.Debugf("Error unmarshalling metadata: %v", err.Error())
continue continue
} }
entryStreamerSocketConnector.SendMetadata(socketId, metadata) if err := entryStreamerSocketConnector.SendMetadata(socketId, metadata); err != nil {
logger.Log.Errorf("Error sending metadata to socket, err: %v", err)
return
}
} }
} }
@@ -125,28 +133,31 @@ func (e *BasenineEntryStreamer) fetch(socketId int, params *WebSocketParams, con
} }
var firstMetadata *basenine.Metadata var firstMetadata *basenine.Metadata
err = json.Unmarshal(firstMeta, &firstMetadata) if err = json.Unmarshal(firstMeta, &firstMetadata); err != nil {
if err != nil {
return return
} }
leftOff = firstMetadata.LeftOff leftOff = firstMetadata.LeftOff
var lastMetadata *basenine.Metadata var lastMetadata *basenine.Metadata
err = json.Unmarshal(lastMeta, &lastMetadata) if err = json.Unmarshal(lastMeta, &lastMetadata); err != nil {
if err != nil { return
}
if err = connector.SendMetadata(socketId, lastMetadata); err != nil {
return return
} }
connector.SendMetadata(socketId, lastMetadata)
data = e.reverseBytesSlice(data) data = e.reverseBytesSlice(data)
for _, row := range data { for _, row := range data {
var entry *tapApi.Entry var entry *tapApi.Entry
err = json.Unmarshal(row, &entry) if err = json.Unmarshal(row, &entry); err != nil {
if err != nil {
break break
} }
connector.SendEntry(socketId, entry, params) if err = connector.SendEntry(socketId, entry, params); err != nil {
return
}
} }
return return
} }

View File

@@ -67,7 +67,6 @@
height: 100% height: 100%
display: flex display: flex
flex-direction: column flex-direction: column
margin-right: 10px
width: 100% width: 100%
border-radius: 4px border-radius: 4px
@@ -82,17 +81,18 @@
margin-top: 10px margin-top: 10px
margin-right: 10px margin-right: 10px
.protocolsFilterList, .servicesFilter .card
background: white background: white
padding: 10px padding: 10px
border-radius: 4px border-radius: 4px
user-select: none user-select: none
box-shadow: 0px 1px 5px #979797
.servicesFilter .servicesFilterWrapper
margin-top: 10px margin-top: 20px
margin-bottom: 3px
height: 100% height: 100%
overflow: hidden overflow: hidden
border-radius: 4px
& .servicesFilterList .servicesFilterList
height: calc(100% - 30px - 52px) height: calc(100% - 30px - 52px)

View File

@@ -158,6 +158,7 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
if (checkedProtocols.length === 0) { if (checkedProtocols.length === 0) {
setCheckedProtocols(getProtocolsForFilter.map(x => x.key)) setCheckedProtocols(getProtocolsForFilter.map(x => x.key))
} }
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [getProtocolsForFilter]) }, [getProtocolsForFilter])
useEffect(() => { useEffect(() => {
@@ -217,13 +218,13 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
<div className={styles.filterSection + ` ${isFilterClicked ? styles.show : ""}`}> <div className={styles.filterSection + ` ${isFilterClicked ? styles.show : ""}`}>
<Resizeable minWidth={170} maxWidth={320}> <Resizeable minWidth={170} maxWidth={320}>
<div className={styles.filterWrapper}> <div className={styles.filterWrapper}>
<div className={styles.protocolsFilterList}> <div className={styles.card}>
<SelectList items={getProtocolsForFilter} checkBoxWidth="5%" tableName={"PROTOCOLS"} multiSelect={true} <SelectList items={getProtocolsForFilter} checkBoxWidth="5%" tableName={"PROTOCOLS"} multiSelect={true}
checkedValues={checkedProtocols} setCheckedValues={onProtocolsChange} tableClassName={styles.filters} checkedValues={checkedProtocols} setCheckedValues={onProtocolsChange} tableClassName={styles.filters}
inputSearchClass={styles.servicesFilterSearch} isFilterable={false}/> inputSearchClass={styles.servicesFilterSearch} isFilterable={false}/>
</div> </div>
<div className={styles.servicesFilter}> <div className={styles.servicesFilterWrapper + ` ${styles.card}`}>
<div className={styles.servicesFilterList}> <div className={styles.servicesFilterList}>
<SelectList items={getServicesForFilter} tableName={"SERVICES"} tableClassName={styles.filters} multiSelect={true} <SelectList items={getServicesForFilter} tableName={"SERVICES"} tableClassName={styles.filters} multiSelect={true}
checkBoxWidth="5%" checkedValues={checkedServices} setCheckedValues={onServiceChanges} inputSearchClass={styles.servicesFilterSearch}/> checkBoxWidth="5%" checkedValues={checkedServices} setCheckedValues={onServiceChanges} inputSearchClass={styles.servicesFilterSearch}/>
</div> </div>

View File

@@ -85,7 +85,7 @@ const SelectList: React.FC<Props> = ({ items, tableName, checkedValues = [], mul
const tableBody = filteredValues.length === 0 ? const tableBody = filteredValues.length === 0 ?
<tr> <tr>
<td colSpan={2}> <td colSpan={2} className={styles.displayBlock}>
<NoDataMessage messageText={noItemsMessage} /> <NoDataMessage messageText={noItemsMessage} />
</td> </td>
</tr> </tr>

View File

@@ -1,44 +1,70 @@
@import '../../../variables.module' @import '../../../variables.module'
@import '../../../components' @import '../../../components'
.selectListTable .selectListTable
overflow: auto
height: 100%
user-select: none // when resizble moved we get unwanted beheviour user-select: none // when resizble moved we get unwanted beheviour
height: 100%
table table
width: 100% width: 100%
margin-top: 20px
border-collapse: collapse border-collapse: collapse
table-layout: fixed
height: 100%
display: flex
flex-flow: column
height: 100%
th thead
color: $blue-gray display: table
text-align: left table-layout: fixed
padding: 10px flex: 0 0 auto
position: sticky width: calc(100% - 0.9em)
top: 0
background: $main-background-color
font-size: 12px
tr tbody
border-bottom-width: 1px display: block
border-bottom-color: $data-background-color overflow: auto
border-bottom-style: solid width: 100%
width: 100% height: 100%
flex: 1 1 auto
td tbody tr:hover
color: $light-gray background: $header-background-color
padding: 10px
font-size: 11px th
font-weight: 600 color: $blue-gray
padding-top: 5px text-align: left
padding-bottom: 5px padding: 10px
background: $main-background-color
font-size: 12px
tr
border-bottom-width: 1px
border-bottom-color: $data-background-color
border-bottom-style: solid
width: 100%
display: block
position: relative
display: table
table-layout: fixed
td
color: $light-gray
padding: 10px
font-size: 11px
font-weight: 600
padding-top: 5px
padding-bottom: 5px
.nowrap .nowrap
white-space: nowrap white-space: nowrap
.totalSelected .totalSelected
font-size: 12px font-size: 12px
color: $light-blue-color color: $light-blue-color
font-weight: 700 font-weight: 700
.displayBlock
display: block
.filterInput
margin-bottom: 20px