Kang Xi | 11d278c | 2018-04-06 16:56:04 -0400 | [diff] [blame] | 1 | #! /usr/bin/python |
| 2 | |
| 3 | import os |
| 4 | import requests |
| 5 | import time |
| 6 | from vcpecommon import * |
| 7 | from datetime import datetime |
| 8 | import soutils |
| 9 | import logging |
| 10 | import preload |
| 11 | import json |
| 12 | |
| 13 | |
| 14 | class CustomService: |
| 15 | def __init__(self, vcpecommon): |
| 16 | self.logger = logging.getLogger(__name__) |
| 17 | self.vcpecommon = vcpecommon |
| 18 | |
| 19 | # delete all vgw stacks |
| 20 | def del_all_vgw_stacks(self, keyword): |
| 21 | param = ' '.join([k + ' ' + v for k, v in self.vcpecommon.cloud.items()]) |
| 22 | openstackcmd = 'openstack ' + param + ' ' |
| 23 | |
| 24 | stacks = os.popen(openstackcmd + 'stack list').read() |
| 25 | found = False |
| 26 | for stack_description in stacks.split('\n'): |
| 27 | if keyword in stack_description: |
| 28 | found = True |
| 29 | stack_name = stack_description.split('|')[2].strip() |
| 30 | cmd = openstackcmd + 'stack delete -y ' + stack_name |
| 31 | self.logger.info('Deleting ' + stack_name) |
| 32 | os.popen(cmd) |
| 33 | |
| 34 | if not found: |
| 35 | self.logger.info('No vGW stack to delete') |
| 36 | |
| 37 | # clean up SDNC |
| 38 | def clean_up_sdnc(self): |
| 39 | items = ['tunnelxconn-allotted-resources', 'brg-allotted-resources'] |
| 40 | for res in items: |
| 41 | self.logger.info('Cleaning up ' + res + ' from SDNC') |
| 42 | requests.delete(self.vcpecommon.sdnc_ar_cleanup_url + res, auth=self.vcpecommon.sdnc_userpass) |
| 43 | |
| 44 | def print_success_info(self, print_instructions=True, nodes=None): |
| 45 | if not nodes: |
| 46 | nodes = ['brg', 'mux', 'gw', 'web'] |
| 47 | ip_dict = self.vcpecommon.get_vm_ip(nodes, self.vcpecommon.external_net_addr, |
| 48 | self.vcpecommon.external_net_prefix_len) |
| 49 | |
| 50 | print(json.dumps(ip_dict, indent=4, sort_keys=True)) |
| 51 | for node in ['brg', 'mux']: |
| 52 | print('VxLAN config in {0}:'.format(node)) |
| 53 | self.vcpecommon.get_vxlan_interfaces(ip_dict[node], print_info=True) |
| 54 | |
| 55 | print(json.dumps(ip_dict, indent=4, sort_keys=True)) |
| 56 | |
| 57 | if print_instructions: |
| 58 | print('----------------------------------------------------------------------------') |
| 59 | print('Custom service created successfully. See above for VxLAN configuration info.') |
| 60 | print('To test data plane connectivity, following the steps below.') |
| 61 | print(' 1. ssh to vGW at {0}'.format(ip_dict['gw'])) |
| 62 | print(' 2. Restart DHCP: systemctl restart isc-dhcp-server') |
| 63 | print(' 3. ssh to vBRG at {0}'.format(ip_dict['brg'])) |
| 64 | print(' 4. Get IP from vGW: dhclient lstack') |
| 65 | print(' 5. Add route to Internet: ip route add 10.2.0.0/24 via 192.168.1.254 dev lstack') |
| 66 | print(' 6. ping the web server: ping {0}'.format('10.2.0.10')) |
| 67 | print(' 7. wget http://{0}'.format('10.2.0.10')) |
| 68 | |
Brian Freeman | 81f6e9e | 2018-11-11 22:36:20 -0500 | [diff] [blame] | 69 | def create_custom_service(self, csar_file, vgw_template_file, vgw_gra_template_file, preload_dict=None): |
Kang Xi | 11d278c | 2018-04-06 16:56:04 -0400 | [diff] [blame] | 70 | name_suffix = datetime.now().strftime('%Y%m%d%H%M') |
Kang Xi | 0e0a1d6 | 2018-07-23 16:53:54 -0400 | [diff] [blame] | 71 | if self.vcpecommon.oom_mode: |
| 72 | brg_mac = str(raw_input("Enter the BRG MAC address: ")) |
| 73 | else: |
| 74 | brg_mac = self.vcpecommon.get_brg_mac_from_sdnc() |
Yang Xu | 3f68683 | 2018-11-22 10:56:52 -0500 | [diff] [blame^] | 75 | brg_mac_enc = brg_mac.replace(':', '-') |
Brian Freeman | 81f6e9e | 2018-11-11 22:36:20 -0500 | [diff] [blame] | 76 | # get name index |
Brian Freeman | 8076a87 | 2018-11-13 11:34:48 -0500 | [diff] [blame] | 77 | self.vgw_vfmod_name_index= self.vcpecommon.load_object(self.vcpecommon.vgw_vfmod_name_index_file) |
| 78 | self.vgw_vfmod_name_index=self.vgw_vfmod_name_index + 1 |
Yang Xu | 1a0a046 | 2018-11-20 16:01:01 -0500 | [diff] [blame] | 79 | self.vcpecommon.save_object(self.vgw_vfmod_name_index,self.vcpecommon.vgw_vfmod_name_index_file) |
Kang Xi | 11d278c | 2018-04-06 16:56:04 -0400 | [diff] [blame] | 80 | # preload vGW |
| 81 | if preload_dict: |
| 82 | preloader = preload.Preload(self.vcpecommon) |
Kang Xi | 0e0a1d6 | 2018-07-23 16:53:54 -0400 | [diff] [blame] | 83 | parameters_to_change = ['vgw_private_ip_0', 'vgw_private_ip_1', 'vgw_private_ip_2','vg_vgmux_tunnel_vni'] |
Kang Xi | 6c76239 | 2018-05-30 09:27:34 -0400 | [diff] [blame] | 84 | self.vcpecommon.increase_ip_address_or_vni_in_template(vgw_template_file, parameters_to_change) |
Kang Xi | 11d278c | 2018-04-06 16:56:04 -0400 | [diff] [blame] | 85 | preloader.preload_vgw(vgw_template_file, brg_mac, preload_dict, name_suffix) |
Brian Freeman | 81f6e9e | 2018-11-11 22:36:20 -0500 | [diff] [blame] | 86 | # preload vGW-GRA |
Yang Xu | 3f68683 | 2018-11-22 10:56:52 -0500 | [diff] [blame^] | 87 | preloader.preload_vgw_gra(vgw_gra_template_file, brg_mac_enc, preload_dict, name_suffix, str(self.vgw_vfmod_name_index)) |
Kang Xi | 11d278c | 2018-04-06 16:56:04 -0400 | [diff] [blame] | 88 | |
| 89 | # create service |
| 90 | so = soutils.SoUtils(self.vcpecommon, 'v5') |
| 91 | if so.create_custom_service(csar_file, brg_mac, name_suffix): |
| 92 | self.print_success_info() |