Update controlSocket.go, mizuRunner.go, and 5 more files...

This commit is contained in:
RamiBerm 2021-05-24 17:06:30 +03:00
parent fbeb7fe9cd
commit 5e6b6544de
7 changed files with 85 additions and 15 deletions

View File

@ -21,13 +21,13 @@ func CreateControlSocket(socketServerAddress string) (*ControlSocket, error) {
} }
} }
func (controlSocket *ControlSocket) SendNewTappedPodsListMessage(namespace string, pods []core.Pod) error { func (controlSocket *ControlSocket) SendNewTappedPodsListMessage(pods []core.Pod) error {
podInfos := make([]shared.PodInfo, 0) podInfos := make([]shared.PodInfo, 0)
for _, pod := range pods { for _, pod := range pods {
podInfos = append(podInfos, shared.PodInfo{Name: pod.Name}) podInfos = append(podInfos, shared.PodInfo{Name: pod.Name, Namespace: pod.Namespace})
} }
tapStatus := shared.TapStatus{Namespace: namespace, Pods: podInfos} tapStatus := shared.TapStatus{Pods: podInfos}
socketMessage := shared.MizuSocketMessage{MessageType: shared.TAPPING_STATUS_MESSAGE_TYPE, Data: tapStatus} socketMessage := shared.CreateWebSocketStatusMessage(tapStatus)
jsonMessage, err := json.Marshal(socketMessage) jsonMessage, err := json.Marshal(socketMessage)
if err != nil { if err != nil {

View File

@ -205,7 +205,7 @@ func syncApiStatus(ctx context.Context, cancel context.CancelFunc, namespace str
case <- ctx.Done(): case <- ctx.Done():
return return
default: default:
err = controlSocket.SendNewTappedPodsListMessage(namespace, currentlyTappedPods) err = controlSocket.SendNewTappedPodsListMessage(currentlyTappedPods)
if err != nil { if err != nil {
fmt.Printf("error Sending message via control socket %s\n", err) fmt.Printf("error Sending message via control socket %s\n", err)
} }

View File

@ -1,21 +1,35 @@
package shared package shared
type ControlSocketMessageType string type WebSocketMessageType string
const ( const (
TAPPING_STATUS_MESSAGE_TYPE ControlSocketMessageType = "tappingStatus" WebSocketMessageTypeEntry WebSocketMessageType = "entry"
WebSocketMessageTypeTappedEntry WebSocketMessageType = "tappedEntry"
WebSocketMessageTypeUpdateStatus WebSocketMessageType = "status"
) )
type MizuSocketMessage struct { type WebSocketMessageMetadata struct {
MessageType ControlSocketMessageType `json:"messageType"` MessageType WebSocketMessageType `json:"messageType,omitempty"`
Data interface{} `json:"data"` }
type WebSocketStatusMessage struct {
*WebSocketMessageMetadata
TappingStatus TapStatus `json:"tappingStatus"`
} }
type TapStatus struct { type TapStatus struct {
Namespace string `json:"namespace"`
Pods []PodInfo `json:"pods"` Pods []PodInfo `json:"pods"`
} }
type PodInfo struct { type PodInfo struct {
Namespace string `json:"namespace"`
Name string `json:"name"` Name string `json:"name"`
} }
func CreateWebSocketStatusMessage(tappingStatus TapStatus) WebSocketStatusMessage {
return WebSocketStatusMessage{
WebSocketMessageMetadata: &WebSocketMessageMetadata{
MessageType: WebSocketMessageTypeUpdateStatus,
},
TappingStatus: tappingStatus,
}
}

View File

@ -8,6 +8,7 @@ import {HAREntryDetailed} from "./HarEntryDetailed";
import playIcon from './assets/play.svg'; import playIcon from './assets/play.svg';
import pauseIcon from './assets/pause.svg'; import pauseIcon from './assets/pause.svg';
import variables from './style/variables.module.scss'; import variables from './style/variables.module.scss';
import {StatusBar} from "./StatusBar";
const useLayoutStyles = makeStyles(() => ({ const useLayoutStyles = makeStyles(() => ({
details: { details: {
@ -49,6 +50,8 @@ export const HarPage: React.FC = () => {
const [statusFilter, setStatusFilter] = useState([]); const [statusFilter, setStatusFilter] = useState([]);
const [pathFilter, setPathFilter] = useState(""); const [pathFilter, setPathFilter] = useState("");
const [apiStatus, setApiStatus] = useState(null);
const ws = useRef(null); const ws = useRef(null);
const openWebSocket = () => { const openWebSocket = () => {
@ -77,8 +80,9 @@ export const HarPage: React.FC = () => {
} }
setEntries([...newEntries, entry]) setEntries([...newEntries, entry])
break break
case "updateStatus": case "status":
console.log("not implemented yet") console.log('status update', message);
setApiStatus(message.tappingStatus);
break break
default: default:
console.error(`unsupported websocket message type, Got: ${message.messageType}`) console.error(`unsupported websocket message type, Got: ${message.messageType}`)
@ -88,6 +92,9 @@ export const HarPage: React.FC = () => {
useEffect(() => { useEffect(() => {
openWebSocket(); openWebSocket();
fetch(`http://localhost:8899/api/tapStatus`)
.then(response => response.json())
.then(data => setApiStatus(data));
}, []); }, []);
@ -166,6 +173,7 @@ export const HarPage: React.FC = () => {
{selectedHarEntry && <HAREntryDetailed harEntry={selectedHarEntry} classes={{root: classes.harViewer}}/>} {selectedHarEntry && <HAREntryDetailed harEntry={selectedHarEntry} classes={{root: classes.harViewer}}/>}
</div> </div>
</div>} </div>}
{apiStatus && <StatusBar tappingStatus={apiStatus}/>}
</div> </div>
) )
}; };

View File

@ -0,0 +1,28 @@
import './style/StatusBar.sass';
import React from "react";
export interface TappingStatusPod {
name: string;
namespace: string;
}
export interface TappingStatus {
pods: TappingStatusPod[];
}
export interface Props {
tappingStatus: TappingStatus
}
const pluralize = (noun: string, amount: number) => {
return `${noun}${amount != 1 ? 's' : ''}`
}
export const StatusBar: React.FC<Props> = ({tappingStatus}) => {
const uniqueNamespaces = Array.from(new Set(tappingStatus.pods.map(pod => pod.namespace)));
const amountOfPods = tappingStatus.pods.length;
return <div className='StatusBar'>
<span>{`Tapping ${amountOfPods} ${pluralize('pod', amountOfPods)} in ${pluralize('namespace', uniqueNamespaces.length)} ${uniqueNamespaces.join(", ")}`}</span>
</div>;
}

View File

@ -6,7 +6,7 @@
flex-direction: column flex-direction: column
overflow: hidden overflow: hidden
flex-grow: 1 flex-grow: 1
height: calc(100vh - 100px) height: calc(100vh - 80px)
.harPageHeader .harPageHeader
padding: 20px 24px padding: 20px 24px

View File

@ -0,0 +1,20 @@
@import 'variables.module.scss'
.StatusBar
position: absolute
transform: translate(-50%, -3px)
left: 50%
z-index: 9999
min-width: 200px
height: 32px
background: $blue-color
color: $light-blue-color
border-bottom-left-radius: 8px
border-bottom-right-radius: 8px
top: 0
display: flex
align-items: center
padding: 2px 10px
user-select: none
font-size: 14px
opacity: 0.8