pcf_blue_green 0.38 → 0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pcf_blue_green/version.rb +1 -1
- data/lib/pcf_blue_green.rb +102 -30
- data/lib/shared-deploy-functions.sh +8 -66
- data/spec/mocks/routes_stdout.json +43 -0
- data/spec/mocks/simple_entity.json +16 -0
- data/spec/pcf_blue_green_spec.rb +41 -138
- metadata +4 -3
- data/spec/mocks/simple_routes.txt +0 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ce9a0ff7f133579929ed18fe91e3a65268e3636e
|
|
4
|
+
data.tar.gz: 5278c466264ea93c6b5109abb631ff43dcffacee
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0822749fe7e78ecb9aba92babd9fa3924af5a4238fdf4932708e3366f9688a72af996912beb37e0d2643ad63cc7749179b9a397f4dff07291b2046e8d9c14a71
|
|
7
|
+
data.tar.gz: 6f36118d59fa0b4705661a263965e139b93f6da3a63db82f3bbd2d1f752ab08aa02465db0db556a082f8d6edf7f558ed70b2a20723d584cc0ab983cea114d13a
|
data/lib/pcf_blue_green.rb
CHANGED
|
@@ -4,13 +4,9 @@ require 'shellwords'
|
|
|
4
4
|
require "json"
|
|
5
5
|
|
|
6
6
|
module PcfBlueGreen
|
|
7
|
-
class
|
|
7
|
+
class BlueGreenDeploymentFailed < StandardError
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
class CleanupBlueFailed < StandardError
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
|
|
14
10
|
class Routing
|
|
15
11
|
|
|
16
12
|
def initialize(url, user, pass, org, space, call_login = false, opts = {})
|
|
@@ -33,43 +29,115 @@ module PcfBlueGreen
|
|
|
33
29
|
def cleanup_blue
|
|
34
30
|
remap_routes
|
|
35
31
|
status = bash("#{@source_cmd} && remove-blue")
|
|
36
|
-
raise PcfBlueGreen::
|
|
32
|
+
raise PcfBlueGreen::BlueGreenDeploymentFailed unless status
|
|
33
|
+
remove_routes
|
|
37
34
|
bash("#{@source_cmd} && announce-success")
|
|
38
35
|
end
|
|
39
36
|
|
|
37
|
+
def remove_routes
|
|
38
|
+
removed_routes = []
|
|
39
|
+
if entity = entity_for(ENV['green'])
|
|
40
|
+
routes_stdout(entity)['resources'].each do |resource|
|
|
41
|
+
domain_url = resource['entity']['domain_url']
|
|
42
|
+
domain = domain_for(domain_url)
|
|
43
|
+
if resource['entity']['path'].empty?
|
|
44
|
+
cmd = "#{delete_route_command} #{domain} -n #{resource['entity']['host']} -f"
|
|
45
|
+
else
|
|
46
|
+
cmd = "#{delete_route_command} #{domain} -n #{resource['entity']['host']} --path #{resource['entity']['path']} -f"
|
|
47
|
+
end
|
|
48
|
+
puts cmd
|
|
49
|
+
shell = Mixlib::ShellOut.new(cmd)
|
|
50
|
+
shell.run_command
|
|
51
|
+
removed_routes += shell.stdout.split("\n")
|
|
52
|
+
|
|
53
|
+
unless shell.stderr.empty?
|
|
54
|
+
puts shell.stderr
|
|
55
|
+
raise PcfBlueGreen::BlueGreenDeploymentFailed
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
puts "Removed routes: #{removed_routes.uniq.join(', ')} "
|
|
60
|
+
removed_routes.uniq.join(",\n")
|
|
61
|
+
end
|
|
62
|
+
|
|
40
63
|
def remap_routes
|
|
41
64
|
puts "Remapping routes..."
|
|
42
65
|
puts "cf_app is #{ENV['cf_app']}"
|
|
43
66
|
puts "green is #{ENV['green']}"
|
|
44
|
-
|
|
45
67
|
mapped_routes = []
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
68
|
+
if entity = entity_for(ENV['cf_app'])
|
|
69
|
+
routes_stdout(entity)['resources'].each do |resource|
|
|
70
|
+
domain_url = resource['entity']['domain_url']
|
|
71
|
+
domain = domain_for(domain_url)
|
|
72
|
+
if resource['entity']['path'].empty?
|
|
73
|
+
cmd = "#{map_route_command} #{ENV['green']} #{domain} -n #{resource['entity']['host']}"
|
|
74
|
+
else
|
|
75
|
+
cmd = "#{map_route_command} #{ENV['green']} #{domain} -n #{resource['entity']['host']} --path #{resource['entity']['path']}"
|
|
76
|
+
end
|
|
77
|
+
puts cmd
|
|
78
|
+
shell = Mixlib::ShellOut.new(cmd)
|
|
79
|
+
shell.run_command
|
|
80
|
+
mapped_routes += shell.stdout.split("\n")
|
|
81
|
+
unless shell.stderr.empty?
|
|
82
|
+
puts shell.stderr
|
|
83
|
+
raise PcfBlueGreen::BlueGreenDeploymentFailed
|
|
84
|
+
end
|
|
55
85
|
end
|
|
56
|
-
mapped_routes += shell.stdout.split("\n")
|
|
57
|
-
end
|
|
58
|
-
cmd = "#{cf_routes_output} | tail -n +4 | awk '($4==ENVIRON[\"cf_app\"]) {print $3\" -n \" $2}' | xargs -n 3 #{map_route_command} #{ENV['green']}"
|
|
59
|
-
puts cmd
|
|
60
|
-
shell = Mixlib::ShellOut.new(cmd)
|
|
61
|
-
shell.run_command
|
|
62
|
-
unless shell.stderr.empty?
|
|
63
|
-
puts shell.stderr
|
|
64
|
-
raise PcfBlueGreen::CleanupBlueFailed
|
|
65
86
|
end
|
|
66
|
-
mapped_routes += shell.stdout.split("\n")
|
|
67
87
|
puts "Mappped routes: #{mapped_routes.uniq.join(', ')} "
|
|
68
88
|
mapped_routes.uniq.join(",\n")
|
|
69
89
|
end
|
|
70
90
|
|
|
71
91
|
private
|
|
72
92
|
|
|
93
|
+
def entity_for(app_name)
|
|
94
|
+
app_data_cmd = "cf curl \"/v2/apps\" -X GET -H \"Content-Type: application/x-www-form-urlencoded\" -d 'q=name:#{app_name}'"
|
|
95
|
+
app_data_shell = Mixlib::ShellOut.new(app_data_cmd)
|
|
96
|
+
app_data_shell.run_command
|
|
97
|
+
app_stdout = JSON.parse(app_data_shell.stdout)
|
|
98
|
+
app_stdout['resources'].each do |resource|
|
|
99
|
+
if resource['entity']['name'] == app_name && resource['entity']['space_guid'] == fetch_space_guid
|
|
100
|
+
@entity = resource['entity']
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
unless app_data_shell.stderr.empty?
|
|
105
|
+
puts app_data_shell.stderr
|
|
106
|
+
raise PcfBlueGreen::BlueGreenDeploymentFailed
|
|
107
|
+
end
|
|
108
|
+
@entity
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def routes_stdout(entity)
|
|
112
|
+
routes_url = entity['routes_url']
|
|
113
|
+
app_routes_cmd = "cf curl #{routes_url}"
|
|
114
|
+
app_routes_shell = Mixlib::ShellOut.new(app_routes_cmd)
|
|
115
|
+
app_routes_shell.run_command
|
|
116
|
+
JSON.parse(app_routes_shell.stdout)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def domain_for(domain_url)
|
|
120
|
+
app_domain_cmd = "cf curl #{domain_url}"
|
|
121
|
+
app_domain_shell = Mixlib::ShellOut.new(app_domain_cmd)
|
|
122
|
+
app_domain_shell.run_command
|
|
123
|
+
domain_stdout = JSON.parse(app_domain_shell.stdout)
|
|
124
|
+
domain_stdout['entity']['name']
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def fetch_space_guid
|
|
128
|
+
command = 'cf curl /v2/spaces'
|
|
129
|
+
shell = Mixlib::ShellOut.new(command)
|
|
130
|
+
shell.run_command
|
|
131
|
+
space_guid = nil
|
|
132
|
+
raise Csaa::Pcf::Unauthorized unless space_guid_json(shell.stdout)['resources']
|
|
133
|
+
space_guid_json(shell.stdout)['resources'].each do |resource|
|
|
134
|
+
if resource['entity']['name'] == @space
|
|
135
|
+
space_guid = resource['metadata']['guid']
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
space_guid
|
|
139
|
+
end
|
|
140
|
+
|
|
73
141
|
def login
|
|
74
142
|
puts "Logging in to #{@url}"
|
|
75
143
|
cf_login = "cf login -a #{@url} -u #{@user} -p '#{@pass}' -o #{@org} -s #{@space} #{@login_options} > /dev/null"
|
|
@@ -78,8 +146,8 @@ module PcfBlueGreen
|
|
|
78
146
|
shell.run_command
|
|
79
147
|
end
|
|
80
148
|
|
|
81
|
-
def
|
|
82
|
-
"cf
|
|
149
|
+
def delete_route_command
|
|
150
|
+
"cf delete-route"
|
|
83
151
|
# cmd = "cf routes"
|
|
84
152
|
# shell = Mixlib::ShellOut.new(cmd)
|
|
85
153
|
# shell.run_command
|
|
@@ -90,6 +158,7 @@ module PcfBlueGreen
|
|
|
90
158
|
"cf map-route"
|
|
91
159
|
end
|
|
92
160
|
|
|
161
|
+
|
|
93
162
|
def bash(command)
|
|
94
163
|
escaped_command = Shellwords.escape(command)
|
|
95
164
|
system "bash -c #{escaped_command}"
|
|
@@ -109,7 +178,7 @@ module PcfBlueGreen
|
|
|
109
178
|
|
|
110
179
|
def blue_green_deploy
|
|
111
180
|
status = bash("#{@source_cmd} && blue-green")
|
|
112
|
-
raise PcfBlueGreen::
|
|
181
|
+
raise PcfBlueGreen::BlueGreenDeploymentFailed unless status
|
|
113
182
|
end
|
|
114
183
|
|
|
115
184
|
def env_var_manifest_update
|
|
@@ -140,7 +209,10 @@ module PcfBlueGreen
|
|
|
140
209
|
def bash(command)
|
|
141
210
|
escaped_command = Shellwords.escape(command)
|
|
142
211
|
system "bash -c #{escaped_command}"
|
|
143
|
-
|
|
212
|
+
end
|
|
144
213
|
|
|
214
|
+
def space_guid_json(stdout)
|
|
215
|
+
JSON.parse(stdout)
|
|
216
|
+
end
|
|
145
217
|
end
|
|
146
218
|
end
|
|
@@ -69,32 +69,18 @@ function cf-push {
|
|
|
69
69
|
function check-health {
|
|
70
70
|
local app_url=$1
|
|
71
71
|
announce-task "Checking health"
|
|
72
|
-
|
|
73
|
-
echo "
|
|
74
|
-
if
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if [ ${arrkv[1]} == true ] ; then
|
|
79
|
-
status=$(curl -sSIL -X GET -o /dev/null -w "%{http_code}" ${app_url} --insecure)
|
|
80
|
-
if [ $status == 503 ] ; then
|
|
81
|
-
echo -e "${BGre}curl of ${app_url} 503 OK"
|
|
82
|
-
else
|
|
83
|
-
echo ERROR: Expecting 503 status
|
|
84
|
-
exit 1
|
|
85
|
-
fi
|
|
72
|
+
maitenance_enabled=$(echo $(cf curl '/v2/apps' -X GET -H 'Content-Type: application/x-www-form-urlencoded' -d "q=name:$cf_app" | jq '.resources[0].entity.environment_json.MAINTENANCE_ENABLED'))
|
|
73
|
+
maitenance_enabled=$(echo ${maitenance_enabled//\"} | awk '{ print tolower($1) }')
|
|
74
|
+
if [ $maitenance_enabled == "true" ] ; then
|
|
75
|
+
status=$(curl -sSIL --header "x-digital-auth: ${JWT}" -X GET -o /dev/null -w "%{http_code}" ${app_url} --insecure)
|
|
76
|
+
if [ $status == 503 ] ; then
|
|
77
|
+
echo -e "${BGre}curl of ${app_url} 503 OK"
|
|
86
78
|
else
|
|
87
|
-
|
|
88
|
-
status=$(curl -sSIL --header "x-digital-auth: ${JWT}" -X GET -o /dev/null -w "%{http_code}" ${app_url} --insecure)
|
|
89
|
-
if [ $status == 200 ] ; then
|
|
90
|
-
echo -e "${BGre}curl of ${app_url} 200 OK"
|
|
91
|
-
else
|
|
92
|
-
echo -e "${BGre}curl of ${app_url} ${status} ERR"
|
|
79
|
+
echo ERROR: Expecting 503 status
|
|
93
80
|
exit 1
|
|
94
|
-
fi
|
|
95
81
|
fi
|
|
96
82
|
else
|
|
97
|
-
curl -fsSIL
|
|
83
|
+
curl -fsSIL --header "x-digital-auth: ${JWT}" --user "${BASIC_AUTH_USERNAME}:${BASIC_AUTH_PASSWORD}" ${app_url} --insecure
|
|
98
84
|
status=$(curl -sSIL --header "x-digital-auth: ${JWT}" -X GET -o /dev/null -w "%{http_code}" ${app_url} --insecure)
|
|
99
85
|
if [ $status == 200 ] ; then
|
|
100
86
|
echo -e "${BGre}curl of ${app_url} 200 OK"
|
|
@@ -125,53 +111,9 @@ function generate-manifest {
|
|
|
125
111
|
fi
|
|
126
112
|
}
|
|
127
113
|
|
|
128
|
-
function remap-routes {
|
|
129
|
-
announce-task "Remapping routes..."
|
|
130
|
-
echo "cf_app is ${cf_app}"
|
|
131
|
-
echo "green is ${green}"
|
|
132
|
-
set -x
|
|
133
|
-
run-cmd cf routes
|
|
134
|
-
|
|
135
|
-
# Variables used:
|
|
136
|
-
|
|
137
|
-
# Some applications have extra routes that contain paths. If that's the case
|
|
138
|
-
# then handle_all_paths environmental variable is used to manage paths.
|
|
139
|
-
# to a different hostname
|
|
140
|
-
|
|
141
|
-
# Code logic:
|
|
142
|
-
|
|
143
|
-
# execute the code below:
|
|
144
|
-
if [ -z ${handle_all_paths+x} ]; then
|
|
145
|
-
run-cmd cf routes | tail -n +4 | grep ${cf_app} | awk '{print $3" -n "$2}'
|
|
146
|
-
cf routes | tail -n +4 | grep ${cf_app} | awk '{print $3" -n "$2}' | xargs -n 3 cf map-route ${green}
|
|
147
|
-
fi
|
|
148
|
-
|
|
149
|
-
# if map_main_route environmental variable is set then the main route gets mapped:
|
|
150
|
-
if [ -n "$map_main_route" ]; then
|
|
151
|
-
run-cmd cf routes | awk '($4==ENVIRON["cf_app"]) {print $3" -n " $2 }' | xargs -n 3 cf map-route ${green}
|
|
152
|
-
fi
|
|
153
|
-
|
|
154
|
-
# if handle_all_paths variable is set then
|
|
155
|
-
# 1. routes that's app name is cf_app are found
|
|
156
|
-
# 2. paths are mapped to the green app
|
|
157
|
-
if [ -n "$handle_all_paths" ]; then
|
|
158
|
-
run-cmd cf routes | tail -n +4 | awk '($5==ENVIRON["cf_app"]) {print $3" -n "$2 " --path "substr($4,2) }'
|
|
159
|
-
cf routes | tail -n +4 | awk '($5==ENVIRON["cf_app"]) {print $3" -n "$2 " --path "substr($4,2) }' | xargs -n 5 cf map-route ${green}
|
|
160
|
-
fi
|
|
161
|
-
set +x
|
|
162
|
-
}
|
|
163
|
-
|
|
164
114
|
function remove-blue {
|
|
165
115
|
run-cmd cf delete ${blue} -f
|
|
166
116
|
run-cmd cf rename $green $blue
|
|
167
|
-
run-cmd cf routes | awk '($2==ENVIRON["green"]) {print $3" -n " $2 " -f"}' | xargs -n 4 cf delete-route
|
|
168
|
-
|
|
169
|
-
if [ -n "$handle_all_paths" ]; then
|
|
170
|
-
set -x
|
|
171
|
-
run-cmd cf routes | tail -n +4 | awk '($2==ENVIRON["green"]) {print $3" -n "$2 " --path "substr($4,2)" -f"}' | xargs -n 6
|
|
172
|
-
cf routes | tail -n +4 | awk '($2==ENVIRON["green"]) {print $3" -n "$2 " --path "substr($4,2)" -f"}' | xargs -n 6 cf delete-route
|
|
173
|
-
set +x
|
|
174
|
-
fi
|
|
175
117
|
}
|
|
176
118
|
|
|
177
119
|
function get-domain {
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"resources": [
|
|
3
|
+
{
|
|
4
|
+
"metadata": {
|
|
5
|
+
"guid": "ddbc3214-eg68-44ed-836a-a2defae75547",
|
|
6
|
+
"url": "/v2/routes/XXXXXXXXXXXXXXXXXXXX",
|
|
7
|
+
"created_at": "2017-02-08T16:28:08Z",
|
|
8
|
+
"updated_at": null
|
|
9
|
+
},
|
|
10
|
+
"entity": {
|
|
11
|
+
"host": "app-prod",
|
|
12
|
+
"path": "",
|
|
13
|
+
"domain_url": "/v2/shared_domains/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"metadata": {
|
|
18
|
+
"guid": "ddsc3214-eg38-44ed-836a-a2defae75547",
|
|
19
|
+
"url": "/v2/routes/XXXXXXXXXXXXXXXXXXXX",
|
|
20
|
+
"created_at": "2017-02-08T16:28:08Z",
|
|
21
|
+
"updated_at": null
|
|
22
|
+
},
|
|
23
|
+
"entity": {
|
|
24
|
+
"host": "app-prod",
|
|
25
|
+
"path": "/some_path",
|
|
26
|
+
"domain_url": "/v2/shared_domains/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"metadata": {
|
|
31
|
+
"guid": "dd3c3214-eg68-44ed-836a-a2defae74547",
|
|
32
|
+
"url": "/v2/routes/XXXXXXXXXXXXXXXXXXXX",
|
|
33
|
+
"created_at": "2017-02-08T16:28:08Z",
|
|
34
|
+
"updated_at": null
|
|
35
|
+
},
|
|
36
|
+
"entity": {
|
|
37
|
+
"host": "app-prod",
|
|
38
|
+
"path": "/other_domain_path",
|
|
39
|
+
"domain_url": "/v2/shared_domains/YYYYYYYYYYYYYYYYYYYYYYYYYYYY"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "app-prod",
|
|
3
|
+
"production": false,
|
|
4
|
+
"detected_buildpack_guid": null,
|
|
5
|
+
"environment_json": {
|
|
6
|
+
},
|
|
7
|
+
"ports": [
|
|
8
|
+
8080
|
|
9
|
+
],
|
|
10
|
+
"space_url": "/v2/spaces/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
11
|
+
"stack_url": "/v2/stacks/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
|
|
12
|
+
"routes_url": "/v2/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/routes",
|
|
13
|
+
"events_url": "/v2/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/events",
|
|
14
|
+
"service_bindings_url": "/v2/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/service_bindings",
|
|
15
|
+
"route_mappings_url": "/v2/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/route_mappings"
|
|
16
|
+
}
|
data/spec/pcf_blue_green_spec.rb
CHANGED
|
@@ -5,11 +5,42 @@ describe PcfBlueGreen do
|
|
|
5
5
|
expect(PcfBlueGreen::VERSION).not_to be nil
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
describe "blue green deploy
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
describe "blue green deploy remap_routes" do
|
|
9
|
+
it 're-maps routes correctly for an application' do
|
|
10
|
+
expected_routes = %{simpleapp-app-space-green app.domain.com -n app-prod,
|
|
11
|
+
simpleapp-app-space-green app.domain.com -n app-prod --path /some_path,
|
|
12
|
+
simpleapp-app-space-green app.domain.com -n app-prod --path /other_domain_path}
|
|
13
|
+
|
|
14
|
+
ENV['APP_SPACE'] = 'app-space'
|
|
15
|
+
ENV['APP_NAME'] = 'simpleapp'
|
|
16
|
+
ENV['cf_app'] = 'simpleapp'
|
|
17
|
+
ENV['cf_api'] = 'https://api.sys.sandbox.test.com'
|
|
18
|
+
ENV['cf_user'] = 'testuser'
|
|
19
|
+
ENV['cf_password'] = 'password'
|
|
20
|
+
ENV['cf_org'] = 'ds'
|
|
21
|
+
ENV['green'] = 'simpleapp-app-space-green'
|
|
11
22
|
|
|
12
|
-
|
|
23
|
+
space = ENV['APP_SPACE']
|
|
24
|
+
api_url = ENV['cf_api']
|
|
25
|
+
username = ENV['cf_user']
|
|
26
|
+
password = ENV['cf_password']
|
|
27
|
+
org = ENV['cf_org']
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
31
|
+
@pcf_blue_green.stub(:entity_for).and_return(JSON.parse(File.read('spec/mocks/simple_entity.json')))
|
|
32
|
+
@pcf_blue_green.stub(:routes_stdout).and_return(JSON.parse(File.read('spec/mocks/routes_stdout.json')))
|
|
33
|
+
@pcf_blue_green.stub(:domain_for).and_return("app.domain.com")
|
|
34
|
+
@pcf_blue_green.stub(:map_route_command).and_return('echo')
|
|
35
|
+
|
|
36
|
+
expect(expected_routes).to eq(@pcf_blue_green.remap_routes)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
describe "blue green deploy remove_routes" do
|
|
40
|
+
it 'removes routes correctly for an application' do
|
|
41
|
+
expected_routes = %{app.domain.com -n app-prod -f,
|
|
42
|
+
app.domain.com -n app-prod --path /some_path -f,
|
|
43
|
+
app.domain.com -n app-prod --path /other_domain_path -f}
|
|
13
44
|
|
|
14
45
|
ENV['APP_SPACE'] = 'app-space'
|
|
15
46
|
ENV['APP_NAME'] = 'simpleapp'
|
|
@@ -21,7 +52,6 @@ describe PcfBlueGreen do
|
|
|
21
52
|
ENV['green'] = 'simpleapp-app-space-green'
|
|
22
53
|
|
|
23
54
|
space = ENV['APP_SPACE']
|
|
24
|
-
app = ENV['APP_NAME']
|
|
25
55
|
api_url = ENV['cf_api']
|
|
26
56
|
username = ENV['cf_user']
|
|
27
57
|
password = ENV['cf_password']
|
|
@@ -29,139 +59,12 @@ describe PcfBlueGreen do
|
|
|
29
59
|
|
|
30
60
|
|
|
31
61
|
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
32
|
-
@pcf_blue_green.stub(:
|
|
33
|
-
@pcf_blue_green.stub(:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
it "it doesn't re-map routes with a path. Also doesn't re-map routes for other applications. Even with the same hostname" do
|
|
38
|
-
|
|
39
|
-
expected_routes = %{customapp-app-space-green apps.prod.domain.com -n customapp,
|
|
40
|
-
customapp-app-space-green apps.prod.domain.com -n otherapp}
|
|
62
|
+
@pcf_blue_green.stub(:entity_for).and_return(JSON.parse(File.read('spec/mocks/simple_entity.json')))
|
|
63
|
+
@pcf_blue_green.stub(:routes_stdout).and_return(JSON.parse(File.read('spec/mocks/routes_stdout.json')))
|
|
64
|
+
@pcf_blue_green.stub(:domain_for).and_return("app.domain.com")
|
|
65
|
+
@pcf_blue_green.stub(:delete_route_command).and_return('echo')
|
|
41
66
|
|
|
42
|
-
|
|
43
|
-
ENV['APP_SPACE'] = 'app-space'
|
|
44
|
-
ENV['APP_NAME'] = 'customapp'
|
|
45
|
-
ENV['cf_app'] = 'customapp'
|
|
46
|
-
ENV['cf_api'] = 'https://api.sys.sandbox.test.com'
|
|
47
|
-
ENV['cf_user'] = 'testuser'
|
|
48
|
-
ENV['cf_password'] = 'password'
|
|
49
|
-
ENV['cf_org'] = 'ds'
|
|
50
|
-
ENV['green'] = 'customapp-app-space-green'
|
|
51
|
-
|
|
52
|
-
space = ENV['APP_SPACE']
|
|
53
|
-
app = ENV['APP_NAME']
|
|
54
|
-
api_url = ENV['cf_api']
|
|
55
|
-
username = ENV['cf_user']
|
|
56
|
-
password = ENV['cf_password']
|
|
57
|
-
org = ENV['cf_org']
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
61
|
-
@pcf_blue_green.stub(:cf_routes_output).and_return('cat spec/mocks/custom_routes.txt')
|
|
62
|
-
@pcf_blue_green.stub(:map_route_command).and_return('echo')
|
|
63
|
-
expect(expected_routes).to eq(@pcf_blue_green.remap_routes)
|
|
67
|
+
expect(expected_routes).to eq(@pcf_blue_green.remove_routes)
|
|
64
68
|
end
|
|
65
69
|
end
|
|
66
|
-
|
|
67
|
-
context 'handle_all_paths' do
|
|
68
|
-
it "re-maps the application routes including paths and custom domains" do
|
|
69
|
-
|
|
70
|
-
expected_routes = %{customapp-app-space-green apps.prod.domain.com -n customapp --path somepath1,
|
|
71
|
-
customapp-app-space-green apps.prod.domain.com -n otherapp --path somepath2,
|
|
72
|
-
customapp-app-space-green apps.prod.domain.com -n otherapp --path somepath3,
|
|
73
|
-
customapp-app-space-green apps.prod.domain.com -n customapp,
|
|
74
|
-
customapp-app-space-green apps.prod.domain.com -n otherapp}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
ENV['APP_SPACE'] = 'app-space'
|
|
78
|
-
ENV['APP_NAME'] = 'customapp'
|
|
79
|
-
ENV['cf_app'] = 'customapp'
|
|
80
|
-
ENV['cf_api'] = 'https://api.sys.sandbox.test.com'
|
|
81
|
-
ENV['cf_user'] = 'testuser'
|
|
82
|
-
ENV['cf_password'] = 'password'
|
|
83
|
-
ENV['cf_org'] = 'ds'
|
|
84
|
-
ENV['green'] = 'customapp-app-space-green'
|
|
85
|
-
ENV['handle_all_paths'] = 'true'
|
|
86
|
-
|
|
87
|
-
space = ENV['APP_SPACE']
|
|
88
|
-
app = ENV['APP_NAME']
|
|
89
|
-
api_url = ENV['cf_api']
|
|
90
|
-
username = ENV['cf_user']
|
|
91
|
-
password = ENV['cf_password']
|
|
92
|
-
org = ENV['cf_org']
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
96
|
-
@pcf_blue_green.stub(:cf_routes_output).and_return('cat spec/mocks/custom_routes.txt')
|
|
97
|
-
@pcf_blue_green.stub(:map_route_command).and_return('echo')
|
|
98
|
-
expect(expected_routes).to eq(@pcf_blue_green.remap_routes)
|
|
99
|
-
end
|
|
100
|
-
it "re-maps application routes including paths" do
|
|
101
|
-
|
|
102
|
-
expected_routes = %{second-app-app-space-green apps.prod.domain.com.com -n third-app --path firstapp-path1,
|
|
103
|
-
second-app-app-space-green apps.prod.domain.com.com -n third-app --path firstapp-path2,
|
|
104
|
-
second-app-app-space-green apps.prod.domain.com.com -n third-app --path firstapp-path3,
|
|
105
|
-
second-app-app-space-green apps.prod.domain.com.com -n third-app --path firstapp-path4,
|
|
106
|
-
second-app-app-space-green apps.prod.domain.com.com -n third-app --path firstapp-path5,
|
|
107
|
-
second-app-app-space-green apps.prod.domain.com.com -n third-app --path secondapp-path,
|
|
108
|
-
second-app-app-space-green apps.prod.domain.com.com -n second-app}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
ENV['APP_SPACE'] = 'app-space'
|
|
112
|
-
ENV['APP_NAME'] = 'second-app'
|
|
113
|
-
ENV['cf_app'] = 'second-app'
|
|
114
|
-
ENV['cf_api'] = 'https://api.sys.sandbox.test.com'
|
|
115
|
-
ENV['cf_user'] = 'testuser'
|
|
116
|
-
ENV['cf_password'] = 'password'
|
|
117
|
-
ENV['cf_org'] = 'ds'
|
|
118
|
-
ENV['green'] = 'second-app-app-space-green'
|
|
119
|
-
ENV['handle_all_paths'] = 'true'
|
|
120
|
-
|
|
121
|
-
space = ENV['APP_SPACE']
|
|
122
|
-
app = ENV['APP_NAME']
|
|
123
|
-
api_url = ENV['cf_api']
|
|
124
|
-
username = ENV['cf_user']
|
|
125
|
-
password = ENV['cf_password']
|
|
126
|
-
org = ENV['cf_org']
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
130
|
-
@pcf_blue_green.stub(:cf_routes_output).and_return('cat spec/mocks/custom_routes_domain_host.txt')
|
|
131
|
-
@pcf_blue_green.stub(:map_route_command).and_return('echo')
|
|
132
|
-
expect(expected_routes).to eq(@pcf_blue_green.remap_routes)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it "re-maps application routes including paths. Also true for custom domain and host" do
|
|
136
|
-
|
|
137
|
-
expected_routes = %{third-app-app-space-green apps.prod.domain.com.com -n third-app,
|
|
138
|
-
third-app-app-space-green apps.prod.otherdomain.com -n third-app,
|
|
139
|
-
third-app-app-space-green apps.prod.otherdomain.com -n third-app-other-host}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
ENV['APP_SPACE'] = 'app-space'
|
|
143
|
-
ENV['APP_NAME'] = 'third-app'
|
|
144
|
-
ENV['cf_app'] = 'third-app'
|
|
145
|
-
ENV['cf_api'] = 'https://api.sys.sandbox.test.com'
|
|
146
|
-
ENV['cf_user'] = 'testuser'
|
|
147
|
-
ENV['cf_password'] = 'password'
|
|
148
|
-
ENV['cf_org'] = 'ds'
|
|
149
|
-
ENV['green'] = 'third-app-app-space-green'
|
|
150
|
-
ENV['handle_all_paths'] = 'true'
|
|
151
|
-
|
|
152
|
-
space = ENV['APP_SPACE']
|
|
153
|
-
app = ENV['APP_NAME']
|
|
154
|
-
api_url = ENV['cf_api']
|
|
155
|
-
username = ENV['cf_user']
|
|
156
|
-
password = ENV['cf_password']
|
|
157
|
-
org = ENV['cf_org']
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
@pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
|
|
161
|
-
@pcf_blue_green.stub(:cf_routes_output).and_return('cat spec/mocks/custom_routes_domain_host.txt')
|
|
162
|
-
@pcf_blue_green.stub(:map_route_command).and_return('echo')
|
|
163
|
-
expect(expected_routes).to eq(@pcf_blue_green.remap_routes)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
70
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pcf_blue_green
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '0.
|
|
4
|
+
version: '0.41'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pawel Bardzinski
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-07-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mixlib-shellout
|
|
@@ -108,7 +108,8 @@ files:
|
|
|
108
108
|
- pcf_blue_green.gemspec
|
|
109
109
|
- spec/mocks/custom_routes.txt
|
|
110
110
|
- spec/mocks/custom_routes_domain_host.txt
|
|
111
|
-
- spec/mocks/
|
|
111
|
+
- spec/mocks/routes_stdout.json
|
|
112
|
+
- spec/mocks/simple_entity.json
|
|
112
113
|
- spec/pcf_blue_green_spec.rb
|
|
113
114
|
- spec/spec_helper.rb
|
|
114
115
|
homepage: https://github.com/aaa-ncnu-ie/pcf_blue_green
|