blob: b8e70542eb8b9fb1fdd47dfdffb3211b10992981 [file] [log] [blame]
Jeremyfc567ca2016-02-16 15:08:25 -08001"""
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -07002Copyright 2016 Open Networking Foundation ( ONF )
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07003
4Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070011 ( at your option ) any later version.
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -070012
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20
21
Jeremyfc567ca2016-02-16 15:08:25 -080022 Wrapper functions for FUNCnetconf
23 This functions include Onosclidriver and Mininetclidriver driver functions
24 Author: Jeremy Songster, jeremy@onlab.us
25"""
26import time
27import json
Jon Hall53c5e662016-04-13 16:06:56 -070028import os
Jeremyfc567ca2016-02-16 15:08:25 -080029
Jon Hall0c3f46f2017-05-24 16:34:46 -070030
Jeremyfc567ca2016-02-16 15:08:25 -080031def __init__( self ):
32 self.default = ''
33
Jon Hall0c3f46f2017-05-24 16:34:46 -070034
Jeremyfc567ca2016-02-16 15:08:25 -080035def startApp( main ):
36 """
37 This function starts the netconf app in all onos nodes and ensures that
38 the OF-Config server is running on the node to be configured
39 """
Jeremyfc567ca2016-02-16 15:08:25 -080040 startResult = main.FALSE
Devin Lim142b5342017-07-20 15:22:39 -070041 startResult = main.Cluster.active( 0 ).REST.activateApp( appName="org.onosproject.netconf" )
Jeremyfc567ca2016-02-16 15:08:25 -080042 return startResult
43
Jon Hall0c3f46f2017-05-24 16:34:46 -070044
Jeremyfc567ca2016-02-16 15:08:25 -080045def startOFC( main ):
46 """
47 This function uses pexpect pxssh class to activate the ofc-server daemon on OC2
48 """
Jeremyfc567ca2016-02-16 15:08:25 -080049 startResult = main.FALSE
50 try:
51 main.ONOSbench.handle.sendline( "" )
52 main.ONOSbench.handle.expect( "\$" )
53 main.ONOSbench.handle.sendline( "ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1 }'" )
54 main.ONOSbench.handle.expect( "\$1 }'" )
55 main.ONOSbench.handle.expect( "\$" )
56 main.configDeviceIp = main.ONOSbench.handle.before
57 main.configDeviceIp = main.configDeviceIp.split()
58 main.configDeviceIp = main.configDeviceIp[ 0 ]
59 main.log.info( "Device to be configured: " + str( main.configDeviceIp ) )
60 main.ONOSbench.handle.sendline( "sudo ofc-server" )
61 main.ONOSbench.handle.expect( "\$" )
62 startResult = main.TRUE
63 return startResult
64 except pexpect.ExceptionPexpect as e:
65 main.log.exception( self.name + ": Pexpect exception found: " )
66 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -070067 main.cleanAndExit()
Jon Hall0c3f46f2017-05-24 16:34:46 -070068
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070069
Jeremyfc567ca2016-02-16 15:08:25 -080070def createConfig( main ):
71 """
72 This function writes a configuration file that can later be sent to the
73 REST API to configure a device.
74 The controller device is assumed to be OC1
75 The device to be configured is assumed to be OC2
76 """
77 createCfgResult = main.FALSE
78 # TODO, add ability to set Manufacturer, Hardware and Software versions
Jon Hall0c3f46f2017-05-24 16:34:46 -070079 main.cfgJson = '{ "devices":{ "netconf:' + main.configDeviceIp + ":" +\
80 main.configDevicePort + '":' + '{ "basic":{ "driver":"' +\
Jeremyfc567ca2016-02-16 15:08:25 -080081 main.configDriver + '" } } }, "apps": { "' +\
Devin Limc87f1892017-06-19 16:52:57 -070082 main.configApps + '":{ "netconf_devices":[ { "username":' +\
Jeremyfc567ca2016-02-16 15:08:25 -080083 main.configName + ', "password":' + main.configPass +\
84 ', "ip":"' + main.configDeviceIp + '", "port":' +\
85 main.configPort + '} ] } } }'
86 try:
Jon Hall53c5e662016-04-13 16:06:56 -070087 file = open( os.path.dirname( main.testFile ) + "/dependencies/netconfConfig.json", 'w' )
Jeremye7580f32016-04-11 12:41:21 -070088 # These lines can cause errors during the configuration process because
89 # they cause the json string to turn into an unordered dictionary before
90 # sorting it alphabetically which can cause the driver type to not be
91 # configured.
92 # main.cfgJson = json.loads( main.cfgJson )
93 # main.cfgJson = json.dumps( main.cfgJson, sort_keys=True,
Jon Hall0c3f46f2017-05-24 16:34:46 -070094 # indent=4, separators=( ',', ': ' ) )
Jeremyfc567ca2016-02-16 15:08:25 -080095 print main.cfgJson
96 file.write( main.cfgJson )
97 if file:
98 createCfgResult = main.TRUE
99 file.close()
100 return createCfgResult
101 else:
Jon Hall0c3f46f2017-05-24 16:34:46 -0700102 main.log.error( "There was an error opening the file" )
Jeremyfc567ca2016-02-16 15:08:25 -0800103 return createCfgResult
104 except:
Jon Hall0c3f46f2017-05-24 16:34:46 -0700105 main.log.exception( "There was an error opening the file" )
Jeremyfc567ca2016-02-16 15:08:25 -0800106 return createCfgResult
107
Jon Hall0c3f46f2017-05-24 16:34:46 -0700108
Jeremyfc567ca2016-02-16 15:08:25 -0800109def sendConfig( main ):
110 """
111 This function prepares the command needed to upload the configuration
112 file to the REST API
113 """
Jeremyfc567ca2016-02-16 15:08:25 -0800114 url = "/network/configuration"
115 method = "POST"
116 data = main.cfgJson
117 configResult = main.FALSE
Devin Lim142b5342017-07-20 15:22:39 -0700118 sendResult = main.Cluster.active( 0 ).REST.send( url=url, method=method, data=data )
Jeremyfc567ca2016-02-16 15:08:25 -0800119 main.log.info( "Device configuration request response code: " + str( sendResult[ 0 ] ) )
Jon Hall0c3f46f2017-05-24 16:34:46 -0700120 if ( 200 <= sendResult[ 0 ] <= 299 ):
Jeremyfc567ca2016-02-16 15:08:25 -0800121 configResult = main.TRUE
122 else:
123 configResult = main.FALSE
124
125 return configResult
126
Jon Hall0c3f46f2017-05-24 16:34:46 -0700127
Jeremyfc567ca2016-02-16 15:08:25 -0800128def devices( main ):
129 """
130 This function get the list of devices from the REST API, the ONOS CLI, and
131 the device-controllers command and check to see that each recognizes the
132 device is configured according to the configuration uploaded above.
133 """
134 availResult = main.FALSE
135 typeResult = main.FALSE
136 addressResult = main.FALSE
137 driverResult = main.FALSE
138 try:
Devin Lim142b5342017-07-20 15:22:39 -0700139 apiResult = main.Cluster.active( 0 ).REST.devices()
140 cliResult = main.Cluster.active( 0 ).CLI.devices()
Jeremyfc567ca2016-02-16 15:08:25 -0800141
142 apiDict = json.loads( apiResult )
143 cliDict = json.loads( cliResult )
144 apiAnnotations = apiDict[ 0 ].get( "annotations" )
145 cliAnnotations = cliDict[ 0 ].get( "annotations" )
146
147 main.log.info( "API device availability result: " + str( apiDict[ 0 ].get( "available" ) ) )
148 main.log.info( "CLI device availability result: " + str( cliDict[ 0 ].get( "available" ) ) )
Jon Hall0c3f46f2017-05-24 16:34:46 -0700149 if apiDict[ 0 ].get( "available" ) and cliDict[ 0 ].get( "available" ):
Jeremyfc567ca2016-02-16 15:08:25 -0800150 availResult = main.TRUE
151 main.log.info( "API device type result: " + apiDict[ 0 ].get( "type" ) )
152 main.log.info( "CLI device type result: " + cliDict[ 0 ].get( "type" ) )
153 if apiDict[ 0 ].get( "type" ) == "SWITCH" and cliDict[ 0 ].get( "type" ) == "SWITCH":
154 typeResult = main.TRUE
155 main.log.info( "API device ipaddress: " + apiAnnotations.get( "ipaddress" ) )
156 main.log.info( "CLI device ipaddress: " + apiAnnotations.get( "ipaddress" ) )
157 if str( apiAnnotations.get( "ipaddress" ) ) == main.configDeviceIp and str( cliAnnotations.get( "ipaddress" ) ) == main.configDeviceIp:
158 addressResult = main.TRUE
159 main.log.info( "API device driver: " + apiAnnotations.get( "driver" ) )
160 main.log.info( "CLI device driver: " + cliAnnotations.get( "driver" ) )
161 if apiAnnotations.get( "driver" ) == main.configDriver and cliAnnotations.get( "driver" ) == main.configDriver:
162 driverResult = main.TRUE
163
164 return availResult and typeResult and addressResult and driverResult
165 except TypeError:
166 main.log.error( "Device was not configured correctly" )
Jon Hall53c5e662016-04-13 16:06:56 -0700167 return main.FALSE