aboutsummaryrefslogtreecommitdiffstats
path: root/vnfs/TestVNF/netconfserver/src/main/java/com/ericsson/testvnf/server/helper/ActionHelper.java
blob: d9714ff734502e987dd9c93878443e27bb27ee6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
 * ================================================================================
 * 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=========================================================
 */

package com.ericsson.testvnf.server.helper;

import java.io.OutputStream;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ericsson.testvnf.server.Server;
import com.ericsson.testvnf.server.models.NetconfMessage;
import com.ericsson.testvnf.server.models.RpcData;

/*
 * The helper class which performs actions based on netconf requests
 */
public class ActionHelper {
	
	private static final Log log = LogFactory.getLog(ActionHelper.class);
	private OutputStream					out;
	private Thread groovyCallerThread;
	
	public ActionHelper(OutputStream out){
		this.out = out;
	}
	
	public boolean doActionForRPCRequest(NetconfMessage netconfMessage, Map<String, Boolean> connectionResetMap, boolean sessionClosedStatus){
		// if the client is sending an rpc request for any protocol operation
		RpcData rpcData = (RpcData) netconfMessage;
		if (null != rpcData.getTargetName()) {
			// the connectionResetMap is a shared between multiple client connections coming in for a single netconf server instance
			// true value for a target indicates that sending events to that target needs to be stopped
			// edit-config operation with a target determines the termination of sending events to that target.
			if (rpcData.getOperation().equals("edit-config")) {
				connectionResetMap.put(rpcData.getTargetName(), true);
			} else {
				connectionResetMap.put(rpcData.getTargetName(), false);
			}
		}
		if (rpcData.getOperation().equals("\"close-session\"")) {
			sessionClosedStatus = true;
		}
		String operation = rpcData.getOperation();
		log.info("Received query");

		// on getting a get-schema request from client, the server sends back the yang
		// model of the particular functionality/capability asked for.
		if (operation.equals("get-schema")) {
			doActionForGetSchemaOperation(rpcData);
		} else {
			doActionForOperations(rpcData, operation, connectionResetMap);
		}
		return sessionClosedStatus;
	}
	
	public void doActionForOperations(RpcData rpcData, String operation, Map<String, Boolean> connectionResetMap) {
		groovyCallerThread = new Thread("Groovy caller") {
			@Override
			public void run() {
				rpcData.setTimeDelayForSendingEvents(Server.getTimeDelayForSendingEvents());
				String result ="";
				// pick up and execute the correct groovy file based on the operation and configuration datastore identified from the rpc request
				result = HelperUtils.executeGroovy(Server.getNetconfTemplatesDirectory()
						+ "/netconftemplates/"+operation+"/"+rpcData.getConfigurationDatastore()+"/response.groovy", rpcData, connectionResetMap);
				if (!result.equals("ignore")) {
					result = result.replaceAll("<MID>", rpcData.getMessageId());
					HelperUtils.sendAsBytesToOutput(result.getBytes(), out);
					log.info("Finished writing " + result);
				}
			}
		};
		groovyCallerThread.start();
		log.info("groovyCallerThread started");
	}
	
	public void doActionForGetSchemaOperation(RpcData rpcData){
		log.info("get-schema received.");
		if (null != rpcData.getSchemaDetails()
				&& null != rpcData.getSchemaDetails().getIdentifier()) {
			log.info("Sending schema for capability...");
			String schemaString = HelperUtils.readFile(Server.getNetconfTemplatesDirectory()
					+ "/netconftemplates/"+rpcData.getSchemaDetails().getIdentifier()+"-schema.yang"); // the yang model has to be in the netconftemplates directory with the proper naming format : '<operation>-schema.yang'
			String schemaStringValue = schemaString.replaceAll("<MID>", rpcData.getMessageId()); // Put the correct message id in the response as it is in the request.
			HelperUtils.sendAsBytesToOutput(schemaStringValue.getBytes(), out);
			log.info("Finished writing the schema information");
		}
	}
	
	// the method sends a hello message to the client, hello.xml in the netconftemplates directory is used to send the hello message
	public void sendHelloMessage(){
		log.info("Send hello message.");
		String helloMessage = HelperUtils.readFile(Server.getNetconfTemplatesDirectory()+"/netconftemplates/hello.xml");
    	HelperUtils.sendAsBytesToOutput(helloMessage.getBytes(), out);
    	log.info("Hello message sent.");
	}

	public void interruptGroovyCallerThread() {
		// kill thread if it don't finish naturally
		if (groovyCallerThread!=null && groovyCallerThread.isAlive()) {
			log.info("Killing groovy caller thread");
			groovyCallerThread.interrupt();
		}
		
	}
}