Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cloud foundry copy routes from one app to another

Cloud Foundry is it possible to copy missing routes from one app to another while doing blue green deployment?

I have an app with few manually added routes, while doing blue green deployment (automated through script) I want to copy missing/manually added routes into new app. Is it possible?

Script:

#!/bin/bash

path="C:/Users/.../Desktop/cf_through_sh/appName.jar"

spaceName="development"
appBlue="appName"
appGreen="${appName}-dev"
manifestFile="C:/Users/.../Desktop/cf_through_sh/manifest-dev.yml"
domains=("domain1.com" "domain2.com")
appHosts=("host-v1" "host-v2")

evaluate_return_code (){
  ret=$1
  if [[ $ret != 0 ]]
  then
    exit $ret
  fi
}

switch_to_target_space() {
    space="development"
    echo "Change space to ${space}"
    cf t -s ${space}
    evaluate_return_code $?
}

push_new_release() {
    appGreen=$1
    if [ ! -f "${manifestFile}" ]; then
        echo "Missing manifest: ${manifestFile}";
        exit 1;
    fi

    if [ ! -f "${path}" ]; then
        echo "Missing artifact: ${path}";
        exit 1;
    fi
    echo "Deploying ${path} as ${appGreen}"
    cf push ${appGreen} -f ${manifestFile} -p ${path} --no-route
    evaluate_return_code $?
}

map_routes() {
    app=$1
    domains=$2
    shift
    appHosts=$3

    for  host in  ${appHosts[*]}; do
        echo "Mapping ${host} to ${app}"
        for  domain in  ${domains[*]}; do
            cf map-route ${app} ${domain} -n ${host}
            evaluate_return_code $?
        done
    done
}


unmap_routes() {
    app=$1
    domains=$2
    shift
    appHosts=$3

    for  host in  ${appHosts[*]}; do
        echo "Unmapping ${host} from ${app}"
        for  domain in  ${domains[*]}; do
            cf unmap-route ${app} ${domain} -n ${host}
        evaluate_return_code $?
        done
    done
}

rename_app() {
    oldName=$1
    newName=$2
    echo "Renaming ${oldName} to ${newName}"
    cf rename ${oldName} ${newName}
    evaluate_return_code $?
}

switch_names() {
    appBlue=$1
    appGreen=$2
    appTemp="${appBlue}-old"
    rename_app ${appBlue} ${appTemp}
    rename_app ${appGreen} ${appBlue}
    rename_app ${appTemp} ${appGreen}
}

stop_old_release() {
    echo "Stopping old ${appGreen} app"
    cf stop ${appGreen}
    evaluate_return_code $?
}

switch_to_target_space ${spaceName}
push_new_release ${appGreen}
map_routes ${appGreen} ${domains[*]} ${appHosts[*]}
unmap_routes ${appBlue} ${domains[*]} ${appHosts[*]}
switch_names ${appBlue} ${appGreen}
stop_old_release

echo "DONE"
exit 0;

Eg: appblue has 5 roues

 1. host-v1.domain1.com
 2. host-v2.domain1.com
 3. host-v1.domain2.com
 4. host-v2.domain2.com
 5. manual-add.domain1.com //manually added route through admin UI

After blue green deployment through script app contains only 4 routes

 1. host-v1.domain1.com
 2. host-v2.domain1.com
 3. host-v1.domain2.com
 4. host-v2.domain2.com

How to copy missing 5th route? I don't want to pass host manual-add from script since it's added manually.

In general, is it possible to copy routes from one app to another if not mapped?

like image 917
Pratap A.K Avatar asked Aug 31 '18 10:08

Pratap A.K


People also ask

What is Gorouter in Cloud Foundry?

Gorouter. Routes HTTP traffic coming into Cloud Foundry to the appropriate component. Receives route updates through NATS. Routes that have not been updated in two minutes are pruned from the Gorouter's database.

What does CF push do?

The cf CLI command cf push pushes apps to Cloud Foundry. There are two main ways to run the cf push command: Run cf push APP-NAME to push an app the easiest way, using default settings.

How do I change the route in PCF?

You can map additional routes to an application that is deployed on Cloud Foundry with the cf map-route command. You can also unmap routes with the cf unmap-route command. If you want to change a route, you'd map the new route and unmap the old route.


1 Answers

This has to be done only through Jenkins (or any CI-CD tool). What we did in our case is, we had a CF-Manifest-Template.yml and CF-Manifest-settings.json and we had a gradle task that would apply the settings from JSON and fill the Manifest-temple and generate a cf-manifest-generated.yml

The gradle file will have a task that would do blue-green-deployment by using this generated manifest file and all the routes will be hard-coded in the manifest-file. This is the standard way of doing it.

But if you want to copy route from an App running in Cloud Foundry and copy thos routes to another-app, then you would need to write a REST Client that connects to Cloud Foundry CloudController and gets all the route of App-A and then creates routes to APP-B

It is pretty simple !!

Write a REST Client that executes this command

cf app APP-A

This will bring back the details of APP-A as a JSON Response. The response would have these parameters

Showing health and status for app APP-A in org Org-A / space DEV as [email protected]...

name:              APP-A
requested state:   started
instances:         1/1
usage:             1G x 1 instances
routes:            ********
last uploaded:     Sat 25 Aug 00:25:45 IST 2018
stack:             cflinuxfs2
buildpack:         java_buildpack

Read this JSON response and collect the Routes of APP-A and then have that mapped for APP-B .. Its pretty simple

like image 58
Arun Avatar answered Sep 30 '22 07:09

Arun