1 import {Injectable} from "@angular/core";
2 import {NgRedux} from "@angular-redux/store";
3 import {AppState} from "../../../../../../../shared/store/reducers";
4 import {AaiService} from "../../../../../../../shared/services/aaiService/aai.service";
6 updateGenericModalCriteria,
7 updateGenericModalhelper
8 } from "../../../../../../../shared/storeUtil/utils/global/global.actions";
9 import {ElementsTableService} from "../../../../../../../shared/components/searchMembersModal/members-table/elements-table.service";
15 } from "../../../../../../../shared/components/searchMembersModal/members-table/element-table-row.model";
16 import {Observable, of} from "rxjs";
17 import * as _ from "lodash";
18 import {CustomTableColumnDefinition} from "../../../../../../../shared/components/searchMembersModal/members-table/elements-table.component";
19 import {NetworkModalRow} from "./network.step.model";
22 export class NetworkStepService {
23 constructor(private _store: NgRedux<AppState>, private _aaiService: AaiService) {}
25 uniqObjectField: string = "instanceId";
26 type: string = "Network";
28 getNetworkStep = (serviceInstance, serviceModelId, ...otherSteps): ModalInformation => {
31 serviceModelId: serviceModelId,
32 title: 'Associate network to VRF Entry',
33 description: 'Select a network to associate to the VRF Entry',
34 noElementsMsg: 'No network were found.',
36 uniqObjectField: this.uniqObjectField,
37 backAction: (searchElementsModalComponent) => {
38 searchElementsModalComponent.closeDialog();
42 action: (searchElementsModalComponent) => {
43 let tmpMembers = searchElementsModalComponent._membersTableService.allElementsStatusMap;
44 let vpnStep = otherSteps[0];
45 for (let key in tmpMembers) {
46 if (tmpMembers[key].isSelected) {
47 this._store.dispatch(updateGenericModalhelper(`selected${this.type}`, tmpMembers[key], this.uniqObjectField));
50 ElementsTableService.changeModalInformationDataTrigger.next({
51 modalInformation: vpnStep.getVpnStep(serviceInstance, searchElementsModalComponent.modalInformation.serviceModelId, ...otherSteps),
58 action: (searchElementsModalComponent) => {
59 this.getNetworks(serviceInstance).subscribe((networks) => {
60 const currentRole = searchElementsModalComponent.modalInformation.criteria.find((criteria: ICriteria) => {
61 criteria.label === 'Roles';
63 ElementsTableService.changeFnTableDataTrigger.next(
64 networks.filter((network) => {
65 if (_.isNil(currentRole)) return network;
66 return network.role === currentRole.currentValue;
71 getElements: (...args) => this.getNetworks(serviceInstance),
72 criteria: this.getNetworkStepCriteria(serviceInstance),
73 searchFields: this.getsNetworkStepSearchFields(serviceInstance),
74 tableHeaders: this.getNetworkStepHeaders(),
75 tableContent: this.getNetworkTableContent()
79 getNetworks = (serviceInstance): Observable<any[]> => {
80 let cloudRegion = serviceInstance.lcpCloudRegionId;
81 let tenantId = serviceInstance.tenantId;
82 return this._aaiService.retrieveActiveNetwork(cloudRegion, tenantId).map((networks: NetworkModalRow[]) => {
83 this.generateRolesOptions(networks);
84 return this.sortElementsResultByField(networks, this.uniqObjectField);
88 getNetworkStepCriteria(serviceInstance): ICriteria[] {
93 onInit: (): Observable<any> => of(this._store.getState().global.genericModalCriteria.roles),
94 onChange: (that, selectedOption): void => {
95 that.currentValue = selectedOption;
97 dataTestId: 'roles-criteria',
102 getsNetworkStepSearchFields = (serviceInstance): ISearchField[] => {
106 dataTestId: 'Region',
107 value: serviceInstance["lcpCloudRegionId"],
111 dataTestId: 'Tenant',
112 value: serviceInstance["tenantName"],
116 title: 'Orch. status',
117 dataTestId: 'Orch_status',
123 dataTestId: 'Related_to',
124 value: "VPN binding",
130 generateRolesOptions = (networks): void => {
131 let roles: string[] = (_.uniq(_.flatten(_.map(networks, 'role').filter((role) => !_.isNil(role))))).sort();
132 const SELECTED_AN_OPTION: string = "-- select an option --";
133 const NOT_ASSIGNED: string = "Not assigned";
135 roles = _.remove([SELECTED_AN_OPTION, this.shouldAddNotAssigned(networks) ? NOT_ASSIGNED : null, ...roles], null);
136 this._store.dispatch(updateGenericModalCriteria("roles", roles));
139 getNetworkStepHeaders = (): CustomTableColumnDefinition[] => {
141 {displayName: `Name`, key: ['instanceName']},
142 {displayName: `Type`, key: ['instanceType']},
143 {displayName: `Role`, key: ['role']},
144 {displayName: 'Orch. Status', key: ['orchStatus']},
145 {displayName: 'Physical name', key: ['physicalName']},
146 {displayName: 'Instance ID', key: ['instanceId']},
147 {displayName: 'Model UUID', key: ['modelInfo', 'modelVersionId']},
148 {displayName: 'Service name', key: ['serviceName']},
149 {displayName: 'Service UUID', key: ['serviceUUID']},
150 {displayName: 'Tenant', key: ['tenantName']},
151 {displayName: 'Region', key: ['lcpCloudRegionId']}
155 getNetworkTableContent = (): ITableContent[] => {
161 value: ["instanceName"]
168 value: ['instanceType']
179 id: 'network-orch-status',
182 value: ['orchStatus']
186 id: 'network-physical-name',
188 id: ['physicalName'],
189 value: ['physicalName']
193 id: 'network-instance-id',
196 value: ['instanceId']
200 id: 'network-model-uuid',
203 value: ['modelInfo', 'modelVersionId']
207 id: 'network-serviceName',
210 value: ['serviceName']
214 id: 'network-service-id',
217 value: ['serviceUUID']
221 id: 'network-tenantName',
224 value: ['tenantName']
228 id: 'network-region',
231 value: ['lcpCloudRegionId']
237 sortElementsResultByField = (elements, fieldName): any[] => {
238 return _.sortBy(elements, o => o[fieldName]);
241 shouldAddNotAssigned = (networks): boolean => {
242 return _.values(networks).some(network => _.isNil(network.role) || network.role === "");