tools/cloudconnect/gcp-vpn-buildconf.py (63 lines of code) (raw):

#!/usr/bin/env python # Copyright 2017 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ gcp-vpn-buildconf.py reads AWS' customer gateway XML configuratoin and outputs a gcp-vpn.jinja Demployment Manager configuration file """ from __future__ import print_function import sys import argparse import xml.etree.ElementTree as ET from jinja2 import Environment PATHS = { 'address': 'customer_gateway/tunnel_outside_address/ip_address', 'asn': 'customer_gateway/bgp/asn', 'bgp_tunnel': { 'peerIp': 'vpn_gateway/tunnel_outside_address/ip_address', 'sharedSecret': 'ike/pre_shared_key', 'peerAsn': 'vpn_gateway/bgp/asn', 'bgpIpAddress': 'customer_gateway/tunnel_inside_address/ip_address', 'peerBgpIpAddress': 'vpn_gateway/tunnel_inside_address/ip_address' }, 'static_tunnel': { 'peerIp': 'vpn_gateway/tunnel_outside_address/ip_address', 'sharedSecret': 'ike/pre_shared_key', } } BGP_CONFIG = """ imports: - path: gcp-vpn.jinja resources: - name: vpn type: gcp-vpn.jinja properties: network: {{ network }} region: {{ region }} address: {{ address }} asn: {{ asn }} tunnels: {%- for i in tunnels %} - peerIp: {{ i['peerIp'] }} secret: {{ i['sharedSecret'] }} peerAsn: {{ i['peerAsn'] }} bgpIpAddress: {{ i['bgpIpAddress'] }} peerBgpIpAddress: {{ i['peerBgpIpAddress'] }} {%- endfor %} """ STATIC_CONFIG = """ imports: - path: gcp-vpn.jinja resources: - name: vpn type: gcp-vpn.jinja properties: network: {{ network }} region: {{ region }} address: {{ address }} tunnels: {%- for i in tunnels %} - peerIp: {{ i['peerIp'] }} secret: {{ i['sharedSecret'] }} localTrafficSelector: {%- for j in i['local_traffic_selector'] %} - {{ j }} {%- endfor %} remoteTrafficSelector: {%- for j in i['remote_traffic_selector'] %} - {{ j }} {%- endfor %} {%- endfor %} """ def main(): ''' main ''' parser = argparse.ArgumentParser(description=""" Reads a CustomerGatewayConfiguration(XML) from stdin, and outputs a yaml file to use with gcp-vpn.jinja.""", usage=""" aws ec2 describe-vpn-connections --filter Name=vpn-connection-id,Values=vpn-67c00420 --query VpnConnections[0].CustomerGatewayConfiguration --output text | ./gcp-vpn-buildconf.py --network https://www.googleapis.com/compute/v1/projects/xpn-host/global/networks/vpc >> gcp-vpn.yaml""") parser.add_argument('--region', default='us-east1') parser.add_argument('--network', required=True, help='Fully-qualified network url') parser.add_argument('--local-traffic-selector', nargs='+') parser.add_argument('--remote-traffic-selector', nargs='+') args = parser.parse_args() try: tree = ET.parse(sys.stdin) except ValueError: print("InValid xml input. Verify aws cli command includes \"--query \ VpnConnections[0].CustomerGatewayConfiguration \ --output text\"", file=sys.stderr) sys.exit(1) params = { 'region': args.region, 'network': args.network, 'tunnels': [] } for i in tree.getroot().findall('ipsec_tunnel'): params['address'] = i.find(PATHS['address']).text if i.find(PATHS['asn']) is None: config = STATIC_CONFIG tunnel = {k: i.find(v).text for k, v in PATHS['static_tunnel'].items()} tunnel['local_traffic_selector'] = args.local_traffic_selector tunnel['remote_traffic_selector'] = args.remote_traffic_selector params['tunnels'].append(tunnel) else: config = BGP_CONFIG params['asn'] = i.find(PATHS['asn']).text params['tunnels'].append( {k: i.find(v).text for k, v in PATHS['bgp_tunnel'].items()} ) print(Environment().from_string(config).render(params).rstrip()) if __name__ == '__main__': main()