...
The use case implementations are located in the "nonrtric/rapp/orufronthaulrecoveryorufhrecovery" repo. Some test scripts and docker compose files are located in the "nonrtric" repo.
...
Instantiate the control loop
Create Instance dialog
Instantiation properties saved successfully
...
Control loop changed to PASSIVE state
In a similar way, change the control loop state to RUNNING.
Control loop changed to RUNNING state
Once the control loop gets into the RUNNING PASSIVE state, the corresponding version of the usecase should be up and running.
...
NOTE: There is a limitation in the istanbul Jakarta version of policy/clamp that only one tosca template can be commissioned at a time. So, always delete the currently commissioned template before trying a new one.
In order to delete the control loop instance, it should be first changed back to PASSIVE state and then to UNINITIALISED state. Once the instance shows PASSIVE UNINITIALISED under Instantiation Current State, press the Delete button under Delete Instantiation.
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
tosca_definitions_version: tosca_simple_yaml_1_1_03 data_types: onap.datatypes.ToscaConceptIdentifier: derived_from: tosca.datatypes.Root properties: name: type: string required: true version: type: string required: true onap.datatype.controlloop.Target: derived_from: tosca.datatypes.Root description: Definition for a entity in A&AI to perform a control loop operation on properties: targetType: type: string description: Category for the target type required: true constraints: - valid_values: - VNF - VM - VFMODULE - PNF entityIds: type: map description: | Map of values that identify the resource. If none are provided, it is assumed that the entity that generated the ONSET event will be the target. required: false metadata: clamp_possible_values: ClampExecution:CSAR_RESOURCES entry_schema: type: string onap.datatype.controlloop.Actor: derived_from: tosca.datatypes.Root description: An actor/operation/target definition properties: actor: type: string description: The actor performing the operation. required: true metadata: clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor operation: type: string description: The operation the actor is performing. metadata: clamp_possible_values: Dictionary:DefaultOperations,ClampExecution:CDS/operation required: true target: type: onap.datatype.controlloop.Target description: The resource the operation should be performed on. required: true payload: type: map description: Name/value pairs of payload information passed by Policy to the actor required: false metadata: clamp_possible_values: ClampExecution:CDS/payload entry_schema: type: string onap.datatype.controlloop.Operation: derived_from: tosca.datatypes.Root description: An operation supported by an actor properties: id: type: string description: Unique identifier for the operation required: true description: type: string description: A user-friendly description of the intent for the operation required: false operation: type: onap.datatype.controlloop.Actor description: The definition of the operation to be performed. required: true timeout: type: integer description: The amount of time for the actor to perform the operation. required: true retries: type: integer description: The number of retries the actor should attempt to perform the operation. required: true default: 0 success: type: string description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation. required: false default: final_success failure: type: string description: Points to the operation to invoke on Actor operation failure. required: false default: final_failure failure_timeout: type: string description: Points to the operation to invoke when the time out for the operation occurs. required: false default: final_failure_timeout failure_retries: type: string description: Points to the operation to invoke when the current operation has exceeded its max retries. required: false default: final_failure_retries failure_exception: type: string description: Points to the operation to invoke when the current operation causes an exception. required: false default: final_failure_exception failure_guard: type: string description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement. required: false default: final_failure_guard policy_types: onap.policies.controlloop.operational.Common: derived_from: tosca.policies.Root version: 1.0.0 name: onap.policies.controlloop.operational.Common description: | Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant Policy Types. This does NOT support the legacy Policy YAML policy type. properties: id: type: string description: The unique control loop id. required: true timeout: type: integer description: | Overall timeout for executing all the operations. This timeout should equal or exceed the total timeout for each operation listed. required: true abatement: type: boolean description: Whether an abatement event message will be expected for the control loop from DCAE. required: true default: false trigger: type: string description: Initial operation to execute upon receiving an Onset event message for the Control Loop. required: true operations: type: list description: List of operations to be performed when Control Loop is triggered. required: true entry_schema: type: onap.datatype.controlloop.Operation onap.policies.controlloop.operational.common.Apex: derived_from: onap.policies.controlloop.operational.Common type_version: 1.0.0 version: 1.0.0 name: onap.policies.controlloop.operational.common.Apex description: Operational policies for Apex PDP properties: engineServiceParameters: type: string description: The engine parameters like name, instanceCount, policy implementation, parameters etc. required: true eventInputParameters: type: string description: The event input parameters. required: true eventOutputParameters: type: string description: The event output parameters. required: true javaProperties: type: string description: Name/value pairs of properties to be set for APEX if needed. required: false node_types: org.onap.policy.clamp.controlloopacm.Participant: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requred: false org.onap.policy.clamp.controlloopacm.ControlLoopElementAutomationCompositionElement: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string required: false metadata: common: true description: Specifies the organization that provides the controlautomation loopcomposition element participant_id: type: onap.datatypes.ToscaConceptIdentifier requred: true metadata: common: true participantType: type: onap.datatypes.ToscaConceptIdentifier required: true metadata: common: true description: The identity of the participant type that hosts this type of ControlAutomation LoopComposition Element startPhase: type: integer required: false constraints: - greater_or_equal: 0 metadata: common: true description: A value indicating the start phase in which this controlautomation loopcomposition element will be started, the first start phase is zero. ControlAutomation LoopComposition Elements are started in their start_phase order and stopped in reverse start phase order. ControlAutomation LoopComposition Elements with the same start phase are started and stopped simultaneously uninitializedToPassiveTimeout: type: integer required: false constraints: - greater_or_equal: 0 default: 60 metadata: common: true description: The maximum time in seconds to wait for a state chage from uninitialized to passive passiveToRunningTimeout: type: integer required: false constraints: - greater_or_equal: 0 default: 60 metadata: common: true description: The maximum time in seconds to wait for a state chage from passive to running runningToPassiveTimeout: type: integer required: false constraints: - greater_or_equal: 0 default: 60 metadata: common: true description: The maximum time in seconds to wait for a state chage from running to passive passiveToUninitializedTimeout: type: integer required: false constraints: - greater_or_equal: 0 default: 60 metadata: common: true description: The maximum time in seconds to wait for a state chage from passive to uninitialized org.onap.policy.clamp.controlloopacm.ControlLoopAutomationComposition: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string required: false metadata: common: true description: Specifies the organization that provides the controlautomation loopcomposition element elements: type: list required: true metadata: common: true entry_schema: type: onap.datatypes.ToscaConceptIdentifier description: Specifies a list of controlautomation loopcomposition element definitions that make up this controlautomation loopcomposition definition org.onap.policy.clamp.controlloopacm.PolicyControlLoopElementPolicyAutomationCompositionElement: version: 1.0.1 derived_from: org.onap.policy.clamp.controlloopacm.ControlLoopElementAutomationCompositionElement properties: policy_type_id: type: onap.datatypes.ToscaConceptIdentifier requred: true policy_id: type: onap.datatypes.ToscaConceptIdentifier requred: false topology_template: node_templatesinputs: org.onap.domain.linkmonitor.LinkMonitorPolicyControlLoopElementpmsh_operational_policy: versiontype: 1onap.2datatypes.3ToscaConceptIdentifier typedescription: org.onap.policy.clamp.controlloop.PolicyControlLoopElement type_version: 1.0.1 The ID of the PMSH operational policy to use description: Control loop element for the Link Monitor properties: provider: Ericsson participant_id: default: name: orgoperational.onapapex.PM_Policylinkmonitor version: 1.0.0 participantType: node_templates: name: org.onap.policy.clamp.controlloopacm.PolicyControlLoopParticipant PolicyParticipant: version: 2.3.1 policy_type_id: name: onap.policies.controlloop.operational.common.Apex org.onap.policy.clamp.acm.Participant type_version: 1.0.01 policy_iddescription: Participant for name: operational.apex.linkmonitorDCAE microservices version: 1.0.0properties: pdpGroupprovider: defaultGroupONAP org.onap.domain.linkmonitorpmsh.LinkMonitorControlLoopDefinition0PMSH_OperationalPolicyAutomationCompositionElement: version: 1.2.3 type: org.onap.policy.clamp.controlloopacm.ControlLoopPolicyAutomationCompositionElement type_version: 1.0.01 description: Control loop for Link Monitor Automation composition element for the operational policy for Performance Management Subscription Handling properties: provider: Ericsson elementsparticipant_id: - name: org.onap.domain.linkmonitor.LinkMonitorPolicyControlLoopElementPM_Policy version: 1.20.30 org.onap.policy.controlloop.PolicyControlLoopParticipant: participantType: version: 2.3.1 typename: org.onap.policy.clamp.controlloopacm.ParticipantPolicyParticipant type_version: 1.0 version: 2.3.1 descriptionpolicy_type_id: Participant for policy framework properties: name: onap.policies.operational.pm-subscription-handler providerversion: ONAP policies: - operational.apex.linkmonitor1.0.0 policy_id: get_input: pmsh_operational_policy org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition: typeversion: onap1.policies.controlloop.operational.common.Apex2.3 type_version: 1.0.0org.onap.policy.clamp.acm.AutomationComposition type_version: 1.0.01 metadata: description: Automation composition for Hello World policy-id: operational.apex.linkmonitorproperties: policy-versionprovider: 1.0.0Ericsson properties: elements: engineServiceParameters: - name: LinkMonitorApexEngine org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement version: 01.0.1 2.3 policies: - operational.apex.linkmonitor: idtype: 101onap.policies.controlloop.operational.common.Apex instanceCounttype_version: 1.0.0 deploymentPortversion: 123451.0.0 engineParametersproperties: executorParametersengineServiceParameters: name: JAVASCRIPT:LinkMonitorApexEngine parameterClassName: version: 0.0.1 id: 101 instanceCount: 1 deploymentPort: 12345 engineParameters: executorParameters: JAVASCRIPT: parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters contextParameters: parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters schemaParameters: Avro: parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters taskParameters: - key: ORU-ODU-Map value: |- { "ERICSSON-O-RU-11220": "O-DU-1122", "ERICSSON-O-RU-11221": "O-DU-1122", "ERICSSON-O-RU-11222": "O-DU-1122", "ERICSSON-O-RU-11223": "O-DU-1122", "ERICSSON-O-RU-11224": "O-DU-1123", "ERICSSON-O-RU-11225": "O-DU-1123", "ERICSSON-O-RU-11226": "O-DU-1123", "ERICSSON-O-RU-11227": "O-DU-1124", "ERICSSON-O-RU-11228": "O-DU-1125", "ERICSSON-O-RU-11229": "O-DU-1125" } policy_type_impl: apexPolicyModel: key: name: LinkMonitorModel version: 0.0.1 keyInformation: key: name: LinkMonitorModel_KeyInfo version: 0.0.1 keyInfoMap: entry: - key: name: ApexMessageOutputEvent version: 0.0.1 value: key: name: ApexMessageOutputEvent version: 0.0.1 UUID: cca47d74-7754-4a61-b163-ca31f66b157b description: Generated description for concept referred to by key "ApexMessageOutputEvent:0.0.1" - key: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 value: key: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 UUID: a295d6a3-1b73-387e-abba-b41e9b608802 description: Generated description for concept referred to by key "CreateLinkClearedOutfieldsEvent:0.0.1" - key: name: CreateLinkClearedOutfieldsTask version: 0.0.1 value: key: name: CreateLinkClearedOutfieldsTask version: 0.0.1 UUID: fd594e88-411d-4a94-b2be-697b3a0d7adf description: This task creates the output fields when link failure is cleared. - key: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 value: key: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 UUID: 02be2b5d-45b7-3c54-ae54-97f2b5c30125 description: Generated description for concept referred to by key "CreateLinkFailureOutfieldsEvent:0.0.1" - key: name: CreateLinkFailureOutfieldsTask version: 0.0.1 value: key: name: CreateLinkFailureOutfieldsTask version: 0.0.1 UUID: ac3d9842-80af-4a98-951c-bd79a431c613 description: This task the output fields when link failure is detected. - key: name: LinkClearedTask version: 0.0.1 value: key: name: LinkClearedTask version: 0.0.1 UUID: eecfde90-896c-4343-8f9c-2603ced94e2d description: This task sends a message to the output when link failure is cleared. - key: name: LinkFailureInputEvent version: 0.0.1 value: key: name: LinkFailureInputEvent version: 0.0.1 UUID: c4500941-3f98-4080-a9cc-5b9753ed050b description: Generated description for concept referred to by key "LinkFailureInputEvent:0.0.1" - key: name: LinkFailureInputSchema version: 0.0.1 value: key: name: LinkFailureInputSchema version: 0.0.1 UUID: 3b3974fc-3012-3b02-9f33-c9d8eefe4dc1 description: Generated description for concept referred to by key "LinkFailureInputSchema:0.0.1" - key: name: LinkFailureOutputEvent version: 0.0.1 value: key: name: LinkFailureOutputEvent version: 0.0.1 UUID: 4f04aa98-e917-4f4a-882a-c75ba5a99374 description: Generated description for concept referred to by key "LinkFailureOutputEvent:0.0.1" - key: name: LinkFailureOutputSchema version: 0.0.1 value: key: name: LinkFailureOutputSchema version: 0.0.1 UUID: 2d1a7f6e-eb9a-3984-be1f-283d98111b84 description: Generated description for concept referred to by key "LinkFailureOutputSchema:0.0.1" - key: name: LinkFailureTask version: 0.0.1 value: key: name: LinkFailureTask version: 0.0.1 UUID: 3351b0f4-cf06-4fa2-8823-edf67bd30223 description: This task updates the config for O-RU when link failure is detected. - key: name: LinkMonitorModel version: 0.0.1 value: key: name: LinkMonitorModel version: 0.0.1 UUID: 540226fb-55ee-4f0e-a444-983a0494818e description: This is the Apex Policy Model for link monitoring. - key: name: LinkMonitorModel_Events version: 0.0.1 value: key: name: LinkMonitorModel_Events version: 0.0.1 UUID: 27ad3e7e-fe3b-3bd6-9081-718705c2bcea description: Generated description for concept referred to by key "LinkMonitorModel_Events:0.0.1" - key: name: LinkMonitorModel_KeyInfo version: 0.0.1 value: key: name: LinkMonitorModel_KeyInfo version: 0.0.1 UUID: ea0b5f58-eefd-358a-9660-840c640bf981 description: Generated description for concept referred to by key "LinkMonitorModel_KeyInfo:0.0.1" - key: name: LinkMonitorModel_Policies version: 0.0.1 value: key: name: LinkMonitorModel_Policies version: 0.0.1 UUID: ee9e0b0f-2b7d-3ab7-9a98-c5ec05ed823d description: Generated description for concept referred to by key "LinkMonitorModel_Policies:0.0.1" - key: name: LinkMonitorModel_Schemas version: 0.0.1 value: key: name: LinkMonitorModel_Schemas version: 0.0.1 UUID: fa5f9b8f-796c-3c70-84e9-5140c958c4bb description: Generated description for concept referred to by key "LinkMonitorModel_Schemas:0.0.1" - key: name: LinkMonitorModel_Tasks version: 0.0.1 value: key: name: LinkMonitorModel_Tasks version: 0.0.1 UUID: eec592f7-69d5-39a9-981a-e552f787ed01 description: Generated description for concept referred to by key "LinkMonitorModel_Tasks:0.0.1" - key: name: LinkMonitorPolicy version: 0.0.1 value: key: name: LinkMonitorPolicy version: 0.0.1 UUID: 6c5e410f-489a-46ff-964e-982ce6e8b6d0 description: Generated description for concept referred to by key "LinkMonitorPolicy:0.0.1" - key: name: MessageSchema version: 0.0.1 value: key: name: MessageSchema version: 0.0.1 UUID: ac4b34ac-39d6-3393-a267-8d5b84854018 description: A schema for messages from apex - key: name: NoPolicyDefinedTask version: 0.0.1 value: key: name: NoPolicyDefinedTask version: 0.0.1 UUID: d48b619e-d00d-4008-b884-02d76ea4350b description: This task sends a message to the output when an event is received for which no policy has been defined. - key: name: OduIdSchema version: 0.0.1 value: key: name: OduIdSchema version: 0.0.1 UUID: 50662174-a88b-3cbd-91bd-8e91b40b2660 description: A schema for O-DU-ID - key: name: OruIdSchema version: 0.0.1 value: key: name: OruIdSchema version: 0.0.1 UUID: 54daf32b-015f-39cd-8530-a1175c5553e9 description: A schema for O-RU-ID policies: key: name: LinkMonitorModel_Policies version: 0.0.1 policyMap: entry: - key: name: LinkMonitorPolicy version: 0.0.1 value: policyKey: name: LinkMonitorPolicy version: 0.0.1 template: Freestyle state: entry: - key: LinkClearedState value: stateKey: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: 'NULL' localName: LinkClearedState trigger: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 stateOutputs: entry: - key: LinkClearedLogic_Output_Direct value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkClearedState localName: LinkClearedLogic_Output_Direct outgoingEvent: name: ApexMessageOutputEvent version: 0.0.1 nextState: parentKeyName: parentKeyName: 'NULL' parentKeyVersion: 0.0.0 parentLocalName: 'NULL' localName: 'NULL' contextAlbumReference: [] taskSelectionLogic: key: 'NULL' logicFlavour: UNDEFINED logic: '' stateFinalizerLogicMap: entry: [] defaultTask: name: LinkClearedTask version: 0.0.1 taskReferences: entry: - key: name: LinkClearedTask version: 0.0.1 value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkClearedState localName: LinkClearedTask outputType: DIRECT output: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkClearedState localName: LinkClearedLogic_Output_Direct - key: LinkFailureOrClearedState value: stateKey: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: 'NULL' localName: LinkFailureOrClearedState trigger: name: LinkFailureInputEvent version: 0.0.1 stateOutputs: entry: - key: CreateLinkClearedOutfieldsLogic_Output_Direct value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: CreateLinkClearedOutfieldsLogic_Output_Direct outgoingEvent: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 nextState: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: 'NULL' localName: LinkClearedState - key: CreateLinkFailureOutfieldsLogic_Output_Direct value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: parentLocalName: LinkFailureOrClearedState localName: CreateLinkFailureOutfieldsLogic_Output_Direct outgoingEvent: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 nextState: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: 'NULL' localName: LinkFailureState - key: NoPolicyDefinedLogic_Output_Direct value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: NoPolicyDefinedLogic_Output_Direct outgoingEvent: name: ApexMessageOutputEvent version: 0.0.1 nextState: parentKeyName: 'NULL' parentKeyVersion: 0.0.0 parentLocalName: 'NULL' localName: 'NULL' contextAlbumReference: [] taskSelectionLogic: key: TaskSelectionLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Selection Execution: '"+executor.subject.id+ "'. InputFields: '"+executor.inFields+"'"); var linkFailureInput = executor.inFields.get("LinkFailureInput"); var commonEventHeader = linkFailureInput.get("event").get("commonEventHeader"); var domain = commonEventHeader.get("domain"); taskFailure = executor.subject.getTaskKey("CreateLinkFailureOutfieldsTask"); taskCleared = executor.subject.getTaskKey("CreateLinkClearedOutfieldsTask"); taskDefault = executor.subject.getDefaultTaskKey(); if (domain == "fault") { var faultFields = linkFailureInput.get("event").get("faultFields"); var alarmCondition var alarmCondition = faultFields.get("alarmCondition"); var eventSeverity = faultFields.get("eventSeverity"); if (alarmCondition == "28" && eventSeverity != "NORMAL") { taskFailure.copyTo(executor.selectedTask); } else if (alarmCondition == "28" && eventSeverity == "NORMAL") { taskCleared.copyTo(executor.selectedTask); } else { taskDefault.copyTo(executor.selectedTask); } } else { taskDefault.copyTo(executor.selectedTask); } true; stateFinalizerLogicMap: entry: [] defaultTask: name: NoPolicyDefinedTask version: 0.0.1 taskReferences: entry: - key: name: CreateLinkClearedOutfieldsTask version: 0.0.1 value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: CreateLinkClearedOutfieldsTask outputType: DIRECT output: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: CreateLinkClearedOutfieldsLogic_Output_Direct - key: name: CreateLinkFailureOutfieldsTask version: 0.0.1 value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: CreateLinkFailureOutfieldsTask outputType: DIRECT output: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: CreateLinkFailureOutfieldsLogic_Output_Direct - key: name: NoPolicyDefinedTask version: 0.0.1 value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: NoPolicyDefinedTask outputType: DIRECT output: parentKeyName: LinkMonitorPolicy parentKeyVersion: parentKeyVersion: 0.0.1 parentLocalName: LinkFailureOrClearedState localName: NoPolicyDefinedLogic_Output_Direct - key: LinkFailureState value: stateKey: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: 'NULL' localName: LinkFailureState trigger: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 stateOutputs: entry: - key: LinkFailureLogic_Output_Direct value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureState localName: LinkFailureLogic_Output_Direct outgoingEvent: name: LinkFailureOutputEvent version: 0.0.1 nextState: parentKeyName: 'NULL' parentKeyVersion: 0.0.0 parentLocalName: 'NULL' localName: 'NULL' contextAlbumReference: [] taskSelectionLogic: key: 'NULL' logicFlavour: UNDEFINED logic: '' stateFinalizerLogicMap: entry: [] defaultTask: name: LinkFailureTask version: 0.0.1 taskReferences: entry: - key: name: LinkFailureTask version: 0.0.1 value: key: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureState localName: LinkFailureTask outputType: DIRECT output: parentKeyName: LinkMonitorPolicy parentKeyVersion: 0.0.1 parentLocalName: LinkFailureState localName: LinkFailureLogic_Output_Direct firstState: LinkFailureOrClearedState tasks: key: name: LinkMonitorModel_Tasks version: 0.0.1 taskMap: entry: - key: name: CreateLinkClearedOutfieldsTask version: 0.0.1 value: key: name: CreateLinkClearedOutfieldsTask version: 0.0.1 inputFields: entry: - key: LinkFailureInput value: key: LinkFailureInput fieldSchemaKey: name: LinkFailureInputSchema version: 0.0.1 optional: false outputFields: entry: - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false taskParameters: entry: [] contextAlbumReference: [] taskLogic: key: TaskLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Execution: '"+executor.subject.id+"'. Input Fields: '"+executor.inFields+"'"); var linkFailureInput = executor.inFields.get("LinkFailureInput"); var oruId = linkFailureInput.get("event").get("commonEventHeader").get("sourceName"); executor.outFields.put("OruId", oruId); executor.logger.info(executor.outFields); true; - key: name: CreateLinkFailureOutfieldsTask version: 0.0.1 value: key: name: CreateLinkFailureOutfieldsTask version: 0.0.1 inputFields: entry: - key: LinkFailureInput value: key: LinkFailureInput fieldSchemaKey: name: LinkFailureInputSchema version: 0.0.1 optional: false outputFields: entry: - key: OduId value: key: OduId fieldSchemaKey: name: OduIdSchema version: 0.0.1 optional: false - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false taskParameters: entry: [] contextAlbumReference: [] taskLogic: key: TaskLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Execution: '"+executor.subject.id+"'. Input Fields: '"+executor.inFields+"'"); var returnValue = true; var linkFailureInput = executor.inFields.get("LinkFailureInput"); var oruId = linkFailureInput.get("event").get("commonEventHeader").get("sourceName"); var oruOduMap = JSON.parse(executor.parameters.get("ORU-ODU-Map")); if (oruId in oruOduMap) { var oduId = oruOduMap[oruId]; executor.outFields.put("OruId", oruId); executor.outFields.put("OduId", oduId); executor.logger.info(executor.outFields); } else { executor.message = "No O-RU found in the config with this ID: " + oruId; returnValue = false; } returnValue; - key: name: LinkClearedTask version: 0.0.1 value: key: name: LinkClearedTask version: 0.0.1 inputFields: entry: - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false outputFields: entry: - key: message value: key: message fieldSchemaKey: name: MessageSchema version: 0.0.1 optional: false taskParameters: entry: [] contextAlbumReference: [] taskLogic: key: TaskLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Execution: '"+executor.subject.id+"'. Input Fields: '"+executor.inFields+"'"); var oruId = executor.inFields.get("OruId"); executor.outFields.put("message", "CLEARED link failure for O-RU: " + oruId); executor.logger.info(executor.outFields); true; - key: name: LinkFailureTask version: 0.0.1 value: key: name: LinkFailureTask version: 0.0.1 inputFields: entry: - key: OduId value: key: OduId fieldSchemaKey: name: OduIdSchema version: 0.0.1 optional: false - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false outputFields: entry: - key: LinkFailureOutput value: key: LinkFailureOutput fieldSchemaKey: name: LinkFailureOutputSchema version: 0.0.1 optional: false taskParameters: entry: [] contextAlbumReference: [] taskLogic: key: TaskLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Execution: '"+executor.subject.id+"'. Input Fields: '"+executor.inFields+"'"); var linkFailureOutput = executor.subject.getOutFieldSchemaHelper("LinkFailureOutput").createNewInstance(); var oruId = executor.inFields.get("OruId"); var oduId = executor.inFields.get("OduId"); var unlockMessageArray = new java.util.ArrayList(); for (var i = 0; i < 1; i++) { unlockMessageArray.add({ "id":"rrm-pol-1", "radio_DasH_resource_DasH_management_DasH_policy_DasH_max_DasH_ratio":25, "radio_DasH_resource_DasH_management_DasH_policy_DasH_members": [ { "mobile_DasH_country_DasH_code":"310", "mobile_DasH_network_DasH_code":"150", "slice_DasH_differentiator":1, "slice_DasH_service_DasH_type":1 } ], "radio_DasH_resource_DasH_management_DasH_policy_DasH_min_DasH_ratio":15, "user_DasH_label":"rrm-pol-1", "resource_DasH_type":"prb", "radio_DasH_resource_DasH_management_DasH_policy_DasH_dedicated_DasH_ratio":20, "administrative_DasH_state":"unlocked" }); } linkFailureOutput.put("o_DasH_ran_DasH_sc_DasH_du_DasH_hello_DasH_world_ColoN_radio_DasH_resource_DasH_management_DasH_policy_DasH_ratio", unlockMessageArray); executor.outFields.put("LinkFailureOutput", linkFailureOutput.toString()); executor.getExecutionProperties().setProperty("OduId", oduId); executor.getExecutionProperties().setProperty("OruId", oruId); executor.logger.info(executor.outFields); true; - key: name: NoPolicyDefinedTask version: 0.0.1 value: key: name: NoPolicyDefinedTask version: 0.0.1 inputFields: entry: - key: LinkFailureInput value: key: LinkFailureInput fieldSchemaKey: name: LinkFailureInputSchema version: 0.0.1 optional: false outputFields: entry: - key: message value: key: message fieldSchemaKey: name: MessageSchema version: 0.0.1 optional: false taskParameters: entry: [] contextAlbumReference: [] taskLogic: key: TaskLogic logicFlavour: JAVASCRIPT logic: |- /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix 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. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ executor.logger.info("Task Execution: '"+executor.subject.id+"'. Input Fields: '"+executor.inFields+"'"); executor.outFields.put("message", "No policy defined for this event"); executor.logger.info(executor.outFields); true; events: key: name: LinkMonitorModel_Events version: 0.0.1 eventMap: entry: - key: name: ApexMessageOutputEvent version: 0.0.1 value: key: name: ApexMessageOutputEvent version: 0.0.1 nameSpace: org.onap.policy.apex.auth.clieditor source: APEX target: APEX parameter: entry: - key: message value: key: message fieldSchemaKey: name: MessageSchema version: 0.0.1 optional: false - key: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 value: key: name: CreateLinkClearedOutfieldsEvent version: 0.0.1 nameSpace: org.onap.policy.apex.auth.clieditor source: APEX target: APEX parameter: entry: - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false - key: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 value: key: name: CreateLinkFailureOutfieldsEvent version: 0.0.1 nameSpace: org.onap.policy.apex.auth.clieditor source: APEX target: APEX parameter: entry: - key: OduId value: key: OduId fieldSchemaKey: name: OduIdSchema version: 0.0.1 optional: false - key: OruId value: key: OruId fieldSchemaKey: name: OruIdSchema version: 0.0.1 optional: false - key: name: LinkFailureInputEvent version: 0.0.1 value: key: name: LinkFailureInputEvent version: 0.0.1 nameSpace: org.onap.policy.apex.auth.clieditor source: DMAAP target: APEX parameter: entry: - key: LinkFailureInput value: key: LinkFailureInput fieldSchemaKey: name: LinkFailureInputSchema version: 0.0.1 optional: false - key: name: LinkFailureOutputEvent version: 0.0.1 value: key: name: LinkFailureOutputEvent version: 0.0.1 nameSpace: org.onap.policy.apex.auth.clieditor source: APEX target: OAM parameter: entry: - key: LinkFailureOutput value: key: LinkFailureOutput fieldSchemaKey: name: LinkFailureOutputSchema version: 0.0.1 optional: false schemas: key: name: LinkMonitorModel_Schemas version: 0.0.1 schemas: entry: - key: name: LinkFailureInputSchema version: 0.0.1 value: key: name: LinkFailureInputSchema version: 0.0.1 schemaFlavour: Avro schemaDefinition: |- { "type": "record", "name": "Link_Failure_Input", "fields": [ { "name": "event", "type": { "type": "record", "name": "Event_Type", "fields": [ { "name": "commonEventHeader", "type": { "type": "record", "name": "Common_Event_Header_Type", "fields": [ { "name": "domain", "type": "string" }, { "name": "eventId", "type": "string" }, { "name": "eventName", "type": "string" }, { "name": "eventType", "type": "string" }, { "name": "sequence", "type": "int" }, { "name": "priority", "type": "string" }, { "name": "reportingEntityId", "type": "string" }, { "name": "reportingEntityName", "type": "string" }, { "name": "sourceId", "type": "string" }, { "name": "sourceName", "type": "string" }, { "name": "startEpochMicrosec", "type": "string" }, { "name": "lastEpochMicrosec", "type": "string" }, { "name": "nfNamingCode", "type": "string" }, { "name": "nfVendorName", "type": "string" }, { "name": "timeZoneOffset", "type": "string" }, { "name": "version", "type": "string" }, { "name": "vesEventListenerVersion", "type": "string" } ] } }, { "name": "faultFields", "type": { "type": "record", "name": "Fault_Fields_Type", "fields": [ { "name": "faultFieldsVersion", "type": "string" }, { "name": "alarmCondition", "type": "string" }, { "name": "alarmInterfaceA", "type": "string" }, { "name": "eventSourceType", "type": "string" }, { "name": "specificProblem", "type": "string" }, { "name": "eventSeverity", "type": "string" }, { "name": "vfStatus", "type": "string" }, { "name": "alarmAdditionalInformation", "type": { "type": "record", "name": "Alarm_Additional_Information_Type", "fields": [ { "name": "eventTime", "type": "string" }, { "name": "equipType", "type": "string" }, { "name": "vendor", "type": "string" }, { "name": "model", "type": "string" } ] } } ] } } ] } } ] } - key: name: LinkFailureOutputSchema version: 0.0.1 value: key: name: LinkFailureOutputSchema version: 0.0.1 schemaFlavour: Avro schemaDefinition: "{\n \"name\": \"Link_Failure_Output\",\n \"type\": \"record\",\n \"fields\": [\n {\n \"name\": \"o_DasH_ran_DasH_sc_DasH_du_DasH_hello_DasH_world_ColoN_radio_DasH_resource_DasH_management_DasH_policy_DasH_ratio\",\n \"type\": {\n \"type\": \"array\",\n \"items\": {\n \"name\": \"o_DasH_ran_DasH_sc_DasH_du_DasH_hello_DasH_world_ColoN_radio_DasH_resource_DasH_management_DasH_policy_DasH_ratio_record\",\n \"type\": \"record\",\n \"fields\": [\n {\n \"name\": \"id\",\n \"type\": \"string\"\n },\n {\n \"name\": \"radio_DasH_resource_DasH_management_DasH_policy_DasH_max_DasH_ratio\",\n \"type\": \"int\"\n },\n {\n \"name\": \"radio_DasH_resource_DasH_management_DasH_policy_DasH_members\",\n \"type\": {\n \"type\": \"array\",\n \"items\": {\n \"name\": \"radio_DasH_resource_DasH_management_DasH_policy_DasH_members_record\",\n \"type\": \"record\",\n \"fields\": [\n {\n \"name\": \"mobile_DasH_country_DasH_code\",\n \"type\": \"string\"\n },\n {\n \"name\": \"mobile_DasH_network_DasH_code\",\n \"type\": \"string\"\n },\n {\n \"name\": \"slice_DasH_differentiator\",\n \"type\": \"int\"\n },\n {\n \"name\": \"slice_DasH_service_DasH_type\",\n \"type\": \"int\"\n }\n ]\n }\n }\n },\n {\n \"name\": \"radio_DasH_resource_DasH_management_DasH_policy_DasH_min_DasH_ratio\",\n \"type\": \"int\"\n },\n {\n \"name\": \"user_DasH_label\",\n \"type\": \"string\"\n },\n {\n \"name\": \"resource_DasH_type\",\n \"type\": \"string\"\n },\n {\n \"name\": \"radio_DasH_resource_DasH_management_DasH_policy_DasH_dedicated_DasH_ratio\",\n \"type\": \"int\"\n },\n {\n \"name\": \"administrative_DasH_state\",\n \"type\": \"string\"\n }\n ]\n }\n }\n }\n ]\n}" - key: name: MessageSchema version: 0.0.1 value: key: name: MessageSchema version: 0.0.1 schemaFlavour: Java schemaDefinition: java.lang.String - key: name: OduIdSchema version: 0.0.1 value: key: name: OduIdSchema version: 0.0.1 schemaFlavour: Java schemaDefinition: java.lang.String - key: name: OruIdSchema version: 0.0.1 value: key: name: OruIdSchema version: 0.0.1 schemaFlavour: Java schemaDefinition: java.lang.String eventOutputParameters: RestProducer: carrierTechnologyParameters: carrierTechnology: RESTCLIENT parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters parameters: url: http://sdnr-simulator.nonrtric:9990/rests/data/network-topology:network-topology/topology=topology-netconf/node={OduId}/yang-ext:mount/o-ran-sc-du-hello-world:network-function/distributed-unit-functions={OduIdOruId}/radio-resource-management-policy-ratio=rrm-pol-1 httpMethod: PUT httpHeaders: - - Authorization - Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ== eventProtocolParameters: eventProtocol: JSON parameters: pojoField: LinkFailureOutput eventNameFilter: LinkFailureOutputEvent StdOutProducer: carrierTechnologyParameters: carrierTechnology: FILE parameters: standardIo: true eventProtocolParameters: eventProtocol: JSON parameters: pojoField: message eventNameFilter: ApexMessageOutputEvent eventInputParameters: DMaaPConsumer: carrierTechnologyParameters: carrierTechnology: RESTCLIENT parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters parameters: url: http://message-router:3904/events/unauthenticated.SEC_FAULT_OUTPUT/users/link-monitor-nonrtric?timeout=15000&limit=100 eventProtocolParameters: eventProtocol: JSON parameters: versionAlias: version pojoField: LinkFailureInput eventName: LinkFailureInputEvent |
...
- First of all, deploy the sdnr-simulator in the cluster (if not using the real SDNR in ONAP). The sdnr simulator can be found in the nonrtric/rapp/orufronthaulrecovery orufhrecovery repo of OSC.
Code Block | ||
---|---|---|
| ||
git clone "https://gerrit.o-ran-sc.org/r/nonrtric/rapp/orufhrecovery" git checkout f-release --track origin/f-release cd orucfronthaulrecovery/scriptversion/helm/sdnr-simulator/ helm package . helm install sdnr-simulator sdnr-simulator-0.1.0.tgz --set image.repository=registry.nordix.org/onap/sdnr-simulator --set image.tag=1.01.0 --set messagerouter.host="http://message-router.onap" --set messagerouter.port="3904" --namespace nonrtric --create-namespace --wait |
...
- Finally, to test that the apex policy is actually working, an example LinkFailureEvent can be sent to the DmaaP MR.
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/apexpolicyversion/LinkMonitor curl -k -X POST -H accept:application/json -H Content-Type:application/json "https://<NodeIP>:<NodePort-message-router>/events/unauthenticated.SEC_FAULT_OUTPUT/" -d @./events/LinkFailureEvent.json |
The logs of the sdnr-simulator should show that a PUT request has been successfully received.
"PUT /rests/data/network-topology:network-topology/topology=topology-netconf/node=HCL-O-DU-1123/yang-ext:mount/o-ran-sc-du-hello-world:network-function/dudistributed-tounit-ru-connectionfunctions=ERICSSON-O-RU-11225/radio-resource-management-policy-ratio=rrm-pol-1 HTTP/1.1" 200200
b) Control loop for script version
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
tosca_definitions_version: tosca_simple_yaml_1_1_03 data_types: onap.datatypes.ToscaConceptIdentifier: derived_from: tosca.datatypes.Root properties: name: type: string required: true version: type: string required: true node_types: org.onap.policy.clamp.controlloopacm.Participant: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requred: false org.onap.policy.clamp.controlloopacm.ControlLoopAutomationCompositionElement: version: 1.0.1 derived_from: tosca.nodetypes.Root properties: provider: type: string requredrequired: false elementsmetadata: typecommon: listtrue required: true description: Specifies the organization that provides the automation composition element entryparticipant_schemaid: type: onap.datatypes.ToscaConceptIdentifier org.onap.policy.clamp.controlloop.ControlLoopElement: version: 1.0.1 derived_fromrequred: tosca.nodetypes.Roottrue properties: providermetadata: type: string requredcommon: falsetrue participant_idparticipantType: type: onap.datatypes.ToscaConceptIdentifier requredrequired: true org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement: version: 1.0.1 derived_from: org.onap.policy.clamp.controlloop.ControlLoopElementmetadata: properties: chartcommon: true typedescription: string required: trueThe identity of the participant type that hosts this type of Automation Composition Element configsstartPhase: type: listinteger required: false requirementsconstraints: - typegreater_or_equal: string0 requredmetadata: false templatescommon: true typedescription: list A value indicating the start phase in which required:this false automation composition element will be entry_schema:started, the values: first start phase is type: string requred: true topology_template: node_templates:zero. Automation Composition Elements are started in their start_phase order and stopped org.onap.domain.linkmonitor.LinkMonitorControlLoopDefinition1: version: 1.2.3 type: org.onap.policy.clamp.controlloop.ControlLoop type_version: 1.0.1in reverse start phase order. Automation Composition Elements with the same start phase are started and description: Control loop for Linkstopped Monitorsimultaneously propertiesuninitializedToPassiveTimeout: providertype: Ericssoninteger elementsrequired: false - nameconstraints: org.onap.domain.linkmonitor.OruAppK8SMicroserviceControlLoopElement - versiongreater_or_equal: 1.2.30 - namedefault: org.onap.domain.linkmonitor.MessageGeneratorK8SMicroserviceControlLoopElement60 version: 1.2.3metadata: - name: org.onap.domain.linkmonitor.SdnrSimulatorK8SMicroserviceControlLoopElement common: true description: The maximum version: 1.2.3 org.onap.k8s.controlloop.K8SControlLoopParticipant: version: 2.3.4time in seconds to wait for a state chage from uninitialized to passive typepassiveToRunningTimeout: org.onap.policy.clamp.controlloop.Participant type_version: 1.0.1 integer descriptionrequired: Participantfalse for k8s propertiesconstraints: - providergreater_or_equal: ONAP0 org.onap.domain.linkmonitor.OruAppK8SMicroserviceControlLoopElement: versiondefault: 1.2.3 60 typemetadata: org.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElement type_version: 1.0.1 common: true description: Control loop element for oru-app properties: provider: ONAP description: The maximum time in seconds to wait for a state chage from passive to running participant_idrunningToPassiveTimeout: nametype: K8sParticipant0integer versionrequired: 1.0.0false participantTypeconstraints: - namegreater_or_equal: org.onap.k8s.controlloop.K8SControlLoopParticipant0 versiondefault: 2.3.460 chartmetadata: chartIdcommon: true description: The maximum time name: oru-app version: 0.1.0in seconds to wait for a state chage from running to passive releaseName: oru-app repositorypassiveToUninitializedTimeout: repoNametype: chartmuseuminteger namespacerequired: nonrtricfalse overrideParamsconstraints: image.repository: nexus3.o-ran-sc.org:10002/o-ran-sc/nonrtric-o-ru-closed-loop-recovery- greater_or_equal: 0 image.tagdefault: 1.0.160 messagerouter.host: http://message-router.onapmetadata: messagerouter.portcommon: 3904true description: The maximum time sdnr.host: http://sdnr-simulator sdnr.port: 9990 in seconds to wait for a state chage from passive to uninitialized org.onap.policy.domainclamp.linkmonitoracm.MessageGeneratorK8SMicroserviceControlLoopElementAutomationComposition: version: 1.20.31 typederived_from: orgtosca.onap.policy.clamp.controlloop.K8SMicroserviceControlLoopElementnodetypes.Root type_version: 1.0.1properties: description: Control loop element for message-generator provider: propertiestype: string providerrequired: ONAPfalse participant_idmetadata: namecommon: K8sParticipant0true description: Specifies the organization that provides version: 1.0.0 the automation composition element participantTypeelements: nametype: org.onap.k8s.controlloop.K8SControlLoopParticipantlist versionrequired: 2.3.4true chartmetadata: chartIdcommon: true name: message-generatorentry_schema: versiontype: 0onap.1datatypes.0ToscaConceptIdentifier description: Specifies releaseName: message-generator repository: a list of automation composition element definitions that make up this automation composition definition org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement: version: 1.0.1 repoNamederived_from: chartmuseumorg.onap.policy.clamp.acm.AutomationCompositionElement properties: namespacechart: nonrtric type: overrideParams:string required: true image.repository: registry.nordix.org/onap/message-generator configs: type: list image.tag: 1.0.0 required: false messagerouter.host: http://message-router.onap requirements: type: string messagerouter.portrequred: 3904false org.onap.domain.linkmonitor.SdnrSimulatorK8SMicroserviceControlLoopElementtemplates: versiontype: 1.2.3 list type: orgrequired: false entry_schema: values: type: string requred: true topology_template: node_templates: org.onap.policy.clamp.acm.KubernetesParticipant: version: 2.3.4 type: org.onap.policy.clamp.controlloopacm.K8SMicroserviceControlLoopElementParticipant type_version: 1.0.1 description: Participant for K8S properties: provider: Ericsson org.onap.domain.linkmonitor.OruAppK8SMicroserviceAutomationCompositionElement: # Chart from new repository version: 1.2.3 type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement type_version: 1.0.0 description: ControlAutomation loopcomposition element for the K8S microservice for sdnr-simulatorPMSH properties: provider: ONAP participant_id: name: K8sParticipant0 version: 1.0.0 participantType: name: org.onap.policy.k8sclamp.controlloopacm.K8SControlLoopParticipantKubernetesParticipant version: 2.3.4 chart: chartId: name: sdnroru-simulatorapp version: 0.1.0 releaseName: sdnroru-simulatorapp repository: repoName: nginx-proxy repoName: chartmuseumaddress: https://nginx-proxy:443 namespace: nonrtric overrideParams: image.repository: registry.nordixnexus3.o-ran-sc.org/onap/sdnr-simulator:10004/o-ran-sc/nonrtric-rapp-orufhrecovery image.tag: 1.01.0 messagerouter.host: http://message-router.onap messagerouter.port: 3904 |
This control loop will bring up three micro-services in the nonrtric namespace: oru-app (running the actual logic of the usecase), message-generator (sending the LinkFailure messages at random intervals), and sdnr-simulator (for receiving the REST calls made by oru-app). Make sure that the sdnr-simulator is not already running in the nonrtric namespace, otherwise the control loop instantiation might fail.
NOTE: The default hostname/port for sdnr and message-router are specified in overrideParams of the above file. They should be replaced with actual values if using different hostname/port.f
Before commissioning this tosca template, some preparations need to be done in the kubernetes-participant component of the clamp.
- First step is to copy the kube config file of the cluster inside the kubernetes-participant. Find the pod-name of this component using:
Code Block | ||
---|---|---|
| ||
kubectl -n onap get pod | grep k8s-ppnt |
Copy the config file using this command:
Code Block | ||
---|---|---|
| ||
kubectl cp ~/.kube/config onap/<POD-NAME-k8s-ppnt>:/home/policy/.kube/config |
In order to make sure that the kubernetes-participant is properly configured, get into the pod using "kubectl -n onap exec -it <POD-NAME-k8s-ppnt> sh" and run the following command:
Code Block | ||
---|---|---|
| ||
kubectl get ns |
This should show all the namespaces in the cluster where ONAP is deployed.
- Next step is to copy the helm charts of all three components into the kubernetes-participant. The helm charts are located in the nonrtric repo of OSC.
sdnr.host: http://sdnr-simulator
sdnr.port: 9990
org.onap.domain.linkmonitor.MessageGeneratorK8SMicroserviceAutomationCompositionElement:
# Chart from new repository
version: 1.2.3
type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement
type_version: 1.0.0
description: Automation composition element for the K8S microservice for PMSH
properties:
provider: ONAP
participant_id:
name: K8sParticipant0
version: 1.0.0
participantType:
name: org.onap.policy.clamp.acm.KubernetesParticipant
version: 2.3.4
chart:
chartId:
name: message-generator
version: 0.1.0
releaseName: message-generator
repository:
repoName: nginx-proxy
address: https://nginx-proxy:443
namespace: nonrtric
overrideParams:
image.repository: registry.nordix.org/onap/message-generator
image.tag: 1.0.0
messagerouter.host: http://message-router.onap
messagerouter.port: 3904
org.onap.domain.linkmonitor.SdnrSimulatorK8SK8SMicroserviceAutomationCompositionElement:
# Chart from new repository
version: 1.2.3
type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement
type_version: 1.0.0
description: Automation composition element for the K8S microservice for PMSH
properties:
provider: ONAP
participant_id:
name: K8sParticipant0
version: 1.0.0
participantType:
name: org.onap.policy.clamp.acm.KubernetesParticipant
version: 2.3.4
chart:
chartId:
name: sdnr-simulator
version: 0.1.0
releaseName: sdnr-simulator
repository:
repoName: nginx-proxy
address: https://nginx-proxy:443
namespace: nonrtric
overrideParams:
image.repository: registry.nordix.org/onap/sdnr-simulator
image.tag: 1.1.0
messagerouter.host: http://message-router.onap
messagerouter.port: 3904
org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition:
version: 1.2.3
type: org.onap.policy.clamp.acm.AutomationComposition
type_version: 1.0.1
description: Automation composition for Hello World
properties:
provider: ONAP
elements:
- name: org.onap.domain.linkmonitor.OruAppK8SMicroserviceAutomationCompositionElement
version: 1.2.3
- name: org.onap.domain.linkmonitor.MessageGeneratorK8SMicroserviceAutomationCompositionElement
version: 1.2.3
- name: org.onap.domain.linkmonitor.SdnrSimulatorK8SK8SMicroserviceAutomationCompositionElement
version: 1.2.3
|
This control loop will bring up three micro-services in the nonrtric namespace: oru-app (running the actual logic of the usecase), message-generator (sending the LinkFailure messages at random intervals), and sdnr-simulator (for receiving the REST calls made by oru-app). Make sure that the sdnr-simulator is not already running in the nonrtric namespace, otherwise the control loop instantiation might fail.
NOTE: The default hostname/port for sdnr and message-router are specified in overrideParams of the above file. They should be replaced with actual values if using different hostname/port.f
Before commissioning this tosca template, some preparations need to be done in the kubernetes-participant component of the clamp.
- First step is to copy the kube config file of the cluster inside the kubernetes-participant. Find the pod-name of this component using:
Code Block | ||
---|---|---|
| ||
kubectl -n onap get pod | grep k8s-ppnt |
Log into the k8s-ppnt pod and create the following directories
Code Block | ||
---|---|---|
| ||
mkdir -p ~/.kube
mkdir ~/ssl |
Copy the config file using this command:
Code Block | ||
---|---|---|
| ||
kubectl cp ~/.kube/config | ||
Code Block | ||
| ||
cd orufronthaulrecovery/scriptversion/helm/sdnr-simulator/ helm package . kubectl cp ./sdnr-simulator-0.1.0.tgz onap/<POD-NAME-k8s-ppnt>:/home/policy/local-charts/sdnr-simulator-0.1.0.tgz cd orufronthaulrecovery/scriptversion/helm/message-generator/ helm package . kubectl cp ./message-generator-0.1.0.tgz onap/<POD-NAME-k8s-ppnt>:/home/policy/local-charts/message-generator-0.1.0.tgz cd orufronthaulrecovery/scriptversion/helm/oru-app/ helm package . kubectl cp ./oru-app-0.1.0.tgz onap/<POD-NAME-k8s-ppnt>:/home/policy/local-charts/oru-app-0.1.0.tgz |
...
.kube/config |
In order to make sure that the kubernetes-participant is properly configured, get into the pod using "kubectl -n onap exec -it <POD-NAME-k8s-ppnt> sh" and run the following
...
command:
Code Block | ||
---|---|---|
| ||
mkdirkubectl get ns |
This should show all the namespaces in the cluster where ONAP is deployed.
Next step is setup a https proxy from chartmuseum and push the charts
- Create tls certs using onap cet manager kubectl apply -f certificate.yaml (Replace NodeIP with your control plane IP)
- Install the nginx proxy to run in front of ONAP chartmuseum: kubectl apply -f nginx.yaml
- Retrieve chartmuseum username and password using kubectl get secret onap-chartmuseum-registrycred -o=go-template='{{$login := .data.login| base64decode}}{{$pw := .data.password| base64decode}}{{printf "%s:%s" $login $pw }}'
Create the helm charts for all 3 components and push them to chartmuseum
Code Block | ||||
---|---|---|---|---|
| ||||
cd orufhrecovery/scriptversion/helm/sdnr-simulator/ helm package . curl -u <username>:<password>-p ~/helm3-storage curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum chmod +x ./chartmuseum ./chartmuseum --storage local --storage-local-rootdir /home/policy/helm3-storage -port 8080 & curl --data-binary "@local-charts/sdnr@sdnr-simulator-0.1.0.tgz" http://localhost<NodeIP>:808030088/api/charts cd orufhrecovery/scriptversion/helm/message-generator/ helm package . curl -u <username>:<password> --data-binary "@local-charts/message@message-generator-0.1.0.tgz" http://localhost<NodeIP>:808030088/api/charts cd orufhrecovery/scriptversion/helm/oru-app/ helm package . curl -u <username>:<password> --data-binary "@local-charts/oru@oru-app-0.1.0.tgz" http://localhost<NodeIP>:808030088/api/charts |
Retrieve the ca.crt from the secret and copy it to the k8s-ppnt pod :
Code Block | ||
---|---|---|
| ||
kubectl get secret nginx-tls -o jsonpath="{.data.ca\.crt}" | base64 -d > ca.crt cp ~/certs/ca.crt onap/<POD-NAME-k8s-ppnt>:/home/policy/ssl |
Log into the k8s-ppnt pod using "kubectl -n onap exec -it <POD-NAME-k8s-ppnt> sh" and run the following commands:
Code Block | ||
---|---|---|
| ||
helm repo add chartmuseumnginx-proxy httphttps://localhost:8080nginx-proxy:443 --ca-file /home/policy/ssl/ca.crt helm repo update |
Once the kubernetes-participant is set up, the tosca template can be commissioned. After that, the control loop can be instantiated using the steps described in the sub-section Commission/Instantiate control loop via GUI. Once the control loop is in RUNNING PASSIVE state, check that all three micro-services have been created in the nonrtric namespace.
...
- The next step is to start the controlloop-runtime and policy-participant components of the clamp.
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/apexpolicyversion/LinkMonitor/docker-compose-controlloop docker-compose up -d |
...
- Once all the components get up and running, the control loop can be commissioned and instantiated. This can be done by making a REST call to the controlloop-runtime component of the clamp. The tosca template for commissioning and the instantiation payload are provided in this directory of the nonrtric repo:
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/apexpolicyversion/LinkMonitor/controlloop-rest-payloads |
...
- Send the example link failure event.
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/apexpolicyversion/LinkMonitor curl -X POST -H accept:application/json -H Content-Type:application/json "http://localhost:3904/events/unauthenticated.SEC_FAULT_OUTPUT/" -d @./events/LinkFailureEvent.json |
...
Code Block | ||
---|---|---|
| ||
eval $(minikube docker-env) cd orufronthaulrecoveryorufhrecovery/scriptversion/app docker build -t oru-app . cd orufronthaulrecoveryorufhrecovery/scriptversion/simulators docker build -f Dockerfile-sdnr-sim -t sdnr-simulator . docker build -f Dockerfile-message-generator -t message-generator:v2 . cd nonrtric/test/mrstub/ docker build -t mrstub . |
...
- Next step is to prepare the kube config file of minikube for mounting it inside the k8s-participant component of policy/clamp. First of all, copy the kube config file inside the config directory used by docker-compose file that runs k8s-participant.
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/scriptversion/docker-compose-controlloop cp ~/.kube/config ./config/kube-config |
...
- Once all the components get up and running, the control loop can be commissioned and instantiated. This can be done by making a REST call to the controlloop-runtime component of the clamp. The tosca template for commissioning and the instantiation payload are provided in this directory of the nonrtric repo:
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/scriptversion/controlloop-rest-payloads |
...
- In order to stop the docker containers and free up resources on the host machine, use the following commands:
Code Block | ||
---|---|---|
| ||
cd orufronthaulrecoveryorufhrecovery/scriptversion/docker-compose-controlloop docker-compose down docker volume rm docker-compose-controlloop_db-vol |
...