input CLI's validated

This commit is contained in:
nishmita
2016-05-11 15:34:48 +05:30
parent 6e98e2ed8c
commit 052f75fa09
4 changed files with 139 additions and 39 deletions

View File

@@ -28,22 +28,7 @@ class CiscoType:
def get_attributes(self):
return self.types
'''
def set_ciscoType(self, str):
self.ciscoType = str
def get_ciscoType(self):
return self.ciscoType
def set_value(self, str):
self.value = str
def get_value(self):
return self.value
def set_puppetHeader(self, str):
self.puppetHeader = str
def get_puppetHeader(self):
return self.puppetHeader
'''
class Attribute:
def __init__(self):

View File

@@ -73,7 +73,6 @@ def get_valid_values(s, values):
match1 = re.search (r'range ([0-9]+)..([0-9]+)', s)
match2 = re.search (r'between ([0-9]+) and ([0-9]+)', s)
match3 = re.search (r'from ([0-9]+)..([0-9]+)', s)
#match4 = re.search(r'range of ([0-9]+) to ([0-9]+)', s)
if match:
first = match.group(1)
last = match.group(2)
@@ -94,7 +93,7 @@ def get_valid_values(s, values):
match_values(match3, values)
else:
values.append('<integer>')
values.append(type(0)) #integer
if 'Speed' in s:
s = s.split(".")[1]
@@ -107,16 +106,16 @@ def get_valid_values(s, values):
values.append(match2.group(1))
if 'number' in s or 'Number' in s:
values.append('<integer>')
values.append(type(0)) #integer
if ' port' in s or ' Port' in s:
values.append('<integer>')
values.append(type(0)) #integer
if 'string' in s or 'String' in s:
values.append('<string>')
values.append(type('')) #string
if 'interface' in s or 'Interface' in s and 'Speed' not in s:
values.append('<string>')
values.append(type('')) #string
if 'array' in s or 'Array' in s:
values.append('<string>')
values.append(type('')) #string
if 'true' in s or 'True' in s:
values.append('true')
@@ -145,14 +144,14 @@ def get_valid_values(s, values):
for item in brackets:
val = (''.join(c for c in item if c not in string.punctuation))
if val.isdigit():
values.append('<integer>')
values.append(type(0)) #integer
else:
values.append(val)
values = list(set(values))
return values
def parse_types():
def Parse_types():
url = urllib2.urlopen('https://github.com/cisco/cisco-network-puppet-module')
html_doc = url.read()
@@ -187,25 +186,12 @@ def parse_types():
if "Valid" in valid_values:
valid_values = "Valid" + valid_values.split("Valid")[1]
valid_values_list = get_valid_values(valid_values, valid_list)
attr.add_attributes(param, valid_values_list)
attr.add_attributes(get_name(param), valid_values_list)
feature.add_attribute(type[6:], attr)
#print "@@@@@@@@@@", param, valid_values_list
j += 1
if j >= len(tags):
break
tag = str(tags[j])
#feature_list.append(feature.typeName.replace('_',' '))
#print feature.typeName, feature.attributes
#print "\n"
return feature
cmd_types = parse_types()
print "List of Types: \n", cmd_types.types.keys()
print "Complete data structure including Types, attributes & its valid value list:\n", cmd_types.types

34
backend/types.txt Normal file
View File

@@ -0,0 +1,34 @@
aaa authentication login;cisco_aaa_authentication_login;$ciscopuppet::aaa_authentication_login_data::aaa_authentication_login_instances.each |$aaa_authentication_login, $value| {;$aaa_authentication_login_instances = {
aaa authorization login cfg svc;cisco_aaa_authorization_login_cfg_svc;add description;$cisco_aaa_authorization_login_cfg_svc_instances = {
aaa authorization login exec svc;cisco_aaa_authorization_login_exec_svc;add description;$cisco_aaa_authorization_login_exec_svc_instances = {
aaa group tacacs;cisco_aaa_group_tacacs;add description;$cisco_aaa_group_tacacs_instances = {
acl;cisco_acl;add description;$cisco_acl_instances = {
bgp;cisco_bgp;$ciscopuppet::bgp_cfg_data::bgp_instances.each |$bgp, $value| {;$cisco_bgp_instances = {
bgp address-family;cisco_bgp_af;add description;$cisco_bgp_af_instances = {
bgp neighbor;cisco_bgp_neighbor;add description;$cisco_bgp_neighbor_instances = {
bgp neighbor address-family;cisco_bgp_neighbor_af;add description;$cisco_bgp_neighbor_af_instances = {
command config;cisco_command_config;$ciscopuppet::command_config_data::command_config_instances.each |$command, $value| {;$cisco_command_config_instances = {
interface;cisco_interface;$ciscopuppet::l3_interface_cfg_data::l3_interface_instances.each |$interface, $value| {;$l3_interface_instances = {
interface ospf;cisco_interface_ospf;add description;$cisco_interface_ospf_instances = {
interface portchannel;cisco_interface_portchannel;add description;$cisco_interface_portchannel_instances = {
interface service vni;cisco_interface_service_vni;add description;$cisco_interface_service_vni_instances = {
ospf;cisco_ospf;add description;$cisco_ospf_instances = {
ospf vrf;cisco_ospf_vrf;add description;$cisco_ospf_vrf_instances = {
portchannel global;cisco_portchannel_global;add description;$cisco_portchannel_global_instances = {
snmp community;cisco_snmp_community;add description;$cisco_snmp_community_instances = {
snmp group;cisco_snmp_group;add description;$cisco_snmp_group_instances = {
snmp server;cisco_snmp_server;add description;$cisco_snmp_server_instances = {
snmp user;cisco_snmp_user;add description;$cisco_snmp_user_instances = {
tacacs server;cisco_tacacs_server;add description;$cisco_tacacs_server_instances = {
tacacs server host;cisco_tacacs_server_host;add description;$cisco_tacacs_server_host_instances = {
vdc;cisco_vdc;add description;$cisco_vdc_instances = {
vlan;cisco_vlan;add description;$cisco_vlan_instances = {
vni;cisco_vni;add description;$cisco_vni_instances = {
vrf;cisco_vrf;add description;$cisco_vrf_instances = {
vrf address-family;cisco_vrf_af;add description;$cisco_vrf_af_instances = {
vtp;cisco_vtp;add description;$cisco_vtp_instances = {
vxlan global;cisco_vxlan_global;add description;$cisco_vxlan_global_instances = {
vxlan vtep;cisco_vxlan_vtep;add description;$cisco_vxlan_vtep_instances = {
interface nve;cisco_vxlan_vtep;add description;$cisco_vxlan_vtep_instances = {
router bgp;cisco_bgp;$ciscopuppet::bgp_cfg_data::bgp_instances.each |$bgp, $value| {;$cisco_bgp_instances = {

95
backend/validation.py Normal file
View File

@@ -0,0 +1,95 @@
import re
import parse_types as parse
def get_all_types():
type_dict = {}
with open('types.txt') as f:
lines = f.readlines()
for line in lines:
type_list = line.split(';')
type_dict[type_list[0]] = type_list
return type_dict
def validate_attr_value(ds_types, search_type, attr, value):
attr= parse.get_name(attr)
find_int =re.search(r'(^-?[0-9]+$)',value)
if find_int:
value = int(value)
print ds_types[search_type][attr]
if value in ds_types[search_type][attr] or type(value) in ds_types[search_type][attr]:
print "Provided value of the attribute is validated now, need to prepare manifest"
def type_check(type_dict, ds_types, index, cmd_list, search_type, value):
while (search_type):
if search_type in type_dict.keys():
print "Type:", search_type, "Value:", value
type_name = type_dict[search_type][1]
print ds_types[type_name][search_type]
if value in ds_types[type_name][search_type] or type(value) in ds_types[type_name][search_type]:
print "Provided value is validated now, need to prepare manifest"
break
else:
value = search_type.rsplit(' ', 1)[1]
search_type = search_type.rsplit(' ', 1)[0]
def attr_check(type_dict, ds_types, index, cmd_list, search_type, value):
while(search_type):
if search_type in type_dict.keys():
break
else:
search_type = search_type.rsplit(' ', 1)[0]
search_type = type_dict[search_type][1] #Get the type
cmd_list[index] = cmd_list[index].lstrip()
tmp_cmd_list = cmd_list[index].split(' ')
if tmp_cmd_list[0] == 'no':
value = 'false'
attr = cmd_list[index].split(' ', 1)[1]
if attr in ds_types[search_type].keys():
print "Attribute: ", attr, "Value: ", value
validate_attr_value(ds_types, search_type, attr, value)
else:
while (cmd_list[index]):
if cmd_list[index] in ds_types[search_type].keys():
if not value:
value = 'true'
print "Attribute: ", cmd_list[index], "value: ", value
validate_attr_value(ds_types, search_type, cmd_list[index], value)
break
else:
value = cmd_list[index].rsplit(' ', 1)[1]
cmd_list[index] = cmd_list[index].rsplit(' ', 1)[0]
def parse_data(data):
cmd_list = data.split('\n')
l_cmd_list = len(cmd_list)
for index in range(l_cmd_list):
type_dict = get_all_types()
ds_types = parse.Parse_types().types
value = ''
if not cmd_list[index]:
continue
if cmd_list[index][0] != ' ':
search_type = cmd_list[index]
print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", index, cmd_list[index]
type_check(type_dict, ds_types, index, cmd_list, search_type, value)
else:
print "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n", index, cmd_list[index]
attr_check(type_dict, ds_types, index, cmd_list, search_type, value)
def Convert(input_data):
parse_data(input_data)
return True
input_data = input_string = 'interface vlan14\n mtu 9100\n ip address 124.14.1.1/24\ninterface eth1/1\n shutdown\n no ip redirects'
Convert(input_data)