| <!-- |
| ~ Copyright 2020-present Open Networking Foundation |
| ~ |
| ~ Licensed under the Apache License, Version 2.0 (the "License"); |
| ~ you may not use this file except in compliance with the License. |
| ~ You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, software |
| ~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~ See the License for the specific language governing permissions and |
| ~ limitations under the License. |
| --> |
| <div id="ov-int-app-main"> |
| <div class="tabular-header"> |
| <h2 style="font-weight: bold">In-band Network Telemetry (INT) Control |
| Application</h2> |
| </div> |
| |
| <hr> |
| |
| <div class="tabular-header"> |
| <h2> |
| INT Collector Configuration |
| </h2> |
| <div class="config-panel"> |
| <h3> |
| Collector IPv4 address and UDP port |
| </h3> |
| <form [formGroup]="formConf" (ngSubmit)="sendIntConfigString()"> |
| <input type="text" placeholder="IPv4 address" [ngClass]="{ 'is-invalid': formConf.controls.colIp.errors }" |
| class="form-control" formControlName="colIp"> |
| : |
| <input type="text" placeholder="port" class="form-control" [ngClass]="{ 'is-invalid': formConf.controls.colPort.errors }" formControlName="colPort"> |
| <div *ngIf="formConf.controls.colIp.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formConf.controls.colIp.errors.required"> Control IP is required</div> |
| <div class="error-text" *ngIf="formConf.controls.colIp.errors.pattern">Control IP must be a valid IP address</div> |
| </div> |
| <div *ngIf="formConf.controls.colPort.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formConf.controls.colPort.errors.required">Port is required</div> |
| <div class="error-text" *ngIf="formConf.controls.colPort.errors.pattern">Port must be a valid Port number</div> |
| </div> |
| <div class="config-button-panel"> |
| <button class="int-app-button"> |
| Apply Configuration |
| </button> |
| </div> |
| </form> |
| </div> |
| </div> |
| <div class="tabular-header"> |
| <h2 style="font-weight: bold">In-band Network Telemetry (INT) Control |
| Application</h2> |
| </div> |
| |
| <hr> |
| <div class="tabular-header"> |
| <h2> |
| INT Watchlist Rules |
| </h2> |
| <div> |
| <form [formGroup]="formSend" (ngSubmit)="sendIntIntentString()"> |
| <div class="input-panel"> |
| <h3> |
| Create New Watchlist Rule |
| </h3> |
| <div> |
| <label> |
| <input type="text" placeholder="Source IP address" [ngClass]="{ 'is-invalid': formSend.controls.ip4SrcPrefix.errors }" |
| class="form-control" formControlName="ip4SrcPrefix"> |
| |
| </label> |
| <label> |
| <input type="text" placeholder="Dest IP address" [ngClass]="{ 'is-invalid': formSend.controls.ip4DstPrefix.errors }" |
| class="form-control" formControlName="ip4DstPrefix"> |
| </label> |
| <label> |
| <input type="text" placeholder="Source port" [ngClass]="{ 'is-invalid': formSend.controls.l4SrcPort.errors }" |
| class="form-control" formControlName="l4SrcPort"> |
| </label> |
| <label> |
| <input type="text" placeholder="Dest port" [ngClass]="{ 'is-invalid': formSend.controls.l4DstPort.errors }" |
| class="form-control" formControlName="l4DstPort"> |
| </label> |
| <label> |
| Protocol |
| <select name="protocol" formControlName="protocol"> |
| <option selected disabled hidden |
| style="display: none" value=''></option> |
| <option value="TCP">TCP</option> |
| <option value="UDP">UDP</option> |
| </select> |
| </label> |
| <div *ngIf="formSend.controls.ip4DstPrefix.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formSend.controls.ip4DstPrefix.errors.required"> Destination IP is required</div> |
| <div class="error-text" *ngIf="formSend.controls.ip4DstPrefix.errors.pattern">Destination IP must be a valid IP address</div> |
| </div> |
| <div *ngIf="formSend.controls.ip4SrcPrefix.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formSend.controls.ip4SrcPrefix.errors.required">Source IP is required</div> |
| <div class="error-text" *ngIf="formSend.controls.ip4SrcPrefix.errors.pattern">Source IP must be a valid IP address</div> |
| </div> |
| <div *ngIf="formSend.controls.l4DstPort.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formSend.controls.l4DstPort.errors.pattern">Destination Port must be a valid Port</div> |
| </div> |
| <div *ngIf="formSend.controls.l4SrcPort.errors" class="invalid-feedback"> |
| <div class="error-text" *ngIf="formSend.controls.l4SrcPort.errors.pattern">Source Port must be a valid Port</div> |
| </div> |
| </div> |
| <div> |
| <div class="myrow"> |
| <div *ngFor="let data of metaData"> |
| <div class="mygrid"> |
| <label> |
| <input type="checkbox" |
| (change)="onCheckboxChange(data.value, $event.target.checked)"/> |
| {{ data.name }} |
| </label> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="button-panel"> |
| <button class="int-app-button"> |
| Apply Watchlist Rule |
| </button> |
| </div> |
| </form> |
| </div> |
| </div> |
| |
| <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> |
| <div class='int-app-main-intents'> |
| <div class="tabular-header"> |
| <h2>Installed Watchlist Rules ({{tableData.length}} total)</h2> |
| <div class="ctrl-btns"> |
| <div class="refresh" (click)="toggleRefresh()"> |
| <onos-icon classes="{{ autoRefresh?'active refresh':'refresh'}}" iconId="refresh" iconSize="42" |
| toolTip="{{ autoRefreshTip }}"></onos-icon> |
| </div> |
| <!-- tooltip tt-msg="uninstallTip" --> |
| <div (click)="delIntIntent()"> |
| <onos-icon classes="{active: ctrlBtnState.selection}" iconId="garbage" |
| iconSize="42"></onos-icon> |
| </div> |
| </div> |
| </div> |
| |
| <div id="summary-list" class="summary-list" onosTableResize> |
| <div class="table-header"> |
| <table> |
| <tr> |
| <td colId="available" class="table-icon"></td> |
| <td colId="type" class="table-icon"></td> |
| <td colId="id">ID</td> |
| <td colId="srcAddr" sortable>Src Address</td> |
| <td colId="dstAddr" sortable>Dst Address</td> |
| <td colId="srcPort" sortable>Src Port</td> |
| <td colId="dstPort" sortable>Dst Port</td> |
| <td colId="protocol" sortable>Protocol</td> |
| <td colId="metadata" sortable>Metadata</td> |
| </tr> |
| </table> |
| </div> |
| <div class="table-body"> |
| <table> |
| <tr class="table-body" *ngIf="tableData.length === 0" class="no-data"> |
| <td colspan="9">{{ annots.noRowsMsg }}</td> |
| </tr> |
| <tr *ngFor="let row of tableData | filter : tableDataFilter" |
| (click)="selectCallback($event, row)" |
| [ngClass]="{selected: row.id === selId, 'data-change': isChanged(row.id)}"> |
| <td class="table-icon"> |
| <onos-icon classes="{{ row._iconid_available}}" |
| iconId={{row._iconid_available}}></onos-icon> |
| </td> |
| <td class="table-icon"> |
| <onos-icon classes="{{row._iconid_type? 'active-type':undefined}}" |
| iconId="{{row._iconid_type}}"></onos-icon> |
| </td> |
| <td>{{ row.id }}</td> |
| <td>{{ row.srcAddr }}</td> |
| <td>{{ row.dstAddr}}</td> |
| <td>{{ row.srcPort}}</td> |
| <td>{{ row.dstPort }}</td> |
| <td>{{ row.protocol }}</td> |
| <td>{{ row.metadata }}</td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |