pcf_blue_green 0.28 → 0.30

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 327efdf015700c02e2eb763f3c9615f1446efd75
4
- data.tar.gz: 7fd129d6e8b35938a45a88e6d1a4ed28d74389f8
3
+ metadata.gz: 822cec14d1a275a2eb09b8a69bbad96ab2954b5e
4
+ data.tar.gz: 29bea7873439cff74b113067e0bff1e2b25168ec
5
5
  SHA512:
6
- metadata.gz: d6a80d063f348fa1c300854bea0bb5b25ea01d5f1bc587cf170e3df03a640a3e03273ec5ef4bec733b065b0c9b707cf0eb329a8c3f7455b385e03871fce573fe
7
- data.tar.gz: d5b2b8a3ac2718ddc10a05c36c153b752e7b87571b23a6f24c3bdb71d591711b9c8aa6ccb6321dc1250c3c4413af49764a8171331527a4be503e33dea262c8d5
6
+ metadata.gz: 44a4e30abaec0de6b836f45ab21b0d1ca2904318efeee6dd2ee0611ec52a17394bbb830e82b0b4b19ac9e3f052ec0dd46dbc527ed5f5efc7c919c6f13bab1abd
7
+ data.tar.gz: 636c83bde99010bfa824f55216e26138b75bc8b4b2314bd412912e7f1d5a617cf59b56c525c3af15f7d6f8fc6908b3d1d2ed50b8085db2dce0d01bb1115186f9
@@ -1,3 +1,3 @@
1
1
  module PcfBlueGreen
2
- VERSION = "0.28"
2
+ VERSION = "0.30"
3
3
  end
@@ -6,6 +6,88 @@ require "json"
6
6
  module PcfBlueGreen
7
7
  class BlueGreenDeployFailed < StandardError
8
8
  end
9
+
10
+ class CleanupBlueFailed < StandardError
11
+ end
12
+
13
+
14
+ class Routing
15
+
16
+ def initialize(url, user, pass, org, space, call_login = false, opts = {})
17
+ @options = {:login => '--skip-ssl-validation'}.merge(opts)
18
+ @url = url
19
+ @user = user
20
+ @pass = pass
21
+ @org = org
22
+ @space = space
23
+ @login_options = @options[:login]
24
+ login if call_login
25
+ end
26
+
27
+ def cleanup_blue
28
+ remap-routes
29
+ status = bash("#{@source_cmd} && remove-blue")
30
+ raise PcfBlueGreen::CleanupBlueFailed unless status
31
+ bash("#{@source_cmd} && announce-success")
32
+ end
33
+
34
+ def remap_routes
35
+ puts "Remapping routes..."
36
+ puts "cf_app is #{ENV['cf_app']}"
37
+ puts "green is #{ENV['green']}"
38
+
39
+ puts cf_routes_output
40
+ mapped_routes = []
41
+
42
+ if ENV['handle_all_paths']
43
+ cmd = "#{cf_routes_output} | tail -n +2 | awk '($5==ENVIRON[\"cf_app\"]) {print $3\" -n \"$2 \" --path \"substr($4,2) }' | xargs -n 5 #{map_route_command} #{ENV['green']}"
44
+ shell = Mixlib::ShellOut.new(cmd)
45
+ shell.run_command
46
+ unless shell.stderr.empty?
47
+ puts shell.stderr
48
+ raise PcfBlueGreen::CleanupBlueFailed
49
+ end
50
+ mapped_routes += shell.stdout.split("\n")
51
+ end
52
+ cmd = "#{cf_routes_output} | tail -n +2 | awk '($4==ENVIRON[\"cf_app\"]) {print $3\" -n \" $2}' | xargs -n 3 #{map_route_command} #{ENV['green']}"
53
+ shell = Mixlib::ShellOut.new(cmd)
54
+ shell.run_command
55
+ unless shell.stderr.empty?
56
+ puts shell.stderr
57
+ raise PcfBlueGreen::CleanupBlueFailed
58
+ end
59
+ mapped_routes += shell.stdout.split("\n")
60
+
61
+ mapped_routes
62
+ end
63
+
64
+ private
65
+
66
+ def login
67
+ puts "Logging in to #{@url}"
68
+ cf_login = "cf login -a #{@url} -u #{@user} -p '#{@pass}' -o #{@org} -s #{@space} #{@login_options} > /dev/null"
69
+ cmd = "#{cf_login}"
70
+ shell = Mixlib::ShellOut.new(cmd)
71
+ shell.run_command
72
+ end
73
+
74
+ def cf_routes_output
75
+ cmd = "cf routes"
76
+ shell = Mixlib::ShellOut.new(cmd)
77
+ shell.run_command
78
+ shell.stdout
79
+ end
80
+
81
+ def map_route_command
82
+ "cf map-route"
83
+ end
84
+
85
+ def bash(command)
86
+ escaped_command = Shellwords.escape(command)
87
+ system "bash -c #{escaped_command}"
88
+ end
89
+ end
90
+
9
91
  class SharedDeployFunctions
10
92
 
11
93
  def initialize
@@ -219,10 +219,6 @@ function blue-green {
219
219
  else
220
220
  check-health "https://${green}.${health_check_domain}/${app_path}"
221
221
  fi
222
-
223
- remap-routes
224
- remove-blue
225
- announce-success
226
222
  }
227
223
 
228
224
  function simple-push {
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "bundler", "~> 1.13"
33
33
  spec.add_development_dependency "rake", "~> 10.0"
34
34
  spec.add_development_dependency "rspec", "~> 3.0"
35
+ spec.add_dependency "pry"
35
36
  end
@@ -0,0 +1,13 @@
1
+
2
+ space host domain port path type apps service
3
+ app-space onemoreapp apps.prod.domain.com onemoreapp
4
+ app-space otherapp apps.prod.domain.com otherapp
5
+ app-space customapp apps.prod.domain.com customapp
6
+ app-space otherapp apps.prod.domain.com customapp
7
+ app-space customapp apps.prod.otherdomain.com otherapp
8
+ app-space customapp apps.prod.domain.com /somepath1 customapp
9
+ app-space otherapp apps.prod.domain.com /somepath2 customapp
10
+ app-space otherapp apps.prod.domain.com /somepath3 customapp
11
+ app-space otherapp apps.prod.domain.com /somepath4 otherapp
12
+ app-space otherapp apps.prod.domain.com /somepath5 otherapp
13
+ app-space otherapp apps.prod.domain.com /somepath6 otherapp
@@ -0,0 +1,15 @@
1
+
2
+ space host domain port path type apps service
3
+ app-space first-app apps.prod.domain.com.com first-app
4
+ app-space second-app apps.prod.domain.com.com second-app
5
+ app-space third-app apps.prod.domain.com.com third-app
6
+ app-space third-app apps.prod.otherdomain.com third-app
7
+ app-space third-app apps.prod.domain.com.com /firstapp-path1 second-app
8
+ app-space third-app apps.prod.domain.com.com /firstapp-path2 second-app
9
+ app-space third-app apps.prod.domain.com.com /firstapp-path3 second-app
10
+ app-space third-app apps.prod.domain.com.com /firstapp-path4 second-app
11
+ app-space third-app apps.prod.domain.com.com /firstapp-path5 second-app
12
+ app-space third-app apps.prod.otherdomain.com /otherdomainpath first-app
13
+ app-space third-app apps.prod.domain.com.com /secondapp-path second-app
14
+ app-space third-app apps.prod.domain.com.com /secondapp-path second-app
15
+ app-space third-app-other-host apps.prod.otherdomain.com third-app
@@ -0,0 +1,5 @@
1
+
2
+ space host domain port path type apps service
3
+ app-space simpleapp apps.prod.domain.com simpleapp
4
+ app-space otherapp apps.prod.domain.com otherapp
5
+ app-space otherapp apps.prod.domain.com /validate otherapp
@@ -5,7 +5,163 @@ describe PcfBlueGreen do
5
5
  expect(PcfBlueGreen::VERSION).not_to be nil
6
6
  end
7
7
 
8
- it "does something useful" do
9
- expect(false).to eq(true)
8
+ describe "blue green deploy clean-up" do
9
+ context 'main route domain' do
10
+ it 're-maps routes correctly for simple routes' do
11
+
12
+ expected_routes = %{simpleapp-app-space-green apps.prod.domain.com -n simpleapp}
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'
22
+
23
+ space = ENV['APP_SPACE']
24
+ app = ENV['APP_NAME']
25
+ api_url = ENV['cf_api']
26
+ username = ENV['cf_user']
27
+ password = ENV['cf_password']
28
+ org = ENV['cf_org']
29
+
30
+
31
+ @pcf_blue_green = PcfBlueGreen::Routing.new(api_url, username, password, org, space, login = false)
32
+ @pcf_blue_green.stub(:cf_routes_output).and_return('cat spec/mocks/simple_routes.txt')
33
+ @pcf_blue_green.stub(:map_route_command).and_return('echo')
34
+ expect(expected_routes).to eq(@pcf_blue_green.remap_routes.uniq.join(",\n"))
35
+ end
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}
41
+
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.uniq.join(",\n"))
64
+ end
65
+ 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.uniq.join(",\n"))
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.uniq.join(",\n"))
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.uniq.join(",\n"))
164
+ end
165
+ end
10
166
  end
11
167
  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.28'
4
+ version: '0.30'
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-04-04 00:00:00.000000000 Z
11
+ date: 2017-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '3.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  description: This is a gem that encapsulates the blue-green bash script. This allows
76
90
  to run blue-green deployments easily
77
91
  email:
@@ -92,6 +106,9 @@ files:
92
106
  - lib/pcf_blue_green/version.rb
93
107
  - lib/shared-deploy-functions.sh
94
108
  - pcf_blue_green.gemspec
109
+ - spec/mocks/custom_routes.txt
110
+ - spec/mocks/custom_routes_domain_host.txt
111
+ - spec/mocks/simple_routes.txt
95
112
  - spec/pcf_blue_green_spec.rb
96
113
  - spec/spec_helper.rb
97
114
  homepage: https://github.com/aaa-ncnu-ie/pcf_blue_green