application-workloads/bosh/bosh-cf-crossregion/scripts/setup_env.py (164 lines of code) (raw):

#!/usr/bin/env python import json import netaddr import os import random import re import requests import sys from azure.storage.blob import AppendBlobService from azure.storage.table import TableService import azure.mgmt.network from azure.common.credentials import ServicePrincipalCredentials from azure.mgmt.network import NetworkManagementClient, NetworkManagementClientConfiguration def prepare_storage(settings): default_storage_account_name = settings["DEFAULT_STORAGE_ACCOUNT_NAME"] storage_access_key = settings["STORAGE_ACCESS_KEY"] endpoint_suffix = settings["SERVICE_HOST_BASE"] blob_service = AppendBlobService(account_name=default_storage_account_name, account_key=storage_access_key, endpoint_suffix=endpoint_suffix) blob_service.create_container('bosh') blob_service.create_container( container_name='stemcell', public_access='blob' ) # Prepare the table for storing meta datas of storage account and stemcells table_service = TableService(account_name=default_storage_account_name, account_key=storage_access_key, endpoint_suffix=endpoint_suffix) table_service.create_table('stemcells') # For secondary default_storage_account_name_secondary = settings["DEFAULT_STORAGE_ACCOUNT_NAME_SECONDARY"] default_storage_access_key_secondary = settings["DEFAULT_STORAGE_ACCESS_KEY_SECONDARY"] endpoint_suffix = settings["SERVICE_HOST_BASE"] blob_service = AppendBlobService(account_name=default_storage_account_name_secondary, account_key=default_storage_access_key_secondary, endpoint_suffix=endpoint_suffix) blob_service.create_container('bosh') blob_service.create_container( container_name='stemcell', public_access='blob' ) # Prepare the table for storing meta datas of storage account and stemcells table_service = TableService(account_name=default_storage_account_name_secondary, account_key=default_storage_access_key_secondary, endpoint_suffix=endpoint_suffix) table_service.create_table('stemcells') # Prepare primary premium storage account storage_account_name_primary = settings["STORAGE_ACCOUNT_NAME_PRIMARY"] storage_access_key_primary = settings["STORAGE_ACCESS_KEY_PRIMARY"] endpoint_suffix = settings["SERVICE_HOST_BASE"] blob_service = AppendBlobService(account_name=storage_account_name_primary, account_key=storage_access_key_primary, endpoint_suffix=endpoint_suffix) blob_service.create_container('bosh') blob_service.create_container('stemcell') # Prepare secondary premium storage account storage_account_name_secondary = settings["STORAGE_ACCOUNT_NAME_SECONDARY"] storage_access_key_secondary = settings["STORAGE_ACCESS_KEY_SECONDARY"] endpoint_suffix = settings["SERVICE_HOST_BASE"] blob_service = AppendBlobService(account_name=storage_account_name_secondary, account_key=storage_access_key_secondary, endpoint_suffix=endpoint_suffix) blob_service.create_container('bosh') blob_service.create_container('stemcell') def render_bosh_manifest(settings): with open('bosh.pub', 'r') as tmpfile: ssh_public_key = tmpfile.read() ip = netaddr.IPNetwork(settings['SUBNET_ADDRESS_RANGE_FOR_BOSH']) gateway_ip = str(ip[1]) bosh_director_ip = str(ip[4]) # Render the manifest for bosh-init bosh_template = 'bosh.yml' if os.path.exists(bosh_template): with open(bosh_template, 'r') as tmpfile: contents = tmpfile.read() keys = [ "SUBNET_ADDRESS_RANGE_FOR_BOSH", "VNET_NAME", "SUBNET_NAME_FOR_BOSH", "SUBSCRIPTION_ID", "DEFAULT_STORAGE_ACCOUNT_NAME", "RESOURCE_GROUP_NAME", "KEEP_UNREACHABLE_VMS", "TENANT_ID", "CLIENT_ID", "CLIENT_SECRET", "BOSH_PUBLIC_IP", "NSG_NAME_FOR_BOSH", "BOSH_RELEASE_URL", "BOSH_RELEASE_SHA1", "BOSH_AZURE_CPI_RELEASE_URL", "BOSH_AZURE_CPI_RELEASE_SHA1", "STEMCELL_URL", "STEMCELL_SHA1", "ENVIRONMENT" ] for k in keys: v = settings[k] contents = re.compile(re.escape("REPLACE_WITH_{0}".format(k))).sub(str(v), contents) contents = re.compile(re.escape("REPLACE_WITH_SSH_PUBLIC_KEY")).sub(ssh_public_key, contents) contents = re.compile(re.escape("REPLACE_WITH_GATEWAY_IP")).sub(gateway_ip, contents) contents = re.compile(re.escape("REPLACE_WITH_BOSH_DIRECTOR_IP")).sub(bosh_director_ip, contents) with open(bosh_template, 'w') as tmpfile: tmpfile.write(contents) return bosh_director_ip def get_cloud_foundry_configuration(scenario, settings): config = {} for key in ["SUBNET_ADDRESS_RANGE_FOR_CLOUD_FOUNDRY", "VNET_NAME", "VNET_NAME_SECONDARY", "SUBNET_NAME_FOR_CLOUD_FOUNDRY", "CLOUD_FOUNDRY_PUBLIC_IP", "NSG_NAME_FOR_CLOUD_FOUNDRY"]: config[key] = settings[key] with open('cloudfoundry.cert', 'r') as tmpfile: ssl_cert = tmpfile.read() with open('cloudfoundry.key', 'r') as tmpfile: ssl_key = tmpfile.read() ssl_cert_and_key = "{0}{1}".format(ssl_cert, ssl_key) indentation = " " * 8 ssl_cert_and_key = ("\n"+indentation).join([line for line in ssl_cert_and_key.split('\n')]) config["SSL_CERT_AND_KEY"] = ssl_cert_and_key ip = netaddr.IPNetwork(settings['SUBNET_ADDRESS_RANGE_FOR_CLOUD_FOUNDRY']) config["GATEWAY_IP"] = str(ip[1]) config["RESERVED_IP_FROM"] = str(ip[2]) config["RESERVED_IP_TO"] = str(ip[3]) config["CLOUD_FOUNDRY_INTERNAL_IP"] = str(ip[4]) # config["SYSTEM_DOMAIN"] = "{0}.xip.io".format(settings["CLOUD_FOUNDRY_PUBLIC_IP"]) # Get and replace SYSTEM_DOMAIN from parameter json, e.g custom domain that is mapped to Traffic Manager config["SYSTEM_DOMAIN"] = settings["CUSTOM_SYSTEM_DOMAIN"] # Get and replace for REPLACE_WITH_EXTERNAL_DATABASE_ENDPOINT from parameter json, e.g dxmariadblb.northeurope.cloudapp.azure.com config["EXTERNAL_DATABASE_ENDPOINT"] = settings["EXTERNAL_DATABASE_ENDPOINT"] # Get and replace REPLACE_WITH_EXTERNAL_NFS_ENDPOINT with external NFS cluster from parameter json config["EXTERNAL_NFS_ENDPOINT"] = settings["EXTERNAL_NFS_ENDPOINT"] # Get and replace REPLACE_WITH_STORAGE_ACCOUNT_NAME_SECONDARY config["STORAGE_ACCOUNT_NAME_SECONDARY"] = settings["STORAGE_ACCOUNT_NAME_SECONDARY"] # Get and replace REPLACE_WITH_CLOUD_FOUNDRY_PUBLIC_IP_SECONDARY config["CLOUD_FOUNDRY_PUBLIC_IP_SECONDARY"] = settings["CLOUD_FOUNDRY_PUBLIC_IP_SECONDARY"] # Get and replace parameters related to storage account config["STORAGE_ACCOUNT_NAME_PRIMARY"] = settings["STORAGE_ACCOUNT_NAME_PRIMARY"] config["STORAGE_ACCOUNT_NAME_SECONDARY"] = settings["STORAGE_ACCOUNT_NAME_SECONDARY"] config["STATIC_IP_FROM"] = str(ip[4]) config["STATIC_IP_TO"] = str(ip[100]) config["HAPROXY_IP"] = str(ip[4]) config["POSTGRES_IP"] = str(ip[11]) config["ROUTER_IP"] = str(ip[12]) config["NATS_IP"] = str(ip[13]) config["ETCD_IP"] = str(ip[14]) config["NFS_IP"] = str(ip[15]) config["CONSUL_IP"] = str(ip[16]) return config def render_cloud_foundry_manifest(settings): for scenario in ["cross"]: cloudfoundry_template = "{0}.yml".format(scenario) if os.path.exists(cloudfoundry_template): with open(cloudfoundry_template, 'r') as tmpfile: contents = tmpfile.read() config = get_cloud_foundry_configuration(scenario, settings) for key in config: value = config[key] contents = re.compile(re.escape("REPLACE_WITH_{0}".format(key))).sub(value, contents) with open(cloudfoundry_template, 'w') as tmpfile: tmpfile.write(contents) def render_cloud_foundry_deployment_cmd(settings): cloudfoundry_deployment_cmd = "deploy_cloudfoundry.sh" if os.path.exists(cloudfoundry_deployment_cmd): with open(cloudfoundry_deployment_cmd, 'r') as tmpfile: contents = tmpfile.read() keys = ["CF_RELEASE_URL", "STEMCELL_URL"] for key in keys: value = settings[key] contents = re.compile(re.escape("REPLACE_WITH_{0}".format(key))).sub(value, contents) with open(cloudfoundry_deployment_cmd, 'w') as tmpfile: tmpfile.write(contents) def get_settings(): settings = dict() config_file = sys.argv[4] with open(config_file) as f: settings = json.load(f)["runtimeSettings"][0]["handlerSettings"]["publicSettings"] settings['TENANT_ID'] = sys.argv[1] settings['CLIENT_ID'] = sys.argv[2] settings['CLIENT_SECRET'] = sys.argv[3] return settings def main(): settings = get_settings() with open('settings', "w") as tmpfile: tmpfile.write(json.dumps(settings, indent=4, sort_keys=True)) prepare_storage(settings) bosh_director_ip = render_bosh_manifest(settings) print bosh_director_ip render_cloud_foundry_manifest(settings) render_cloud_foundry_deployment_cmd(settings) if __name__ == "__main__": main()