bosh-cloudfoundry 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/Gemfile +6 -0
- data/Guardfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +242 -0
- data/Rakefile +33 -0
- data/bosh-cloudfoundry.gemspec +29 -0
- data/config/defaults.yml +6 -0
- data/lib/bosh-cloudfoundry.rb +34 -0
- data/lib/bosh-cloudfoundry/bosh_release_manager.rb +141 -0
- data/lib/bosh-cloudfoundry/config.rb +6 -0
- data/lib/bosh-cloudfoundry/config/common_config.rb +27 -0
- data/lib/bosh-cloudfoundry/config/dea_config.rb +150 -0
- data/lib/bosh-cloudfoundry/config/microbosh_config.rb +106 -0
- data/lib/bosh-cloudfoundry/config/postgresql_service_config.rb +185 -0
- data/lib/bosh-cloudfoundry/config/redis_service_config.rb +179 -0
- data/lib/bosh-cloudfoundry/config/system_config.rb +60 -0
- data/lib/bosh-cloudfoundry/config_options.rb +362 -0
- data/lib/bosh-cloudfoundry/gerrit_patches_helper.rb +47 -0
- data/lib/bosh-cloudfoundry/providers.rb +19 -0
- data/lib/bosh-cloudfoundry/providers/aws.rb +75 -0
- data/lib/bosh-cloudfoundry/system_deployment_manifest_renderer.rb +286 -0
- data/lib/bosh-cloudfoundry/version.rb +5 -0
- data/lib/bosh/cli/commands/cf.rb +668 -0
- data/spec/assets/.gitkeep +0 -0
- data/spec/assets/cf-release/jobs/cloud_controller/templates/runtimes.yml +150 -0
- data/spec/assets/deployments/aws-core-1-m1.small-free-redis.yml +221 -0
- data/spec/assets/deployments/aws-core-1-m1.xlarge-free-postgresql-2-m1.small-free-postgresql.yml +248 -0
- data/spec/assets/deployments/aws-core-2-m1.xlarge-dea.yml +195 -0
- data/spec/assets/deployments/aws-core-only.yml +178 -0
- data/spec/assets/deployments/aws-core-with-nfs.yml +192 -0
- data/spec/functional/.gitkeep +0 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/unit/.gitkeep +0 -0
- data/spec/unit/bosh_release_manager_spec.rb +36 -0
- data/spec/unit/cf_command_spec.rb +280 -0
- data/spec/unit/config/common_config_spec.rb +21 -0
- data/spec/unit/config/dea_config_spec.rb +92 -0
- data/spec/unit/config/microbosh_config_spec.rb +11 -0
- data/spec/unit/config/postgresql_service_config_spec.rb +103 -0
- data/spec/unit/config/redis_service_config_spec.rb +103 -0
- data/spec/unit/config/system_config_spec.rb +29 -0
- data/spec/unit/config_options_spec.rb +64 -0
- data/spec/unit/system_deployment_manifest_renderer_spec.rb +93 -0
- metadata +246 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/bosh/cli/commands/cf.rb$}) { |m| "spec/unit/cf_command_spec.rb" }
|
7
|
+
watch(%r{^lib/bosh-cloudfoundry/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
|
8
|
+
watch('spec/spec_helper.rb') { "spec" }
|
9
|
+
end
|
10
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Dr Nic Williams
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,242 @@
|
|
1
|
+
# Bosh::CloudFoundry
|
2
|
+
|
3
|
+
You want CloudFoundry? You can now create, scale, upgrade and patch one or more Cloud Foundry deployments using very simple, easy to learn and remember CLI commands.
|
4
|
+
|
5
|
+
Currently supports AWS only. OpenStack support is coming. vSphere and vCloud support will require someone to tell me that they really want it.
|
6
|
+
|
7
|
+
## NOTE - currently requires latest edge of nearly everything
|
8
|
+
|
9
|
+
This tool currently requires the latest merged patches. The readme below, from "Usage" onward, is written for when there are public stemcells and final releases.
|
10
|
+
|
11
|
+
Today, to get everything running:
|
12
|
+
|
13
|
+
```
|
14
|
+
# on your laptop
|
15
|
+
git clone git://github.com/StarkAndWayne/bosh-bootstrap.git
|
16
|
+
cd bosh-bootstrap
|
17
|
+
bundle
|
18
|
+
rake install
|
19
|
+
|
20
|
+
bosh-bootstrap deploy --latest-stemcell
|
21
|
+
bosh-bootstrap ssh
|
22
|
+
|
23
|
+
# now on the inception VM
|
24
|
+
cd /var/vcap/store/repos
|
25
|
+
git clone git://github.com/StarkAndWayne/bosh-cloudfoundry.git
|
26
|
+
cd bosh-cloudfoundry
|
27
|
+
bundle
|
28
|
+
gem build *.gemspec && mv *.gem pkg/
|
29
|
+
sudo gem install pkg/*.gem --no-ri --no-rdoc
|
30
|
+
|
31
|
+
export TMPDIR=/var/vcap/store/tmp
|
32
|
+
bosh cf upload release --dev
|
33
|
+
|
34
|
+
bosh cf prepare system production --release-name appcloud-dev
|
35
|
+
# prompts for a DNS host for your CloudFoundry, such as mycompany.com
|
36
|
+
# will generate a new IP address
|
37
|
+
# now setup your DNS for *.mycompany.com => new IP address
|
38
|
+
# the re-run:
|
39
|
+
bosh cf prepare system production
|
40
|
+
|
41
|
+
bosh cf upload stemcell --latest
|
42
|
+
bosh cf merge gerrit 37/13137/4 84/13084/4 83/13583/1
|
43
|
+
bosh deploy
|
44
|
+
|
45
|
+
# now we can grow our single VM deployment
|
46
|
+
|
47
|
+
bosh cf change deas 1
|
48
|
+
bosh cf add service postgresql
|
49
|
+
bosh deploy
|
50
|
+
```
|
51
|
+
|
52
|
+
Overtime, as you add more DEAs and other service nodes, your set of VMs might look like:
|
53
|
+
|
54
|
+
```
|
55
|
+
$ bosh vms
|
56
|
+
+-----------------------------+---------+---------------------------+-----------------------------+
|
57
|
+
| Job/index | State | Resource Pool | IPs |
|
58
|
+
+-----------------------------+---------+---------------------------+-----------------------------+
|
59
|
+
| core/0 | running | core | 10.4.70.116, 54.235.200.165 |
|
60
|
+
| dea/0 | running | dea | 10.4.49.7 |
|
61
|
+
| dea/1 | running | dea | 10.111.39.12 |
|
62
|
+
| postgresql_m1_medium_free/0 | running | postgresql_m1_medium_free | 10.4.71.164 |
|
63
|
+
| postgresql_m1_small_free/0 | running | postgresql_m1_small_free | 10.110.83.128 |
|
64
|
+
| postgresql_m1_small_free/1 | running | postgresql_m1_small_free | 10.189.103.26 |
|
65
|
+
+-----------------------------+---------+---------------------------+-----------------------------+
|
66
|
+
```
|
67
|
+
|
68
|
+
## Requirements
|
69
|
+
|
70
|
+
* Ruby 1.9
|
71
|
+
* BOSH running on AWS (other CPIs coming)
|
72
|
+
|
73
|
+
## Usage
|
74
|
+
|
75
|
+
The tool is very simple to use and to get CloudFoundry deployed on a small set of initial servers.
|
76
|
+
|
77
|
+
```
|
78
|
+
gem install bosh-cloudfoundry
|
79
|
+
bosh cf prepare system demo
|
80
|
+
bosh cf deploy
|
81
|
+
```
|
82
|
+
|
83
|
+
The above can be run the following from your local laptop or a server, such as an `bosh-bootstrap` inception server.
|
84
|
+
|
85
|
+
The latter is preferred. As the Cloud Foundry BOSH release (`cf-release`) is 1.5 Gb, it may be preferable to manage your Cloud Foundry deployments from your inception server, as created/prepared via `bosh-bootstrap`.
|
86
|
+
|
87
|
+
```
|
88
|
+
bosh-bootstrap deploy --latest-stemcell
|
89
|
+
bosh-bootstrap ssh
|
90
|
+
|
91
|
+
# now on the inception VM
|
92
|
+
gem install bosh-cloudfoundry
|
93
|
+
export TMPDIR=/var/vcap/store/tmp
|
94
|
+
bosh cf prepare system production
|
95
|
+
# prompts for a DNS host for your CloudFoundry, such as mycompany.com
|
96
|
+
bosh cf change deas 1
|
97
|
+
bosh cf add service postgresql 1
|
98
|
+
bosh deploy
|
99
|
+
```
|
100
|
+
|
101
|
+
During `bosh cf prepare system production`, it will automatically upload the latest release of CloudFoundry (the latest final [BOSH release](http://github.com/cloudfoundry/cf-release)) and the latest stable stemcell (becomes the base AMI for AWS, for example).
|
102
|
+
|
103
|
+
NOTE: `export TMPDIR=/var/vcap/store/tmp` tells the upload process to use the larger mounted volume at `/var/vcap/store`.
|
104
|
+
|
105
|
+
You can upload a more recent stemcell or create a new one from source, respectively:
|
106
|
+
|
107
|
+
```
|
108
|
+
bosh cf upload stemcell --latest
|
109
|
+
bosh cf upload stemcell --custom
|
110
|
+
```
|
111
|
+
|
112
|
+
You can upload a more recent final BOSH release of CloudFoundry, or create a non-final version from the very latest commits to the CloudFoundry BOSH release, respectively:
|
113
|
+
|
114
|
+
```
|
115
|
+
bosh cf upload release
|
116
|
+
bosh cf upload release --dev
|
117
|
+
```
|
118
|
+
|
119
|
+
### All available commands
|
120
|
+
|
121
|
+
Prefix each with `bosh`:
|
122
|
+
|
123
|
+
```
|
124
|
+
cf prepare system [<name>] [--core-ip ip] [--root-dns dns]
|
125
|
+
[--core-server-flavor flavor] [--release-name name] [--release-version
|
126
|
+
version] [--stemcell-name name] [--stemcell-version version]
|
127
|
+
[--admin-emails email1,email2] [--skip-validations]
|
128
|
+
create CloudFoundry system
|
129
|
+
--core-ip ip Static IP for CloudController/router, e.g. 1.2.3.4
|
130
|
+
--root-dns dns Base DNS for CloudFoundry applications, e.g. vcap.me
|
131
|
+
--core-server-flavor flavor Flavor of the CloudFoundry Core server. Default: 'm1.large'
|
132
|
+
--release-name name Name of BOSH release within target BOSH. Default: 'appcloud'
|
133
|
+
--release-version version Version of target BOSH release within target BOSH. Default: 'latest'
|
134
|
+
--stemcell-name name Name of BOSH stemcell within target BOSH. Default: 'bosh-stemcell'
|
135
|
+
--stemcell-version version Version of BOSH stemcell within target BOSH. Default: determines latest for stemcell
|
136
|
+
--admin-emails email1,email2 Admin email accounts in created CloudFoundry
|
137
|
+
--skip-validations Skip all validations
|
138
|
+
|
139
|
+
cf change deas [<server_count>] [--flavor flavor]
|
140
|
+
change the number/flavor of DEA servers (servers that run CF apps)
|
141
|
+
--flavor flavor Change flavor of all DEA servers
|
142
|
+
|
143
|
+
cf add service <service_name> [<additional_count>] [--flavor flavor]
|
144
|
+
add additional CloudFoundry service node
|
145
|
+
--flavor flavor Server flavor for additional service nodes
|
146
|
+
|
147
|
+
cf upload stemcell [--latest] [--custom]
|
148
|
+
download/create stemcell & upload to BOSH
|
149
|
+
--latest Use latest stemcell; possibly not tagged stable
|
150
|
+
--custom Create custom stemcell from BOSH git source
|
151
|
+
|
152
|
+
cf upload release [--dev]
|
153
|
+
fetch & upload public cloudfoundry release to BOSH
|
154
|
+
--dev Create development release from very latest cf-release commits
|
155
|
+
|
156
|
+
cf deploy
|
157
|
+
deploy CloudFoundry system or apply any changes
|
158
|
+
|
159
|
+
cf watch nats
|
160
|
+
subscribe to all nats messages within CloudFoundry
|
161
|
+
```
|
162
|
+
|
163
|
+
## Services
|
164
|
+
|
165
|
+
By default your CloudFoundry deployment comes with no built-in services. Instead, you easily enable each one and allocate it resources using the `bosh cf add service NAME` command; then deploy again.
|
166
|
+
|
167
|
+
```
|
168
|
+
$ bosh cf add service postgresql
|
169
|
+
$ bosh cf add service redis
|
170
|
+
$ bosh deploy
|
171
|
+
```
|
172
|
+
|
173
|
+
Eventually the new service node servers will be up and running, and then the VMC client will be able to create/bind/delete these services with your CloudFoundry applications.
|
174
|
+
|
175
|
+
For example:
|
176
|
+
|
177
|
+
```
|
178
|
+
============== System Services ==============
|
179
|
+
|
180
|
+
+------------+---------+---------------------------------------+
|
181
|
+
| Service | Version | Description |
|
182
|
+
+------------+---------+---------------------------------------+
|
183
|
+
| postgresql | 9.0 | PostgreSQL database service (vFabric) |
|
184
|
+
| redis | 2.2 | Redis key-value store service |
|
185
|
+
+------------+---------+---------------------------------------+
|
186
|
+
|
187
|
+
=========== Provisioned Services ============
|
188
|
+
|
189
|
+
+------------------+------------+
|
190
|
+
| Name | Service |
|
191
|
+
+------------------+------------+
|
192
|
+
| postgresql-6d01e | postgresql |
|
193
|
+
| postgresql-ff0c1 | postgresql |
|
194
|
+
| redis-d0d3d | redis |
|
195
|
+
+------------------+------------+g
|
196
|
+
```
|
197
|
+
|
198
|
+
## Orders of easiness vs powerfulness
|
199
|
+
|
200
|
+
```
|
201
|
+
|
202
|
+
+--------------+ +-----------------+ +---------------------+
|
203
|
+
| | | | | |
|
204
|
+
| CLI | | | | |
|
205
|
+
| commands +---->| | | |
|
206
|
+
| | | system | | deployment |
|
207
|
+
| | | config | | manifest |
|
208
|
+
+--------------+ | (yaml) | | (yaml) |
|
209
|
+
| +------>| |
|
210
|
+
| | | |
|
211
|
+
| | | |
|
212
|
+
| | | |
|
213
|
+
| | | |
|
214
|
+
+-----------------+ | |
|
215
|
+
| |
|
216
|
+
| |
|
217
|
+
| |
|
218
|
+
| |
|
219
|
+
| |
|
220
|
+
| |
|
221
|
+
| |
|
222
|
+
| |
|
223
|
+
| |
|
224
|
+
| |
|
225
|
+
+---------------------+
|
226
|
+
```
|
227
|
+
|
228
|
+
## Development
|
229
|
+
|
230
|
+
```
|
231
|
+
bundle
|
232
|
+
bundle exec rake spec
|
233
|
+
bundle exec rake install
|
234
|
+
```
|
235
|
+
|
236
|
+
## Contributing
|
237
|
+
|
238
|
+
1. Fork it
|
239
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
240
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
241
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
242
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __FILE__)
|
4
|
+
|
5
|
+
require "rubygems"
|
6
|
+
require "bundler"
|
7
|
+
Bundler.setup(:default, :test, :development)
|
8
|
+
|
9
|
+
require "bundler/gem_tasks"
|
10
|
+
|
11
|
+
require "rake/dsl_definition"
|
12
|
+
require "rake"
|
13
|
+
require "rspec/core/rake_task"
|
14
|
+
|
15
|
+
|
16
|
+
if defined?(RSpec)
|
17
|
+
namespace :spec do
|
18
|
+
desc "Run Unit Tests"
|
19
|
+
unit_rspec_task = RSpec::Core::RakeTask.new(:unit) do |t|
|
20
|
+
t.pattern = "spec/unit/**/*_spec.rb"
|
21
|
+
t.rspec_opts = %w(--format progress --color -d)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Run Integration Tests"
|
25
|
+
functional_rspec_task = RSpec::Core::RakeTask.new(:functional) do |t|
|
26
|
+
t.pattern = "spec/functional/**/*_spec.rb"
|
27
|
+
t.rspec_opts = %w(--format progress --color)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Install dependencies and run tests"
|
32
|
+
task :spec => %w(spec:unit spec:functional)
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'bosh-cloudfoundry/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "bosh-cloudfoundry"
|
8
|
+
gem.version = Bosh::Cloudfoundry::VERSION
|
9
|
+
gem.authors = ["Dr Nic Williams"]
|
10
|
+
gem.email = ["drnicwilliams@gmail.com"]
|
11
|
+
gem.description = %q{Create and manage your Cloud Foundry deployments}
|
12
|
+
gem.summary = %q{Create and manage your Cloud Foundry deployments via the BOSH CLI}
|
13
|
+
gem.homepage = "https://github.com/StarkAndWayne/bosh-cloudfoundry"
|
14
|
+
gem.license = "MIT"
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
gem.add_dependency "bosh_cli", ">=1.0.3"
|
22
|
+
gem.add_dependency "rake" # file_utils sh helper
|
23
|
+
gem.add_dependency "net-dns"
|
24
|
+
gem.add_dependency "fog", ">= 1.8.0"
|
25
|
+
gem.add_development_dependency "rspec"
|
26
|
+
gem.add_development_dependency "ci_reporter"
|
27
|
+
gem.add_development_dependency "debugger"
|
28
|
+
gem.add_development_dependency "guard-rspec"
|
29
|
+
end
|
data/config/defaults.yml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "bosh-cloudfoundry/version"
|
2
|
+
|
3
|
+
module Bosh; module CloudFoundry; end; end
|
4
|
+
|
5
|
+
require "logger"
|
6
|
+
require "common/common"
|
7
|
+
require "common/thread_formatter"
|
8
|
+
require "cli"
|
9
|
+
|
10
|
+
# for generating password
|
11
|
+
require 'openssl'
|
12
|
+
|
13
|
+
# for the #sh helper
|
14
|
+
require "rake"
|
15
|
+
require "rake/file_utils"
|
16
|
+
|
17
|
+
# for validating DNS -> IP setups
|
18
|
+
require 'net/dns'
|
19
|
+
|
20
|
+
# for:
|
21
|
+
# * validating compute flavors
|
22
|
+
# * provisioning IP addresses
|
23
|
+
require "fog"
|
24
|
+
require 'fog/aws/models/compute/flavors'
|
25
|
+
|
26
|
+
# CLI mixins
|
27
|
+
require "bosh-cloudfoundry/config_options"
|
28
|
+
require "bosh-cloudfoundry/bosh_release_manager"
|
29
|
+
require "bosh-cloudfoundry/gerrit_patches_helper"
|
30
|
+
|
31
|
+
require "bosh-cloudfoundry/config"
|
32
|
+
require "bosh-cloudfoundry/providers"
|
33
|
+
|
34
|
+
require "bosh-cloudfoundry/system_deployment_manifest_renderer"
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# Copyright (c) 2012-2013 Stark & Wayne, LLC
|
2
|
+
|
3
|
+
module Bosh; module CloudFoundry; end; end
|
4
|
+
|
5
|
+
# There are two concepts of "latest".
|
6
|
+
# * for upload: "latest" is the highest release in cf-release
|
7
|
+
# * for manifest creation: "latest" is the highest release already uploaded to the BOSH
|
8
|
+
module Bosh::CloudFoundry::BoshReleaseManager
|
9
|
+
|
10
|
+
# @return [Array] BOSH releases available in target BOSH
|
11
|
+
# [{"name"=>"appcloud", "versions"=>["124", "126"], "in_use"=>[]}]
|
12
|
+
def bosh_releases
|
13
|
+
@bosh_releases ||= releases = director.list_releases
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Array] BOSH release names available in target BOSH
|
17
|
+
def bosh_release_names
|
18
|
+
@bosh_release_names ||= bosh_releases.map { |rel| rel["name"] }
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Array] BOSH release versions for specific release name in target BOSH
|
22
|
+
def bosh_release_versions(release_name)
|
23
|
+
if release = bosh_releases.find { |rel| rel["name"] == release_name }
|
24
|
+
release["versions"]
|
25
|
+
else
|
26
|
+
[]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def release_name_version
|
31
|
+
"#{release_name}/#{release_version}"
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Version String] BOSH version number; converts 'latest' into actual version
|
35
|
+
# TODO implement this; map "latest" to highest uploaded release in BOSH
|
36
|
+
# return "unknown" if BOSH has no releases of this name yet
|
37
|
+
def effective_release_version
|
38
|
+
release_version.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
# for upload, "latest" is the newest release in cf-release
|
42
|
+
def upload_final_release
|
43
|
+
release_number = use_latest_release? ?
|
44
|
+
latest_uploadable_final_release_number :
|
45
|
+
release_version
|
46
|
+
chdir(cf_release_dir) do
|
47
|
+
bosh_cmd "upload release releases/appcloud-#{release_number}.yml"
|
48
|
+
end
|
49
|
+
@bosh_releases = nil # reset cache
|
50
|
+
end
|
51
|
+
|
52
|
+
# Looks at the last line of releases/index.yml in cf-release
|
53
|
+
# for the latest release number that could be uploaded
|
54
|
+
# @returns [String] a number such as "126"
|
55
|
+
def latest_uploadable_final_release_number
|
56
|
+
chdir(cf_release_dir) do
|
57
|
+
return `tail -n 1 releases/index.yml | awk '{print $2}'`.strip
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Looks at the last line of releases/index.yml in cf-release
|
62
|
+
# for the latest release number that could be uploaded
|
63
|
+
# @returns [String] a dev release code such as "126.8-dev"
|
64
|
+
def latest_uploadable_dev_release_number
|
65
|
+
chdir(cf_release_dir) do
|
66
|
+
return `tail -n 1 dev_releases/index.yml | awk '{print $2}'`.strip
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# @returns [String] absolute path to latest release to be uploaded
|
71
|
+
def latest_dev_release_filename
|
72
|
+
dev_release_number = latest_uploadable_dev_release_number
|
73
|
+
return nil unless dev_release_number.size > 0
|
74
|
+
File.join(cf_release_dir, "#{release_name}-#{dev_release_number}.yml")
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_and_upload_dev_release(release_name=default_dev_release_name)
|
78
|
+
chdir(cf_release_dir) do
|
79
|
+
write_dev_config_file(release_name)
|
80
|
+
sh "bosh create release --with-tarball --force"
|
81
|
+
sh "bosh -n --color upload release"
|
82
|
+
end
|
83
|
+
@bosh_releases = nil # reset cache
|
84
|
+
end
|
85
|
+
|
86
|
+
def write_dev_config_file(release_name)
|
87
|
+
dev_config_file = "config/dev.yml"
|
88
|
+
if File.exist?(dev_config_file)
|
89
|
+
dev_config = YAML.load_file(dev_config_file)
|
90
|
+
else
|
91
|
+
dev_config = {}
|
92
|
+
end
|
93
|
+
dev_config["dev_name"] = release_name
|
94
|
+
File.open(dev_config_file, "w") { |file| file << dev_config.to_yaml }
|
95
|
+
end
|
96
|
+
|
97
|
+
# assume unchanged config/final.yml
|
98
|
+
def clone_or_update_cf_release
|
99
|
+
cf_release_dirname = File.basename(cf_release_dir)
|
100
|
+
if File.directory?(cf_release_dir)
|
101
|
+
chdir(cf_release_dir) do
|
102
|
+
sh "git pull origin master"
|
103
|
+
end
|
104
|
+
else
|
105
|
+
chdir(releases_dir) do
|
106
|
+
sh "git clone #{cf_release_git_repo} #{cf_release_dirname}"
|
107
|
+
chdir(cf_release_dirname) do
|
108
|
+
sh "git update-index --assume-unchanged config/final.yml 2>/dev/null"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
chdir(cf_release_dir) do
|
113
|
+
say "Rewriting all git:// & git@ to https:// ..."
|
114
|
+
# Snippet written by Mike Reeves <swampfoxmr@gmail.com> on bosh-users mailing list
|
115
|
+
# Date 2012-12-06
|
116
|
+
sh "sed -i 's#git@github.com:#https://github.com/#g' .gitmodules"
|
117
|
+
sh "sed -i 's#git://github.com#https://github.com#g' .gitmodules"
|
118
|
+
sh "git submodule update --init --recursive"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def default_release_name
|
123
|
+
"appcloud"
|
124
|
+
end
|
125
|
+
|
126
|
+
def default_dev_release_name
|
127
|
+
default_release_name + "-dev"
|
128
|
+
end
|
129
|
+
|
130
|
+
def switch_to_development_release
|
131
|
+
system_config.release_name = default_dev_release_name
|
132
|
+
system_config.release_version = "latest"
|
133
|
+
system_config.save
|
134
|
+
end
|
135
|
+
|
136
|
+
def switch_to_final_release
|
137
|
+
system_config.release_name = default_release_name
|
138
|
+
system_config.release_version = "latest"
|
139
|
+
system_config.save
|
140
|
+
end
|
141
|
+
end
|