From 04b52e3d980846288da476e40ef1cae26ae2d1f0 Mon Sep 17 00:00:00 2001 From: Stuart Mackie Date: Thu, 21 Jan 2016 12:36:48 -0500 Subject: Add python helper scripts Change-Id: I83b378941082d8f9aeae88f6cf9e586d8eb7458d Signed-off-by: Stuart Mackie --- Testcases/RunTests.sh | 31 + Testcases/config_obj.py | 1737 ++++++++++++++++++++++++++++++++++++++++++++ Testcases/config_shell.py | 379 ++++++++++ Testcases/configuration.md | 666 +++++++++++++++++ 4 files changed, 2813 insertions(+) create mode 100644 Testcases/config_obj.py create mode 100644 Testcases/config_shell.py create mode 100644 Testcases/configuration.md diff --git a/Testcases/RunTests.sh b/Testcases/RunTests.sh index 7a916c7..8a915b9 100755 --- a/Testcases/RunTests.sh +++ b/Testcases/RunTests.sh @@ -1,6 +1,37 @@ #!/bin/bash PATH=${OVNO_COMMIT}/Testcases:$PATH +cd ${OVNO_COMMIT}/Testcases + +# Create the config wrapper +OCL_IP=`echo $OS_AUTH_URL | cut -d "/" -f3 | cut -d ":" -f1` + +cat <config +#!/usr/bin/python + +import sys +import os +from config_shell import * +default_client_args = [ + ('--username', 'admin'), + ('--password', os.environ["OS_PASSWORD"]), + ('--region', 'RegionOne'), + ('--tenant', 'admin'), + ('--api-server', os.environ["OCL_IP"])] + + +if __name__ == '__main__': + for arg in default_client_args: + if not arg[0] in sys.argv: + sys.argv.insert(1, arg[0]) + sys.argv.insert(2, arg[1]) + ConfigShell().main() +EOF + +chmod 777 config + + + echo "Starting OpenContrail test suite" # Tests go here diff --git a/Testcases/config_obj.py b/Testcases/config_obj.py new file mode 100644 index 0000000..9470588 --- /dev/null +++ b/Testcases/config_obj.py @@ -0,0 +1,1737 @@ + +import os +import sys +import time +import uuid +from vnc_api import vnc_api +try: + import novaclient.v1_1.client + config_nova = True +except: + config_nova = False + + +class ConfigVirtualDns(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.virtual_DNSs_list()['virtual-DNSs'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == name): + return self.vnc.virtual_DNS_read(id = item['uuid']) + + def obj_show(self, obj): + print 'Virtual DNS' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + dns = obj.get_virtual_DNS_data() + print 'Domain name: %s' %(dns.domain_name) + print 'Record order: %s' %(dns.record_order) + print 'Default TTL: %s seconds' %(dns.default_ttl_seconds) + print 'Next DNS: %s' %(dns.next_virtual_DNS) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + print ' %s' %(item['fq_name'][1]) + + def add(self, name, domain_name, record_order, next_dns): + data = vnc_api.VirtualDnsType(domain_name = domain_name, + dynamic_records_from_client = True, + record_order = record_order, + default_ttl_seconds = 86400, + next_virtual_DNS = 'default-domain:' + next_dns) + obj = vnc_api.VirtualDns(name = name, virtual_DNS_data = data) + try: + self.vnc.virtual_DNS_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def delete(self, name): + try: + self.vnc.virtual_DNS_delete( + fq_name = ['default-domain', name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigIpam(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.network_ipams_list()['network-ipams'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.network_ipam_read(id = item['uuid']) + + def dns_show(self, mgmt): + print ' DNS Type: %s' %(mgmt.ipam_dns_method) + if (mgmt.ipam_dns_method == 'virtual-dns-server'): + print ' Virtual DNS Server: %s' %( + mgmt.get_ipam_dns_server().virtual_dns_server_name) + elif (mgmt.ipam_dns_method == 'tenant-dns-server'): + list = mgmt.get_ipam_dns_server().get_tenant_dns_server_address().get_ip_address() + print ' Tenant DNS Server:' + for item in list: + print ' %s' %(item) + + def dhcp_show(self, mgmt): + dhcp_opt = {'4':'NTP Server', '15':'Domain Name'} + print ' DHCP Options:' + dhcp = mgmt.get_dhcp_option_list() + if not dhcp: + return + for item in dhcp.get_dhcp_option(): + print ' %s: %s' %(dhcp_opt[item.dhcp_option_name], + item.dhcp_option_value) + + def obj_show(self, obj): + print 'IPAM' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + print 'Management:' + mgmt = obj.get_network_ipam_mgmt() + if not mgmt: + return + self.dns_show(mgmt) + self.dhcp_show(mgmt) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def dns_add(self, mgmt, dns_type, virtual_dns = None, tenant_dns = None): + type = {'none':'none', + 'default':'default-dns-server', + 'virtual':'virtual-dns-server', + 'tenant':'tenant-dns-server'} + if not dns_type: + return + mgmt.set_ipam_dns_method(type[dns_type]) + if virtual_dns: + mgmt.set_ipam_dns_server(vnc_api.IpamDnsAddressType( + virtual_dns_server_name = virtual_dns)) + if tenant_dns: + mgmt.set_ipam_dns_server(vnc_api.IpamDnsAddressType( + tenant_dns_server_address = vnc_api.IpAddressesType( + ip_address = tenant_dns))) + + def dhcp_add(self, mgmt, domain_name = None, ntp_server = None): + if domain_name: + list = mgmt.get_dhcp_option_list() + if not list: + list = vnc_api.DhcpOptionsListType() + mgmt.set_dhcp_option_list(list) + list.add_dhcp_option(vnc_api.DhcpOptionType( + dhcp_option_name = '15', + dhcp_option_value = domain_name)) + if ntp_server: + list = mgmt.get_dhcp_option_list() + if not list: + list = vnc_api.DhcpOptionsListType() + mgmt.set_dhcp_option_list() + list.add_dhcp_option(vnc_api.DhcpOptionType( + dhcp_option_name = '4', + dhcp_option_value = ntp_server)) + + def add(self, name, dns_type, virtual_dns = None, tenant_dns = None, + domain_name = None, ntp_server = None): + create = False + obj = self.obj_get(name) + if not obj: + obj = vnc_api.NetworkIpam(name = name, + parent_obj = self.tenant) + create = True + mgmt = obj.get_network_ipam_mgmt() + if not mgmt: + mgmt = vnc_api.IpamType() + obj.set_network_ipam_mgmt(mgmt) + self.dns_add(mgmt, dns_type, virtual_dns, tenant_dns) + self.dhcp_add(mgmt, domain_name, ntp_server) + if create: + try: + self.vnc.network_ipam_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + self.vnc.network_ipam_update(obj) + + def delete(self, name, domain_name = None): + update = False + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + if domain_name: + mgmt = obj.get_network_ipam_mgmt() + list = mgmt.get_dhcp_option_list() + for item in list.get_dhcp_option(): + if (item.dhcp_option_name == '15') and \ + (item.dhcp_option_value == domain_name): + list.delete_dhcp_option(item) + break + update = True + if update: + self.vnc.network_ipam_update(obj) + else: + try: + self.vnc.network_ipam_delete( + fq_name = ['default-domain', self.tenant.name, + name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigPolicy(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.network_policys_list()['network-policys'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.network_policy_read(id = item['uuid']) + + def addr_show(self, addr_list): + for item in addr_list: + print ' Virtual Network: %s' %(item.get_virtual_network()) + + def port_show(self, port_list): + for item in port_list: + print ' %d:%d' %(item.get_start_port(), item.get_end_port()) + + def action_show(self, rule): + list = rule.get_action_list() + if not list: + return + action = list.get_simple_action() + if action: + print ' %s' %(action) + else: + for item in rule.get_action_list().get_apply_service(): + print ' %s' %(item) + + def rule_show(self, obj): + rules_obj = obj.get_network_policy_entries() + if (rules_obj == None): + return + list = rules_obj.get_policy_rule() + count = 1 + for rule in list: + print 'Rule #%d' %(count) + print ' Direction: %s' %(rule.get_direction()) + print ' Protocol: %s' %(rule.get_protocol()) + print ' Source Addresses:' + self.addr_show(rule.get_src_addresses()) + print ' Source Ports:' + self.port_show(rule.get_src_ports()) + print ' Destination Addresses:' + self.addr_show(rule.get_dst_addresses()) + print ' Destination Ports:' + self.port_show(rule.get_dst_ports()) + print ' Action:' + self.action_show(rule) + count += 1 + + def obj_show(self, obj): + print 'Policy' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + self.rule_show(obj) + list = obj.get_virtual_network_back_refs() + if (list != None): + print '[BR] network:' + for item in list: + print ' %s' %(item['to'][2]) + + def show(self, name): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def rule_add(self, arg_list): + direction = None + protocol = None + src_net_list = [] + dst_net_list = [] + src_port_list = [] + dst_port_list = [] + action = None + service_list = [] + for arg in arg_list: + arg_name = arg.split('=')[0] + arg_val = arg.split('=')[1] + if (arg_name == 'direction'): + direction = arg_val + elif (arg_name == 'protocol'): + protocol = arg_val + elif (arg_name == 'src-net'): + net = 'default-domain:%s:%s' %(self.tenant.name, arg_val) + src_net_list.append(vnc_api.AddressType(virtual_network = net)) + elif (arg_name == 'dst-net'): + net = 'default-domain:%s:%s' %(self.tenant.name, arg_val) + dst_net_list.append(vnc_api.AddressType(virtual_network = net)) + elif (arg_name == 'src-port'): + if (arg_val == 'any'): + src_port_list.append(vnc_api.PortType( + start_port = -1, end_port = -1)) + else: + s_e = arg_val.split(':') + src_port_list.append(vnc_api.PortType( + start_port = int(s_e[0]), end_port = int(s_e[1]))) + elif (arg_name == 'dst-port'): + if (arg_val == 'any'): + src_port_list.append(vnc_api.PortType( + start_port = -1, end_port = -1)) + else: + s_e = arg_val.split(':') + src_port_list.append(vnc_api.PortType( + start_port = int(s_e[0]), end_port = int(s_e[1]))) + elif (arg_name == 'action'): + action = arg_val + elif (arg_name == 'service'): + service_list.append('default-domain:%s:%s' \ + %(self.tenant.name, arg_val)) + + rule = vnc_api.PolicyRuleType() + if not direction: + direction = '<>' + rule.set_direction(direction) + if not protocol: + protocol = 'any' + rule.set_protocol(protocol) + if not src_net_list: + src_net_list.append(vnc_api.AddressType(virtual_network = 'any')) + rule.set_src_addresses(src_net_list) + if not dst_net_list: + dst_net_list.append(vnc_api.AddressType(virtual_network = 'any')) + rule.set_dst_addresses(dst_net_list) + if not src_port_list: + src_port_list.append(vnc_api.PortType( + start_port = -1, end_port = -1)) + rule.set_src_ports(src_port_list) + if not dst_port_list: + dst_port_list.append(vnc_api.PortType( + start_port = -1, end_port = -1)) + rule.set_dst_ports(dst_port_list) + if not action: + action_list = vnc_api.ActionListType(simple_action = 'pass') + elif (action == 'service'): + action_list = vnc_api.ActionListType(apply_service = service_list) + else: + action_list = vnc_api.ActionListType(simple_action = action) + rule.set_action_list(action_list) + return rule + + def add(self, name, rule_arg_list): + rule_list = [] + if not rule_arg_list: + rule = self.rule_add([]) + rule_list.append(rule) + else: + for rule_arg in rule_arg_list: + rule = self.rule_add(rule_arg.split(',')) + rule_list.append(rule) + + obj = self.obj_get(name = name) + if obj: + rules = obj.get_network_policy_entries() + if not rules: + rules = vnc_api.PolicyEntriesType(policy_rule = rule_list) + else: + for item in rule_list: + rules.add_policy_rule(item) + obj.set_network_policy_entries(rules) + try: + self.vnc.network_policy_update(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + rules = vnc_api.PolicyEntriesType(policy_rule = rule_list) + obj = vnc_api.NetworkPolicy(name = name, + parent_obj = self.tenant, + network_policy_entries = rules) + try: + self.vnc.network_policy_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def delete(self, name, rule_arg_list): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + if rule_arg_list: + rules = obj.get_network_policy_entries() + if not rules: + return + for rule_arg in rule_arg_list: + for arg in rule_arg.split(','): + arg_name = arg.split('=')[0] + arg_val = arg.split('=')[1] + if (arg_name == 'index'): + rule = rules.get_policy_rule()[int(arg_val) - 1] + rules.delete_policy_rule(rule) + obj.set_network_policy_entries(rules) + self.vnc.network_policy_update(obj) + else: + try: + self.vnc.network_policy_delete(fq_name = ['default-domain', + self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigSecurityGroup(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.security_groups_list()['security-groups'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.security_group_read(id = item['uuid']) + + def addr_show(self, addr_list): + for item in addr_list: + print ' Security Group: %s' %(item.get_security_group()) + subnet = item.get_subnet() + if subnet: + print ' Subnet: %s/%d' %(subnet.get_ip_prefix(), \ + subnet.get_ip_prefix_len()) + else: + print ' Subnet: None' + + def port_show(self, port_list): + for item in port_list: + print ' %d:%d' %(item.get_start_port(), item.get_end_port()) + + def rule_show(self, obj): + rules_obj = obj.get_security_group_entries() + if (rules_obj == None): + return + list = rules_obj.get_policy_rule() + count = 1 + for rule in list: + print 'Rule #%d' %(count) + print ' Direction: %s' %(rule.get_direction()) + print ' Protocol: %s' %(rule.get_protocol()) + print ' Source Addresses:' + self.addr_show(rule.get_src_addresses()) + print ' Source Ports:' + self.port_show(rule.get_src_ports()) + print ' Destination Addresses:' + self.addr_show(rule.get_dst_addresses()) + print ' Destination Ports:' + self.port_show(rule.get_dst_ports()) + count += 1 + + def obj_show(self, obj): + print 'Security Group' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + self.rule_show(obj) + + def show(self, name): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def add(self, name, protocol = None, address = None, port = None, + direction = None): + rule = vnc_api.PolicyRuleType() + rule.set_direction('>') + if protocol: + rule.set_protocol(protocol) + else: + rule.set_protocol('any') + + addr_list = [] + if address: + for item in address: + prefix = item.split('/')[0] + len = item.split('/')[1] + addr_list.append(vnc_api.AddressType( + subnet = vnc_api.SubnetType( + ip_prefix = prefix, ip_prefix_len = int(len)))) + else: + addr_list.append(vnc_api.AddressType( + subnet = vnc_api.SubnetType( + ip_prefix = '0.0.0.0', ip_prefix_len = 0))) + + local_addr_list = [vnc_api.AddressType(security_group = 'local')] + + port_list = [] + if port: + for item in port: + if (item == 'any'): + port_list.append(vnc_api.PortType( + start_port = -1, end_port = -1)) + else: + s_e = item.split(':') + port_list.append(vnc_api.PortType( + start_port = int(s_e[0]), end_port = int(s_e[1]))) + else: + port_list.append(vnc_api.PortType(start_port = -1, end_port = -1)) + + local_port_list = [vnc_api.PortType(start_port = -1, end_port = -1)] + + if (direction == 'ingress'): + rule.set_src_addresses(addr_list) + rule.set_src_ports(port_list) + rule.set_dst_addresses(local_addr_list) + rule.set_dst_ports(local_port_list) + else: + rule.set_src_addresses(local_addr_list) + rule.set_src_ports(local_port_list) + rule.set_dst_addresses(addr_list) + rule.set_dst_ports(port_list) + + obj = self.obj_get(name = name) + if obj: + rules = obj.get_security_group_entries() + if not rules: + rules = vnc_api.PolicyEntriesType(policy_rule = [rule]) + else: + rules.add_policy_rule(rule) + try: + self.vnc.security_group_update(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + rules = vnc_api.PolicyEntriesType(policy_rule = [rule]) + obj = vnc_api.SecurityGroup(name = name, + parent_obj = self.tenant, + security_group_entries = rules) + try: + self.vnc.security_group_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def rule_del(self, obj, index): + rules = obj.get_security_group_entries() + if not rules: + return + rule = rules.get_policy_rule()[index - 1] + rules.delete_policy_rule(rule) + self.vnc.security_group_update(obj) + + def delete(self, name, rule = None): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + if rule: + self.rule_del(obj, int(rule)) + else: + try: + self.vnc.security_group_delete(fq_name = ['default-domain', + self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigNetwork(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.virtual_networks_list()['virtual-networks'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.virtual_network_read(id = item['uuid']) + + def prop_route_target_show(self, obj): + print '[P] Route targets:' + rt_list = obj.get_route_target_list() + if not rt_list: + return + for rt in rt_list.get_route_target(): + print ' %s' %(rt) + + def child_floating_ip_pool_show(self, obj): + print '[C] Floating IP pools:' + pool_list = obj.get_floating_ip_pools() + if not pool_list: + return + for pool in pool_list: + print ' %s' %(pool['to'][3]) + pool_obj = self.vnc.floating_ip_pool_read(id = pool['uuid']) + ip_list = pool_obj.get_floating_ips() + if (ip_list != None): + for ip in ip_list: + ip_obj = self.vnc.floating_ip_read(id = ip['uuid']) + print ' %s' %(ip_obj.get_floating_ip_address()) + + def ref_ipam_show(self, obj): + print '[R] IPAMs:' + ipam_list = obj.get_network_ipam_refs() + if not ipam_list: + return + for item in ipam_list: + print ' %s' %(item['to'][2]) + subnet_list = item['attr'].get_ipam_subnets() + for subnet in subnet_list: + print ' subnet: %s/%d, gateway: %s' %( + subnet.get_subnet().get_ip_prefix(), + subnet.get_subnet().get_ip_prefix_len(), + subnet.get_default_gateway()) + + def ref_policy_show(self, obj): + print '[R] Policies:' + policy_list = obj.get_network_policy_refs() + if not policy_list: + return + for item in policy_list: + print ' %s (%d.%d)' %(item['to'][2], + item['attr'].get_sequence().get_major(), + item['attr'].get_sequence().get_minor()) + + def ref_route_table_show(self, obj): + print '[R] Route Tables:' + rt_list = obj.get_route_table_refs() + if not rt_list: + return + for item in rt_list: + print ' %s' %(item['to'][2]) + + def obj_show(self, obj): + print 'Virtual Network' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + self.prop_route_target_show(obj) + self.child_floating_ip_pool_show(obj) + self.ref_ipam_show(obj) + self.ref_policy_show(obj) + self.ref_route_table_show(obj) + + def show(self, name): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def ipam_add(self, obj, name, subnet, gateway = None): + try: + ipam_obj = self.vnc.network_ipam_read(fq_name = ['default-domain', + self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + cidr = subnet.split('/') + subnet = vnc_api.SubnetType(ip_prefix = cidr[0], + ip_prefix_len = int(cidr[1])) + ipam_subnet = vnc_api.IpamSubnetType(subnet = subnet, + default_gateway = gateway) + obj.add_network_ipam(ref_obj = ipam_obj, + ref_data = vnc_api.VnSubnetsType([ipam_subnet])) + + def ipam_del(self, obj, name): + try: + ipam_obj = self.vnc.network_ipam_read(fq_name = ['default-domain', + self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.del_network_ipam(ref_obj = ipam_obj) + + def policy_add(self, obj, name): + try: + policy_obj = self.vnc.network_policy_read( + fq_name = ['default-domain', self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + seq = vnc_api.SequenceType(major = 0, minor = 0) + obj.add_network_policy(ref_obj = policy_obj, + ref_data = vnc_api.VirtualNetworkPolicyType(sequence = seq)) + + def policy_del(self, obj, name): + try: + policy_obj = self.vnc.network_policy_read( + fq_name = ['default-domain', self.tenant.name, name]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.del_network_policy(ref_obj = policy_obj) + + def route_target_add(self, obj, rt): + rt_list = obj.get_route_target_list() + if not rt_list: + rt_list = vnc_api.RouteTargetList() + obj.set_route_target_list(rt_list) + rt_list.add_route_target('target:%s' %(rt)) + + def route_target_del(self, obj, rt): + rt_list = obj.get_route_target_list() + if not rt_list: + return + rt_list.delete_route_target('target:%s' %(rt)) + + def route_table_add(self, obj, rt): + try: + rt_obj = self.vnc.route_table_read(fq_name = ['default-domain', + self.tenant.name, rt]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.add_route_table(ref_obj = rt_obj) + + def route_table_del(self, obj, rt): + try: + rt_obj = self.vnc.route_table_read(fq_name = ['default-domain', + self.tenant.name, rt]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.del_route_table(ref_obj = rt_obj) + + def add(self, name, ipam = None, subnet = None, policy = None, + route_target = None, route_table = None, shared = None, + external = None, l2 = None): + create = False + obj = self.obj_get(name) + if not obj: + obj = vnc_api.VirtualNetwork(name = name, + parent_obj = self.tenant) + if l2: + prop = vnc_api.VirtualNetworkType(forwarding_mode = 'l2') + obj.set_virtual_network_properties(prop) + if shared: + obj.set_is_shared(shared) + if external: + obj.set_router_external(external) + create = True + if ipam and subnet: + self.ipam_add(obj, ipam, subnet) + if policy: + self.policy_add(obj, policy) + if route_target: + self.route_target_add(obj, route_target) + if route_table: + self.route_table_add(obj, route_table) + if create: + try: + self.vnc.virtual_network_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + self.vnc.virtual_network_update(obj) + + def delete(self, name, ipam = None, policy = None, route_target = None, + route_table = None): + update = False + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + if ipam: + self.ipam_del(obj, ipam) + update = True + if policy: + self.policy_del(obj, policy) + update = True + if route_target: + self.route_target_del(obj, route_target) + update = True + if route_table: + self.route_table_del(obj, route_table) + update = True + if update: + self.vnc.virtual_network_update(obj) + else: + try: + self.vnc.virtual_network_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigFloatingIpPool(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.floating_ip_pools_list()['floating-ip-pools'] + return list + + def obj_get(self, name, network = None): + for item in self.obj_list(): + if network: + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == network) and \ + (item['fq_name'][3] == name): + return self.vnc.floating_ip_pool_read(id = item['uuid']) + else: + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][3] == name): + return self.vnc.floating_ip_pool_read(id = item['uuid']) + + def prop_subnet_show(self, obj): + print '[P] Subnet:' + prefixes = obj.get_floating_ip_pool_prefixes() + if not prefixes: + return + for item in prefixes.get_subnet(): + print ' %s/%s' %(item.get_ip_prefix(), item.get_ip_prefix_len()) + + def child_ip_show(self, obj): + print '[C] Floating IPs:' + list = obj.get_floating_ips() + if not list: + return + for ip in list: + ip_obj = self.vnc.floating_ip_read(id = ip['uuid']) + print ' %s' %(ip_obj.get_floating_ip_address()) + + def back_ref_tenant_show(self, obj): + print '[BR] Tenants:' + list = obj.get_project_back_refs() + if not list: + return + for item in list: + print ' %s' %(item['to'][1]) + + def obj_show(self, obj): + print 'Floating IP Pool' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + self.prop_subnet_show(obj) + self.child_ip_show(obj) + self.back_ref_tenant_show(obj) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s in network %s' \ + %(item['fq_name'][2], item['fq_name'][3]) + + def add(self, name, network): + if not name: + print 'ERROR: The name of floating IP pool is not specified!' + return + if not network: + print 'ERROR: Network is not specified!' + return + try: + net_obj = self.vnc.virtual_network_read( + fq_name = ['default-domain', self.tenant.name, network]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj = vnc_api.FloatingIpPool(name = name, parent_obj = net_obj) + try: + self.vnc.floating_ip_pool_create(obj) + self.tenant.add_floating_ip_pool(obj) + self.vnc.project_update(self.tenant) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def fip_delete(self, pool_obj): + pass + + def delete(self, name, network): + if not name: + print 'ERROR: The name of floating IP pool is not specified!' + return + obj = self.obj_get(name, network) + if not obj: + print 'ERROR: Floating IP pool %s in network %s is not found!' \ + %(name, network) + return + if obj.get_floating_ips(): + print 'ERROR: There are allocated floating IPs!' + return + for tenant_ref in obj.get_project_back_refs(): + tenant = self.vnc.project_read(fq_name = tenant_ref['to']) + tenant.del_floating_ip_pool(obj) + self.vnc.project_update(tenant) + try: + self.vnc.floating_ip_pool_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigServiceTemplate(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.service_templates_list()['service-templates'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == name): + return self.vnc.service_template_read(id = item['uuid']) + + def obj_show(self, obj): + print 'Service Template' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + properties = obj.get_service_template_properties() + print 'Service Mode: %s' %(properties.get_service_mode()) + print 'Service Type: %s' %(properties.get_service_type()) + print 'Service Image: %s' %(properties.get_image_name()) + print 'Service Flavor: %s' %(properties.get_flavor()) + print 'Service Interfaces:' + for item in properties.get_interface_type(): + print ' %s' %(item.get_service_interface_type()) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + print ' %s' %(item['fq_name'][1]) + + def add(self, name, mode, type, image, flavor, interface_type, + scale = None): + obj = vnc_api.ServiceTemplate(name = name) + properties = vnc_api.ServiceTemplateType(service_mode = mode, + service_type = type, image_name = image, flavor = flavor, + ordered_interfaces = True, availability_zone_enable = True) + if scale: + properties.set_service_scaling(scale) + for item in interface_type: + if (mode == 'transparent') and \ + ((item == 'left') or (item == 'right')): + shared_ip = True + elif (mode == 'in-network') and (item == 'left'): + shared_ip = True + else: + shared_ip = False + type = vnc_api.ServiceTemplateInterfaceType( + service_interface_type = item, + shared_ip = shared_ip, + static_route_enable = True) + properties.add_interface_type(type) + else: + for item in interface_type: + type = vnc_api.ServiceTemplateInterfaceType( + service_interface_type = item, + static_route_enable = True) + properties.add_interface_type(type) + obj.set_service_template_properties(properties) + try: + self.vnc.service_template_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def delete(self, name): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + try: + self.vnc.service_template_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigServiceInstance(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.service_instances_list()['service-instances'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.service_instance_read(id = item['uuid']) + + def obj_show(self, obj): + print 'Service Instance' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + + def show(self, name): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def add(self, name, template, network_list, + auto_policy = None, scale_max = None): + obj = vnc_api.ServiceInstance(name = name, parent_obj = self.tenant) + properties = vnc_api.ServiceInstanceType(auto_policy = auto_policy) + for net in network_list: + net_name = None + net_route = None + net_auto = False + tenant_name = self.tenant.name + for arg in net.split(','): + arg_name = arg.split('=')[0] + arg_val = arg.split('=')[1] + if (arg_name == 'tenant'): + tenant_name = arg_val + elif (arg_name == 'network'): + if (arg_val == 'auto'): + net_auto = True + else: + net_name = arg_val + elif (arg_name == 'route'): + net_route = arg_val + if net_auto: + net_fq_name = None + else: + net_fq_name = 'default-domain:%s:%s' %(tenant_name, net_name) + interface = vnc_api.ServiceInstanceInterfaceType( + virtual_network = net_fq_name) + if net_route: + route = vnc_api.RouteType(prefix = net_route) + route_table = vnc_api.RouteTableType() + route_table.add_route(route) + interface.set_static_routes(route_table) + properties.add_interface_list(interface) + + if scale_max: + scale = vnc_api.ServiceScaleOutType( + max_instances = int(scale_max), + auto_scale = True) + else: + scale = vnc_api.ServiceScaleOutType() + properties.set_scale_out(scale) + + obj.set_service_instance_properties(properties) + try: + template = self.vnc.service_template_read( + fq_name = ['default-domain', template]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + obj.set_service_template(template) + try: + self.vnc.service_instance_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + def delete(self, name): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + try: + self.vnc.service_instance_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigImage(): + def __init__(self, client): + self.nova = client.nova + + def obj_list(self): + list = self.nova.images.list() + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item.name == name): + return item + + def obj_show(self, obj): + print 'Image' + print 'Name: %s' %(obj.name) + print 'UUID: %s' %(obj.id) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + print ' %s' %(item.name) + + def add(self, name): + pass + def delete(self, name): + pass + + +class ConfigFlavor(): + def __init__(self, client): + self.nova = client.nova + + def obj_list(self): + list = self.nova.flavors.list() + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item.name == name): + return item + + def obj_show(self, obj): + print 'Flavor' + print 'Name: %s' %(obj.name) + print 'UUID: %s' %(obj.id) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + print ' %s' %(item.name) + + def add(self, name): + pass + def delete(self, name): + pass + + +class ConfigVirtualMachine(): + def __init__(self, client): + self.vnc = client.vnc + self.nova = client.nova + self.tenant = client.tenant + + def obj_list(self): + list = self.nova.servers.list() + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item.name == name): + return item + + def obj_show(self, obj): + print 'Virtual Machine' + print 'Name: %s' %(obj.name) + print 'UUID: %s' %(obj.id) + print 'Status: %s' %(obj.status) + print 'Addresses:' + for item in obj.addresses.keys(): + print ' %s %s' %(obj.addresses[item][0]['addr'], item) + + def show(self, name): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + print ' %s' %(item.name) + + def add(self, name, image, flavor, network, node = None, user_data = None, + wait = None): + try: + image_obj = self.nova.images.find(name = image) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + try: + flavor_obj = self.nova.flavors.find(name = flavor) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + + networks = [] + net_list = self.vnc.virtual_networks_list()['virtual-networks'] + for item in network: + for vn in net_list: + if (vn['fq_name'][1] == self.tenant.name) and \ + (vn['fq_name'][2] == item): + networks.append({'net-id': vn['uuid']}) + break + else: + print 'ERROR: Network %s is not found!' %(item) + return + + #if node: + # zone = self.nova.availability_zones.list()[1] + # for item in zone.hosts.keys(): + # if (item == node): + # break + # else: + # print 'ERROR: Node %s is not found!' %(name) + # return + + try: + vm = self.nova.servers.create(name = name, image = image_obj, + flavor = flavor_obj, availability_zone = node, + nics = networks, userdata = user_data) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + + if wait: + timeout = 12 + while timeout: + time.sleep(3) + vm = self.nova.servers.get(vm.id) + if vm.status != 'BUILD': + print 'VM %s is %s' %(vm.name, vm.status) + break + timeout -= 1 + + def delete(self, name): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + self.nova.servers.delete(obj.id) + + +class ConfigRouteTable(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.route_tables_list()['route-tables'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.route_table_read(id = item['uuid']) + + def obj_show(self, obj): + print 'Route Table' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + routes = obj.get_routes() + if not routes: + return + for item in routes.get_route(): + print ' %s next-hop %s' %(item.get_prefix(), item.get_next_hop()) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def route_add(self, obj, route): + routes = obj.get_routes() + if not routes: + routes = vnc_api.RouteTableType() + obj.set_routes(routes) + prefix = route.split(':')[0] + nh = 'default-domain:%s:%s' %(self.tenant.name, route.split(':')[1]) + routes.add_route(vnc_api.RouteType(prefix = prefix, next_hop = nh)) + + def route_del(self, obj, prefix): + routes = obj.get_routes() + if not routes: + return + for item in routes.get_route(): + if (item.get_prefix() == prefix): + routes.delete_route(item) + + def add(self, name, route = None): + create = False + obj = self.obj_get(name) + if not obj: + obj = vnc_api.RouteTable(name = name, parent_obj = self.tenant) + create = True + if route: + for item in route: + self.route_add(obj, item) + if create: + try: + self.vnc.route_table_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + self.vnc.route_table_update(obj) + + def delete(self, name, route = None): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + if route: + for item in route: + self.route_del(obj, item) + self.vnc.route_table_update(obj) + else: + try: + self.vnc.route_table_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigInterfaceRouteTable(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.interface_route_tables_list()['interface-route-tables'] + return list + + def obj_get(self, name): + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name) and \ + (item['fq_name'][2] == name): + return self.vnc.interface_route_table_read(id = item['uuid']) + + def obj_show(self, obj): + print 'Interface Route Table' + print 'Name: %s' %(obj.get_fq_name()) + print 'UUID: %s' %(obj.uuid) + routes = obj.get_interface_route_table_routes() + if not routes: + return + for item in routes.get_route(): + print ' %s' %(item.get_prefix()) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj) + else: + for item in self.obj_list(): + if (item['fq_name'][1] == self.tenant.name): + print ' %s' %(item['fq_name'][2]) + + def route_add(self, obj, prefix): + routes = obj.get_interface_route_table_routes() + if not routes: + routes = vnc_api.RouteTableType() + routes.add_route(vnc_api.RouteType(prefix = prefix)) + obj.set_interface_route_table_routes(routes) + + def route_del(self, obj, prefix): + routes = obj.get_interface_route_table_routes() + if not routes: + return + for item in routes.get_route(): + if (item.get_prefix() == prefix): + routes.delete_route(item) + obj.set_interface_route_table_routes(routes) + + def add(self, name, route = None): + create = False + obj = self.obj_get(name) + if not obj: + obj = vnc_api.InterfaceRouteTable(name = name, + parent_obj = self.tenant) + create = True + if route: + for item in route: + self.route_add(obj, item) + if create: + try: + self.vnc.interface_route_table_create(obj) + except Exception as e: + print 'ERROR: %s' %(str(e)) + else: + self.vnc.interface_route_table_update(obj) + + def delete(self, name, route = None): + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + if route: + for item in route: + self.route_del(obj, item) + self.vnc.interface_route_table_update(obj) + else: + try: + self.vnc.interface_route_table_delete(id = obj.uuid) + except Exception as e: + print 'ERROR: %s' %(str(e)) + + +class ConfigVmInterface(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + self.nova = client.nova + + def obj_list(self, vm_id = None): + list = [] + if vm_id: + vm = self.vnc.virtual_machine_read(id = vm_id) + if_ref_list = vm.get_virtual_machine_interface_back_refs() + for if_ref in if_ref_list: + if_obj = self.vnc.virtual_machine_interface_read( + id = if_ref['uuid']) + vn_name = if_obj.get_virtual_network_refs()[0]['to'][2] + list.append({'name':vn_name, 'uuid':if_ref['uuid'], + 'obj':if_obj}) + else: + for vm_nova in self.nova.servers.list(): + try: + vm = self.vnc.virtual_machine_read(id = vm_nova.id) + except Exception as e: + print 'ERROR: %s' %(str(e)) + continue + if_ref_list = vm.get_virtual_machine_interface_back_refs() + for if_ref in if_ref_list: + if_obj = self.vnc.virtual_machine_interface_read( + id = if_ref['uuid']) + vn_name = if_obj.get_virtual_network_refs()[0]['to'][2] + list.append({'name':'%s:%s' %(vm_nova.name, vn_name), + 'uuid':if_ref['uuid'], 'obj':if_obj}) + return list + + def obj_get(self, name, vm_id = None): + list = self.obj_list(vm_id) + for item in list: + if (item['name'] == name): + return item['obj'] + + def prop_mac_show(self, obj): + print '[P] MAC addresses:' + mac = obj.get_virtual_machine_interface_mac_addresses() + if not mac: + return + for item in mac.get_mac_address(): + print ' %s' %(item) + + def prop_prop_show(self, obj): + prop = obj.get_virtual_machine_interface_properties() + if not prop: + return + print '[P] Service interface type: %s' \ + %(prop.get_service_interface_type()) + print '[P] Interface mirror: %s' %(prop.get_interface_mirror()) + + def ref_sg_show(self, obj): + print '[R] Security groups:' + refs = obj.get_security_group_refs() + if refs: + for item in obj.get_security_group_refs(): + print ' %s' %(item['to'][2]) + + def ref_net_show(self, obj): + print '[R] Virtual networks:' + for item in obj.get_virtual_network_refs(): + print ' %s' %(item['to'][2]) + + def ref_irt_show(self, obj): + print '[R] Interface route tables:' + list = obj.get_interface_route_table_refs() + if list: + for item in list: + print ' %s' %(item['to'][2]) + + def back_ref_ip_show(self, obj): + print '[BR] Instance IPs:' + list = obj.get_instance_ip_back_refs() + if not list: + return + for item in list: + ip = self.vnc.instance_ip_read(id = item['uuid']) + print ' %s' %(ip.get_instance_ip_address()) + + def back_ref_fip_show(self, obj): + print '[BR] Floating IPs:' + list = obj.get_floating_ip_back_refs() + if not list: + return + for item in list: + ip = self.vnc.floating_ip_read(id = item['uuid']) + print ' %s' %(ip.get_floating_ip_address()) + + def obj_show(self, obj, name): + print 'Virtual Machine Interface' + print 'Name: %s' %(name) + print 'UUID: %s' %(obj.uuid) + self.prop_mac_show(obj) + self.prop_prop_show(obj) + self.ref_sg_show(obj) + self.ref_net_show(obj) + self.ref_irt_show(obj) + self.back_ref_ip_show(obj) + self.back_ref_fip_show(obj) + + def show(self, name = None): + if name: + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + self.obj_show(obj, name) + else: + for item in self.obj_list(): + print ' %s' %(item['name']) + + def sg_add(self, obj, sg): + try: + sg_obj = self.vnc.security_group_read( + fq_name = ['default-domain', self.tenant.name, sg]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.add_security_group(sg_obj) + + def addr_add(self, obj, addr): + id = str(uuid.uuid4()) + ip_obj = vnc_api.InstanceIp(name = id, instance_ip_address = addr) + ip_obj.uuid = id + ip_obj.add_virtual_machine_interface(obj) + vn_id = obj.get_virtual_network_refs()[0]['uuid'] + vn_obj = self.vnc.virtual_network_read(id = vn_id) + ip_obj.add_virtual_network(vn_obj) + self.vnc.instance_ip_create(ip_obj) + + def irt_add(self, obj, irt): + try: + table_obj = self.vnc.interface_route_table_read( + fq_name = ['default-domain', self.tenant.name, irt]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.add_interface_route_table(table_obj) + + def fip_add(self, obj, fip_pool, fip): + pool_name = fip_pool.split(':') + pool_name.insert(0, 'default-domain') + try: + pool_obj = self.vnc.floating_ip_pool_read(fq_name = pool_name) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + id = str(uuid.uuid4()) + fip_obj = vnc_api.FloatingIp(name = id, parent_obj = pool_obj) + fip_obj.uuid = id + if (fip != 'any'): + fip_obj.set_floating_ip_address(fip) + fip_obj.add_project(self.tenant) + fip_obj.add_virtual_machine_interface(obj) + self.vnc.floating_ip_create(fip_obj) + self.tenant.add_floating_ip_pool(pool_obj) + self.vnc.project_update(self.tenant) + + def add(self, name, sg = None, irt = None, addr = None, + fip_pool = None, fip = None): + update = False + obj = self.obj_get(name) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + if sg: + self.sg_add(obj, sg) + update = True + if irt: + self.irt_add(obj, irt) + update = True + if addr: + self.addr_add(obj, addr) + update = True + if fip and fip_pool: + self.fip_add(obj, fip_pool, fip) + update = True + if update: + self.vnc.virtual_machine_interface_update(obj) + + def sg_del(self, obj, sg): + try: + sg_obj = self.vnc.security_group_read( + fq_name = ['default-domain', self.tenant.name, sg]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.del_security_group(sg_obj) + + def irt_del(self, obj, irt): + try: + table_obj = self.vnc.interface_route_table_read( + fq_name = ['default-domain', self.tenant.name, irt]) + except Exception as e: + print 'ERROR: %s' %(str(e)) + return + obj.del_interface_route_table(table_obj) + + def addr_del(self, obj, addr): + ip_list = obj.get_instance_ip_back_refs() + for ip in ip_list: + ip_obj = self.vnc.instance_ip_read(id = ip['uuid']) + if (ip_obj.get_instance_ip_address() == addr): + self.vnc.instance_ip_delete(id = ip_obj.uuid) + break + else: + print 'ERROR: IP address %s is not found!' %(addr) + + def fip_del(self, obj): + list = obj.get_floating_ip_back_refs() + if not list: + return + for item in list: + ip = self.vnc.floating_ip_delete(id = item['uuid']) + + def delete(self, name, sg = None, irt = None, addr = None, + fip = None, vm_id = None): + update = False + obj = self.obj_get(name, vm_id) + if not obj: + print 'ERROR: Object %s is not found!' %(name) + return + if sg: + self.sg_del(obj, sg) + update = True + if irt: + self.irt_del(obj, irt) + update = True + if addr: + self.addr_del(obj, addr) + update = True + if fip: + self.fip_del(obj) + update = True + if update: + self.vnc.virtual_machine_interface_update(obj) + + +class ConfigGlobalVrouter(): + def __init__(self, client): + self.vnc = client.vnc + self.tenant = client.tenant + + def obj_list(self): + list = self.vnc.interface_route_tables_list()['interface-route-tables'] + return list + + def obj_get(self, name): + obj = self.vnc.global_vrouter_config_read( + fq_name = ['default-global-system-config', + 'default-global-vrouter-config']) + return obj + + def obj_show(self, obj): + pass + + def show(self, name = None): + obj = self.obj_get('dummy') + print 'Link Local Service' + for item in obj.get_linklocal_services().get_linklocal_service_entry(): + print ' %s %s:%s %s:%s' %(item.get_linklocal_service_name(), + item.get_linklocal_service_ip(), + item.get_linklocal_service_port(), + item.get_ip_fabric_service_ip()[0], + item.get_ip_fabric_service_port()) + + def add(self, name, link_local_addr, fabric_addr): + obj = self.obj_get('dummy') + list = obj.get_linklocal_services().get_linklocal_service_entry() + list.append(vnc_api.LinklocalServiceEntryType( + linklocal_service_name = name, + linklocal_service_ip = link_local_addr.split(':')[0], + linklocal_service_port = int(link_local_addr.split(':')[1]), + ip_fabric_service_ip = [fabric_addr.split(':')[0]], + ip_fabric_service_port = int(fabric_addr.split(':')[1]))) + self.vnc.global_vrouter_config_update(obj) + + def delete(self, name): + obj = self.obj_get('dummy') + list = obj.get_linklocal_services().get_linklocal_service_entry() + for item in list: + if (item.get_linklocal_service_name() == name): + list.remove(item) + break + self.vnc.global_vrouter_config_update(obj) + +class ConfigClient(): + def __init__(self, username, password, tenant, region, api_server): + self.vnc = vnc_api.VncApi(username = username, password = password, + tenant_name = tenant, api_server_host = api_server) + if config_nova: + self.nova = novaclient.v1_1.client.Client(username = username, + api_key = password, project_id = tenant, + region_name = region, + auth_url = 'http://%s:35357/v2.0' %(api_server)) + else: + self.nova = None + self.tenant = self.vnc.project_read( + fq_name = ['default-domain', tenant]) + diff --git a/Testcases/config_shell.py b/Testcases/config_shell.py new file mode 100644 index 0000000..2fe5ad1 --- /dev/null +++ b/Testcases/config_shell.py @@ -0,0 +1,379 @@ + +from config_obj import * +import argparse + +class ConfigShell(): + + def __init__(self): + self.parser_init() + + def env(self, *args, **kwargs): + for arg in args: + value = os.environ.get(arg, None) + if value: + return value + return kwargs.get('default', '') + + def do_help(self, args): + if args.obj_parser: + args.obj_parser.print_help() + else: + self.parser.print_help() + + def parser_init(self): + parser = argparse.ArgumentParser() + parser.add_argument('--username', help = 'User name') + parser.add_argument('--password', help = 'Password') + parser.add_argument('--tenant', help = 'Tenant name') + parser.add_argument('--region', help = 'Region name') + parser.add_argument('--api-server', help = 'API server address') + + parser.add_argument('cmd', choices = ['add', 'show', 'delete', 'help'], + metavar = '', help = '[ add | show | delete | help ]') + + subparsers = parser.add_subparsers(metavar = '') + self.sub_cmd_dict = {} + + sub_parser = subparsers.add_parser('vdns', help = 'Virtual DNS') + sub_parser.set_defaults(obj_class = ConfigVirtualDns, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of virtual DNS') + sub_parser.add_argument('--domain-name', metavar = '', + help = 'The name of DNS domain') + sub_parser.add_argument('--record-order', + choices = ['fixed', 'random', 'round-robin'], + default = 'random', metavar = '', + help = 'The order of DNS records ' \ + '[ random | fixed | round-robin ]') + sub_parser.add_argument('--next-dns', metavar = '', + help = 'The name of next virtual DNS service or ' \ + 'the IP address of DNS server reachable by fabric.') + + sub_parser = subparsers.add_parser('ipam', help = 'Network IPAM') + sub_parser.set_defaults(obj_class = ConfigIpam, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of IPAM') + sub_parser.add_argument('--dns-type', + choices = ['none', 'default', 'tenant', 'virtual'], + metavar = '', + help = 'The type of DNS service ' \ + '[ none | default | virtual | tenant ]') + sub_parser.add_argument('--virtual-dns', metavar = '', + help = 'The name of virtual DNS service') + sub_parser.add_argument('--tenant-dns', metavar = '
', + action = 'append', + help = 'The address of tenant DNS') + sub_parser.add_argument('--domain-name', metavar = '', + help = 'The name of DNS domain') + sub_parser.add_argument('--ntp-server', metavar = '
', + help = 'The address of NTP server') + + sub_parser = subparsers.add_parser('policy', help = 'Network Policy') + sub_parser.set_defaults(obj_class = ConfigPolicy, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of policy') + sub_parser.add_argument('--rule', action = 'append', + metavar = '', + help = 'Policy rule ' \ + 'direction=[ "<>" | ">" ],' \ + 'protocol=[ any | tcp | udp | icmp ],' \ + 'src-net=[ | any ],' \ + 'dst-net=[ | any ],' \ + 'src-port=[ : | any ],' \ + 'dst-port=[ : | any ],' \ + 'action=[ pass | deny | drop | reject | alert | ' \ + 'log | service ],' \ + 'service=,' \ + 'index=') + + sub_parser = subparsers.add_parser('security-group', + help = 'Security Group') + sub_parser.set_defaults(obj_class = ConfigSecurityGroup, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of security group') + sub_parser.add_argument('--rule', metavar = '', + help = 'Rule index') + sub_parser.add_argument('--direction', + choices = ['ingress', 'egress'], + metavar = '', + help = 'Direction [ ingress | egress ]') + sub_parser.add_argument('--protocol', + choices = ['any', 'tcp', 'udp', 'icmp'], + metavar = '', + help = 'Protocol [ any | tcp | udp | icmp ]') + sub_parser.add_argument('--address', action = 'append', + metavar = '/', help = 'Remote IP address') + sub_parser.add_argument('--port', action = 'append', type = str, + metavar = ':', help = 'The range of remote port') + + sub_parser = subparsers.add_parser('network', + help = 'Virtual Network') + sub_parser.set_defaults(obj_class = ConfigNetwork, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of virtual network') + sub_parser.add_argument('--ipam', metavar = '', + help = 'The name of IPAM') + sub_parser.add_argument('--subnet', metavar = '/', + help = 'Subnet prefix and length') + sub_parser.add_argument('--gateway', metavar = '
', + help = 'The gateway address of subnet') + sub_parser.add_argument('--policy', metavar = '', + help = 'The name of network policy') + sub_parser.add_argument('--route-target', metavar = ':', + help = 'Route target') + sub_parser.add_argument('--route-table', metavar = '', + help = 'The name of route table') + sub_parser.add_argument('--l2', action = 'store_true', + help = 'Layer 2 network, layer 2&3 by default') + sub_parser.add_argument('--shared', action = 'store_true', + help = 'Enable sharing with other tenants') + sub_parser.add_argument('--external', action = 'store_true', + help = 'Enable external access') + + sub_parser = subparsers.add_parser('floating-ip-pool', + help = 'Floating IP Pool') + sub_parser.set_defaults(obj_class = ConfigFloatingIpPool, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of floating IP pool') + sub_parser.add_argument('--network', metavar = '', + help = 'The name of virtual network holding floating IP pool') + #sub_parser.add_argument('--floating-ip', action = 'store_true', + # help = 'Floating IP') + + sub_parser = subparsers.add_parser('vm', + help = 'Virtual Machine') + sub_parser.set_defaults(obj_class = ConfigVirtualMachine, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of virtual machine') + sub_parser.add_argument('--image', metavar = '', + help = 'The name of image') + sub_parser.add_argument('--flavor', metavar = '', + help = 'The name of flavor') + sub_parser.add_argument('--network', action = 'append', + metavar = '', + help = 'The name of network') + sub_parser.add_argument('--user-data', metavar = '', + help = 'Full file name containing user data') + sub_parser.add_argument('--node', metavar = '', + help = 'The name of compute node') + sub_parser.add_argument('--wait', action = 'store_true', + help = 'Wait till VM is active') + + sub_parser = subparsers.add_parser('interface-route-table', + help = 'Interface Route Table') + sub_parser.set_defaults(obj_class = ConfigInterfaceRouteTable, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of interface route table') + sub_parser.add_argument('--route', action = 'append', + metavar = '/', help = 'Route') + + sub_parser = subparsers.add_parser('route-table', + help = 'Network Route Table') + sub_parser.set_defaults(obj_class = ConfigRouteTable, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of route table') + sub_parser.add_argument('--route', action = 'append', + metavar = '/:', + help = 'The route and next-hop') + + sub_parser = subparsers.add_parser('vm-interface', + help = 'Virtual Machine Interface') + sub_parser.set_defaults(obj_class = ConfigVmInterface, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = ':', + help = 'The name of virtual machine interface') + sub_parser.add_argument('--interface-route-table', metavar = '', + help = 'The name of interface route table') + sub_parser.add_argument('--security-group', metavar = '', + help = 'The name of security group') + sub_parser.add_argument('--address', + metavar = '
', + help = 'IP address') + sub_parser.add_argument('--floating-ip', + metavar = '
', + help = 'Floating IP address [ any |
]') + sub_parser.add_argument('--floating-ip-pool', + metavar = '', + help = 'The floating IP pool to allocate a floating IP from ' \ + '::') + + sub_parser = subparsers.add_parser('image', + help = 'Virtual Machine Image') + self.sub_cmd_dict['image'] = sub_parser + sub_parser.set_defaults(obj_class = ConfigImage) + sub_parser.add_argument('name', nargs = '?', default = None) + + sub_parser = subparsers.add_parser('flavor', + help = 'Virtual Machine Flavor') + self.sub_cmd_dict['flavor'] = sub_parser + sub_parser.set_defaults(obj_class = ConfigFlavor) + sub_parser.add_argument('name', nargs = '?', default = None) + + sub_parser = subparsers.add_parser('service-template', + help = 'Service Template') + sub_parser.set_defaults(obj_class = ConfigServiceTemplate, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of service template') + sub_parser.add_argument('--mode', + choices = ['transparent', 'in-network', 'in-network-nat'], + metavar = '', + help = 'Service mode ' \ + '[ transparent | in-network | in-network-nat ]') + sub_parser.add_argument('--type', + choices = ['firewall', 'analyzer'], + metavar = '', + help = 'Service type [ firewall | analyzer ]') + sub_parser.add_argument('--image', metavar = '', + help = 'The name of image') + sub_parser.add_argument('--flavor', metavar = '', + help = 'The name of flavor') + sub_parser.add_argument('--scale', action = 'store_true', + help = 'Enable service scaling') + sub_parser.add_argument('--interface', + choices = ['management', 'left', 'right', 'other'], + metavar = '', + action = 'append', + help = 'Service interface ' \ + '[ management | left | right | other ]') + + sub_parser = subparsers.add_parser('service-instance', + help = 'Service Instance') + sub_parser.set_defaults(obj_class = ConfigServiceInstance, + obj_parser = sub_parser) + sub_parser.add_argument('name', nargs = '?', default = None, + metavar = '', help = 'The name of service instance') + sub_parser.add_argument('--template', + metavar = '