Skip to content

Commit

Permalink
Support for multi t0 BGP setup (squashed)
Browse files Browse the repository at this point in the history
Signed-off-by: Yang Ding [email protected]

Adding extra edges and T0 routers to nsx.yml
Signed-off-by: Yang Ding <[email protected]>

Functions to post BGP configurations
Signed-off-by: Yang Ding <[email protected]>

Functions to add ip prefix configs
Signed-off-by: Yang Ding <[email protected]>

Functions to add bgp community lists
Signed-off-by: Yang Ding <[email protected]>

Functions to add BGP neighbors
Signed-off-by: Yang Ding <[email protected]>

Merge changes from the unify params commit
Signed-off-by: Yang Ding <[email protected]>

Creating nsx resources for BGP
Signed-off-by: Yang Ding <[email protected]>

Add functions for route redistribution and nsx.yml
Signed-off-by: Yang Ding <[email protected]>

Bug fixes for BGP related functions in nsx-t-gen
Signed-off-by: Yang Ding <[email protected]>

Adding functions for creating IP sets
Signed-off-by: Yang Ding <[email protected]>

Global id map refactor
Signed-off-by: Yang Ding <[email protected]>

Functions to create/update firewall sections/rules and code cleanup
Signed-off-by: Yang Ding <[email protected]>

Creating TZs for each tenant VLAN, and functions for creating NSgroup
Signed-off-by: Yang Ding <[email protected]>

nsx-t-gen refactor
Signed-off-by: Yang Ding <[email protected]>
  • Loading branch information
Dyanngg committed Nov 1, 2019
1 parent aaf6712 commit be862bd
Show file tree
Hide file tree
Showing 14 changed files with 1,772 additions and 254 deletions.
2 changes: 1 addition & 1 deletion docker_image/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,4 @@ fly -t $CONCOURSE_TARGET destroy-pipeline -p $PIPELINE_NAME
docker-compose down
docker stop nginx-server
docker rm nginx-server
exit 0
exit 0
53 changes: 39 additions & 14 deletions functions/create_hosts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ function create_manager_host {
manager_hostname="${nsx_manager_hostname_prefix_int}-1"
# The following need to be placed under [localhost:vars] section
cat >> manager_host <<-EOF
nsx_manager_ip="$manager_ip"
nsx_manager_username="$nsx_manager_username_int"
nsx_manager_password="$nsx_manager_password_int"
nsx_manager_assigned_hostname="$manager_hostname"
nsx_manager_root_pwd="$nsx_manager_root_pwd_int"
nsx_manager_cli_pwd="$nsx_manager_cli_pwd_int"
nsx_manager_deployment_size="$nsx_manager_deployment_size_int"
EOF
}

Expand All @@ -41,7 +41,7 @@ function create_controller_hosts {
echo "$controller_host" >> ctrl_vms
done

cat >> ctrl_vms <<-EOF
cat >> ctrl_vms <<-EOF
[controllers:vars]
prefix_length="${nsx_manager_deployment_ip_prefix_length_int}"
default_gateway="${default_gateway_int}"
Expand All @@ -53,7 +53,7 @@ EOF
function create_edge_hosts {
echo "[edge_nodes]" > edge_vms
edge_ips_int=($(echo "$edge_ips_int" | sed -e 's/,/ /g'))
per_edge_params=("edge_deployment_size_int" "vc_datacenter_for_edge_int" "vc_cluster_for_edge_int" "vc_datastore_for_edge_int" "vc_uplink_network_for_edge_int" "vc_overlay_network_for_edge_int" "vc_management_network_for_edge_int")
per_cluster_params=("edge_deployment_size_int" "edge_uplink_profile_vlan_int" "vc_datacenter_for_edge_int" "vc_cluster_for_edge_int" "vc_datastore_for_edge_int" "vc_uplink_network_for_edge_int" "vc_overlay_network_for_edge_int" "vc_management_network_for_edge_int")

num_edges=${#edge_ips_int[@]}

Expand All @@ -76,9 +76,11 @@ function create_edge_hosts {
[edge_nodes:vars]
edge_cli_password="$edge_cli_password_int"
edge_root_password="$edge_root_password_int"
edge_uplink_profile_name="edge-single-uplink-prof"
vlan_logical_switch_name="$vlan_logical_switch_name_int"
EOF

for param in "${per_edge_params[@]}"; do
for param in "${per_cluster_params[@]}"; do
# param_val=($(echo "${!param}" | sed -e 's/,/ /g'))
param_val="${!param}"
# if [[ ${#param_val[@]} -eq 1 ]]; then
Expand Down Expand Up @@ -121,12 +123,10 @@ function set_list_var_and_strip_whitespaces {
}

function create_hosts {
# TODO: set nsx manager fqdn
export NSX_T_MANAGER_SHORT_HOSTNAME=$(echo "$NSX_T_MANAGER_FQDN" | awk -F '\.' '{print $1}')

# TODO: set nsx manager fqdn
export NSX_T_MANAGER_SHORT_HOSTNAME=$(echo "$NSX_T_MANAGER_FQDN" | awk -F '\.' '{print $1}')
#apt -qq install bc

cat > hosts <<-EOF
cat > hosts <<-EOF
[localhost]
localhost ansible_connection=local
Expand Down Expand Up @@ -161,14 +161,21 @@ vtep_ip_pool_gateway="$vtep_ip_pool_gateway_int"
vtep_ip_pool_start="$vtep_ip_pool_start_int"
vtep_ip_pool_end="$vtep_ip_pool_end_int"
resource_reservation_off="$resource_reservation_off_int"
nsx_manager_ssh_enabled="$nsx_manager_ssh_enabled_int"
unified_appliance="$unified_appliance_int"
edge_cluster_name="$edge_cluster_name_int"
tier0_router_name="$tier0_router_name_int"
tier0_uplink_port_ip="$tier0_uplink_port_ip_int"
tier0_uplink_port_subnet="$tier0_uplink_port_subnet_int"
tier0_uplink_next_hop_ip="$tier0_uplink_next_hop_ip_int"
resource_reservation_off="$resource_reservation_off_int"
nsx_manager_ssh_enabled="$nsx_manager_ssh_enabled_int"
unified_appliance="$unified_appliance_int"
inter_t0_logical_switch_name="$inter_t0_logical_switch_name_int"
inter_t0_transport_zone_name="$inter_t0_transport_zone_name_int"
inter_t0_cidr="$inter_t0_cidr_int"
inter_t0_vlan="$inter_t0_vlan_int"
EOF

if [[ $unified_appliance_int == "true" ]]; then
Expand All @@ -180,29 +187,47 @@ EOF
create_manager_host
cat manager_host >> hosts

python ${FUNCTIONS_DIR}/create_tenant_resources.py --resource cluster_spec
cat cluster_spec >> hosts
echo "" >> hosts

set_list_var_and_strip_whitespaces esx_available_vmnic_int hosts
set_list_var_and_strip_whitespaces clusters_to_install_nsx_int hosts
set_list_var_and_strip_whitespaces per_cluster_vlans_int hosts

optional_params=("tier0_ha_vip_int" "tier0_uplink_port_ip_2_int" "compute_manager_2_username_int" "compute_manager_2_password_int" "compute_manager_2_vcenter_ip_int")
optional_params=("compute_manager_2_username_int" "compute_manager_2_password_int" "compute_manager_2_vcenter_ip_int")
for param in "${optional_params[@]}"; do
param_val="${!param}"
if [[ $param_val != "" && $param_val != "null" ]]; then
echo "${param::-4}=${param_val}" >> hosts
fi
done

t0_optional_params=("tier0_ha_vip_int" "tier0_uplink_port_ip_2_int")
for param in "${t0_optional_params[@]}"; do
param_val="${!param}"
if [[ $param_val != "" && $param_val != "null" ]]; then
echo "${param::-4}=${param_val}" >> hosts
fi
done

create_edge_hosts
create_controller_hosts
python ${FUNCTIONS_DIR}/create_tenant_resources.py --resource edge_spec
python ${FUNCTIONS_DIR}/create_tenant_resources.py --resource t0_spec

if [[ -f ctrl_vms ]]; then
cat ctrl_vms >> hosts
echo "" >> hosts
rm ctrl_vms
fi
cat edge_vms >> hosts
echo "" >> hosts
cat tenant_edges >> hosts
echo "" >> hosts
cat t0s >> hosts

rm manager_host edge_vms
rm cluster_spec edge_vms tenant_edges t0s

if [[ $esx_ips_int != "" && $esx_ips_int != "null" ]]; then
create_esx_hosts
Expand Down
133 changes: 133 additions & 0 deletions functions/create_tenant_resources.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import os
import json
import sys
import argparse


def create_tenant_edge_params():
dns_domain = os.getenv('dns_domain_int')
edge_specs = os.getenv('tenant_edge_clusters_int')
tenant_edge_clusters = json.loads(edge_specs)
tenant_t0_specs = os.getenv('tenant_t0s_int')
tenant_t0s = json.loads(tenant_t0_specs)

with open('tenant_edges', 'w') as edge_output_file:
if len(tenant_edge_clusters) == 0:
return
for idx, edge_cluster in enumerate(tenant_edge_clusters):
edge_output_file.write('\n[tenant_edge_cluster%s]\n' % idx)
edge_ips = [e.strip() for e in edge_cluster['edge_ips'].split(',')]
if len(edge_ips) < 1:
print("Edge cluster %s has no edge member!" % idx)
sys.exit(1)
for i in range(len(edge_ips)):
item_name = "%s-%s" % (edge_cluster['edge_hostname_prefix'], i+1)
hostname = item_name + dns_domain
transport_node_name = "%s-%s" % (edge_cluster['edge_transport_node_prefix'], i+1)
edge_line = item_name + ' ip=' + edge_ips[i] + ' hostname=' + hostname
edge_line += ' default_gateway=' + edge_cluster['edge_default_gateway']
edge_line += ' prefix_length=' + str(edge_cluster['edge_ip_prefix_length'])
edge_line += ' transport_node_name=' + transport_node_name
edge_output_file.write(edge_line + '\n')

edge_output_file.write('\n[tenant_edge_cluster%s:vars]\n' % idx)
params_to_write = ['edge_cli_password',
'edge_root_password',
'edge_deployment_size',
'vc_datacenter_for_edge',
'vc_cluster_for_edge',
'vc_datastore_for_edge',
'vc_management_network_for_edge',
'vc_overlay_network_for_edge',
'vc_uplink_network_for_edge']
for param in params_to_write:
edge_output_file.write('%s=%s\n' % (param, edge_cluster[param]))
edge_output_file.write('%s=%s\n' % ('vlan_logical_switch_name',
tenant_t0s[idx]['vlan_logical_switch_name']))
optional_params = ['edge_uplink_profile_vlan', 'edge_uplink_profile_name']
for optional_param in optional_params:
if optional_param in edge_cluster:
edge_output_file.write('%s=%s\n' % (optional_param, edge_cluster[optional_param]))

cluster_member_spec = []
for idx, edge_cluster in enumerate(tenant_edge_clusters):
members_line = "edge-cls-%s members='[" % (idx + 1)
for i in range(len(edge_cluster['edge_ips'].split(','))):
members_line += "{\"transport_node_name\":\"%s-%s\"}," % (
edge_cluster['edge_transport_node_prefix'], i + 1)
members_line = members_line[:-1] + "]'"
members_line += " edge_cluster_name=%s" % edge_cluster['edge_cluster_name']
if 'edge_uplink_profile_name' in edge_cluster:
members_line += " edge_uplink_profile_vlan=%s" % edge_cluster['edge_uplink_profile_vlan']
members_line += " edge_uplink_profile_name=%s\n" % edge_cluster['edge_uplink_profile_name']
cluster_member_spec.append(members_line)

edge_output_file.write('\n')
edge_output_file.write('\n[tenant_edge_cluster_members]\n')
edge_output_file.writelines(cluster_member_spec)


def create_tenant_t0_params():
tenant_t0_specs = os.getenv('tenant_t0s_int')
tenant_t0s = json.loads(tenant_t0_specs)
shared_t0_params = ['tier0_router_name', 'edge_cluster_name', 'tier0_uplink_port_ip',
'tier0_uplink_port_subnet', 'tier0_uplink_next_hop_ip',
'vlan_logical_switch_name', 'external_connectivity_vlan',
'tier0_uplink_port_ip_2', 'tier0_ha_vip', 'bgp_as_number',
'inter_tier0_network_ip', 'inter_tier0_network_ip_2']

with open('t0s', 'w') as t0_ouput_file:
t0_ouput_file.write('\n[tier0_routers]\n')
shared_t0_line = 'shared-t0 '
for param in shared_t0_params:
shared_t0_line += '%s=%s ' % (param, os.getenv(param + '_int'))
shared_t0_line += 'is_tanent=False'
t0_ouput_file.write(shared_t0_line + '\n')

params_to_write = shared_t0_params
params_to_write.extend(['is_tanent'])
for idx, t0 in enumerate(tenant_t0s):
t0_line = 'tenant-%s-t0 ' % idx
for param in params_to_write:
t0_line += '%s=%s ' % (param, t0[param])
t0_ouput_file.write(t0_line + '\n')


def create_cluster_spec():
edge_specs = os.getenv('tenant_edge_clusters_int')
tenant_edge_clusters = json.loads(edge_specs)

with open('cluster_spec', 'w') as cluster_output_file:
if len(tenant_edge_clusters) == 0:
return
cluster_spec = 'tenant_edge_clusters=['
for idx, edge_cluster in enumerate(tenant_edge_clusters):
cluster_spec += '\"{{groups[\'tenant_edge_cluster%s\']}}\",' % idx
cluster_output_file.write(cluster_spec[:-1] + ']\n')


def get_args():
parser = argparse.ArgumentParser(
description='Arguments for which resources to create')

parser.add_argument('-r', '--resource',
required=True,
default='edge_spec',
action='store')

args = parser.parse_args()
return args


def main():
args = get_args()
if args.resource == 'edge_spec':
create_tenant_edge_params()
elif args.resource == 't0_spec':
create_tenant_t0_params()
elif args.resource == 'cluster_spec':
create_cluster_spec()


if __name__ == '__main__':
main()
Loading

0 comments on commit be862bd

Please sign in to comment.