"""
Variables file for tcpmd5user suite.
Expected JSON templates are fairly long,
therefore there are moved out of testcase file.
Also, it is needed to generate base64 encoded tunnel name
from Mininet IP (which is not known beforehand),
so it is easier to employ Python here,
than do manipulation in Robot file.
"""
# Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v1.0 which accompanies this distribution,
# and is available at http://www.eclipse.org/legal/epl-v10.html
__author__ = "Vratko Polak"
__copyright__ = "Copyright(c) 2015, Cisco Systems, Inc."
__license__ = "Eclipse Public License v1.0"
__email__ = "vrpolak@cisco.com"
import binascii
from string import Template
# FIXME: Migrate values shared by other suites to separate Python module.
def get_variables(mininet_ip):
"""Return dict of variables for the given IPv4 address of Mininet VM."""
# TODO: Document in 'V' fashion, as in pcepuser/variables.py using more systematic local variable names.
# Dict of variables to return, starts empty and grows as function proceeds.
variables = {}
# Given mininet_ip, this will be the sympolic name uf tunnel under test.
tunnelname = 'pcc_' + mininet_ip + '_tunnel_1'
# Base64 code for the symbolic name, as that is present in datastore.
pathcode = binascii.b2a_base64(tunnelname)[:-1] # remove endline
# JSON response when pcep-topology is ready but no PCC is connected.
variables['offjson'] = '''{
"topology": [
{
"topology-id": "pcep-topology",
"topology-types": {
"network-topology-pcep:topology-pcep": {}
}
}
]
}'''
# Template of JSON response with pcep-topology seeing 1 PCC 1 LSP.
onjsontempl = Template('''{
"topology": [
{
"node": [
{
"network-topology-pcep:path-computation-client": {
"ip-address": "$IP",
"reported-lsp": [
{
"name": "$NAME",
"path": [
{
"ero": {
"ignore": false,
"processing-rule": false,
"subobject": [
{
"ip-prefix": {
"ip-prefix": "1.1.1.1/32"
},
"loose": false
}
]
},
"lsp-id": 1,
"odl-pcep-ietf-stateful07:lsp": {
"administrative": true,
"delegate": true,
"ignore": false,
"odl-pcep-ietf-initiated00:create": false,
"operational": "up",
"plsp-id": 1,
"processing-rule": false,
"remove": false,
"sync": true,
"tlvs": {
"lsp-identifiers": {
"ipv4": {
"ipv4-extended-tunnel-id": "$IP",
"ipv4-tunnel-endpoint-address": "1.1.1.1",
"ipv4-tunnel-sender-address": "$IP"
},
"lsp-id": 1,
"tunnel-id": 1
},
"symbolic-path-name": {
"path-name": "$CODE"
}
}
}
}
]
}
],
"state-sync": "synchronized",
"stateful-tlv": {
"odl-pcep-ietf-stateful07:stateful": {
"lsp-update-capability": true,
"odl-pcep-ietf-initiated00:initiation": true
}
}
},
"node-id": "pcc://$IP"
}
],
"topology-id": "pcep-topology",
"topology-types": {
"network-topology-pcep:topology-pcep": {}
}
}
]
}''')
# Dictionly which tells values for placeholders.
repl_dict = {'IP': mininet_ip, 'NAME': tunnelname, 'CODE': pathcode}
# The finalized JSON.
variables['onjson'] = onjsontempl.substitute(repl_dict)
# The following strings are XML data.
# See https://wiki.opendaylight.org/view/BGP_LS_PCEP:TCP_MD5_Guide#RESTCONF_Configuration
# For curl, string is suitable to became -d argument only after
# replacing ' -> '"'"' and enclosing in single quotes.
variables['key_access_module'] = '''
x:native-key-access-factory
global-key-access-factory
'''
variables['key_access_service'] = '''
x:key-access-factory
global-key-access-factory
/modules/module[type='native-key-access-factory'][name='global-key-access-factory']
'''
variables['client_channel_module'] = '''
x:md5-client-channel-factory
md5-client-channel-factory
x:key-access-factory
global-key-access-factory
'''
variables['client_channel_service'] = '''
x:md5-channel-factory
md5-client-channel-factory
/modules/module[type='md5-client-channel-factory'][name='md5-client-channel-factory']
'''
variables['server_channel_module'] = '''
'''
# What is your favourite way to concatenate strings without resembling tuple?
variables['server_channel_module'] += '''prefix:md5-server-channel-factory-impl
md5-server-channel-factory
x:key-access-factory
global-key-access-factory
'''
variables['server_channel_service'] = '''
'''
variables['server_channel_service'] += '''prefix:md5-server-channel-factory
md5-server-channel-factory
/modules/module[type='md5-server-channel-factory-impl'][name='md5-server-channel-factory']
'''
variables['pcep_dispatcher_module'] = '''
x:pcep-dispatcher-impl
global-pcep-dispatcher
x:md5-channel-factory
md5-client-channel-factory
x:md5-server-channel-factory
md5-server-channel-factory
'''
# Template to set password.
passwd_templ = Template('''
x:pcep-topology-provider
pcep-topology
$IP
$PASSWD
''')
# We use three template instantiations. No password:
repl_dict = {'IP': mininet_ip, 'PASSWD': ''}
variables['no_passwd_module'] = passwd_templ.substitute(repl_dict)
changeme = ''' changeme
'''
# wrong password
repl_dict = {'IP': mininet_ip, 'PASSWD': changeme}
variables['passwd_changeme_module'] = passwd_templ.substitute(repl_dict)
# and correct password.
topsecret = ''' topsecret
'''
repl_dict = {'IP': mininet_ip, 'PASSWD': topsecret}
variables['passwd_topsecret_module'] = passwd_templ.substitute(repl_dict)
# All variables set, return dict to Robot.
return variables