bosh_cli_plugin_redis 0.2.0
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.
- data/.gitignore +21 -0
- data/ChangeLog.md +34 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +129 -0
- data/Rakefile +43 -0
- data/bosh_cli_plugin_redis.gemspec +22 -0
- data/bosh_release/.final_builds/jobs/redis/index.yml +7 -0
- data/bosh_release/.final_builds/packages/redis/index.yml +7 -0
- data/bosh_release/config/.gitkeep +0 -0
- data/bosh_release/config/final.yml +10 -0
- data/bosh_release/jobs/.gitkeep +0 -0
- data/bosh_release/packages/.gitkeep +0 -0
- data/bosh_release/releases/index.yml +4 -0
- data/bosh_release/releases/redis-1.yml +20 -0
- data/bosh_release/src/.gitkeep +0 -0
- data/bosh_release/templates/aws/sample_deployment_file.yml +16 -0
- data/bosh_release/templates/aws/single_vm.yml.erb +107 -0
- data/bosh_release/templates/aws/spec +13 -0
- data/bosh_release/templates/openstack/sample_deployment_file.yml +16 -0
- data/bosh_release/templates/openstack/single_vm.yml.erb +107 -0
- data/lib/bosh/cli/commands/redis.rb +254 -0
- metadata +122 -0
data/.gitignore
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
bosh_release/.final_builds/jobs/*/*.tgz
|
19
|
+
bosh_release/.final_builds/packages/*/*.tgz
|
20
|
+
bosh_release/releases/*.tgz
|
21
|
+
deployments
|
data/ChangeLog.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
|
4
|
+
## v0.2 - bosh_cli_plugin_redis
|
5
|
+
|
6
|
+
Converted into a bosh plugin. Prefix "bosh" to the sub-commands below:
|
7
|
+
|
8
|
+
prepare redis
|
9
|
+
Prepare bosh for deploying one or more Redis services
|
10
|
+
|
11
|
+
create redis [--name] [--size] [--security_group]
|
12
|
+
Create a Redis service deployed upon target bosh
|
13
|
+
--name Unique name for service (within bosh & cloud foundry)
|
14
|
+
--size Size of provisioned VMs
|
15
|
+
--security_group Security group to assign to provisioned VMs
|
16
|
+
|
17
|
+
show redis uri
|
18
|
+
Show the redis URI for connection via bosh DNS
|
19
|
+
|
20
|
+
delete redis
|
21
|
+
Delete current Redis service
|
22
|
+
|
23
|
+
Note: the `cf bind-redis-env-var` command has been removed as it is a) specific to a Cloud Foundry user not a bosh user; b) kinda crappy "services" integration. Perhaps move it back into a cf plugin in future.
|
24
|
+
|
25
|
+
## v0.1 - redis-cf-plugin
|
26
|
+
|
27
|
+
Initial release! The initial commands offered are:
|
28
|
+
|
29
|
+
cf create-redis Create a Redis service deployed upon target bosh
|
30
|
+
cf show-redis-uri Show the redis URI for connection via bosh DNS
|
31
|
+
cf bind-redis-env-var APP Bind current Redis service URI to current app via env variable
|
32
|
+
cf delete-redis Delete current Redis service
|
33
|
+
|
34
|
+
The redis service URI uses bosh DNS. As such it must be deployed into the same bosh being used for Cloud Foundry.
|
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
source 'https://s3.amazonaws.com/bosh-jenkins-gems/' # for prerelease bosh_cli
|
3
|
+
|
4
|
+
# Specify your gem's dependencies in redis-cf-plugin.gemspec
|
5
|
+
gemspec
|
6
|
+
|
7
|
+
bosh_cli_path = File.expand_path("~/gems/cloudfoundry/bosh/bosh_cli")
|
8
|
+
if File.directory?(bosh_cli_path)
|
9
|
+
gem "bosh_cli", path: bosh_cli_path
|
10
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 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,129 @@
|
|
1
|
+
# Dedicate Redis services on AWS or OpenStack
|
2
|
+
|
3
|
+
This is a simple `bosh` CLI plugin to create and delete dedicated redis services and provide a simple URI. It runs on AWS or OpenStack via bosh.
|
4
|
+
|
5
|
+
Example create/delete scenario that includes binding the redis service to a Cloud Foundry application via environment variables:
|
6
|
+
|
7
|
+
```
|
8
|
+
$ bosh prepare redis
|
9
|
+
$ bosh create redis --name demoredis
|
10
|
+
$ bosh show redis uri
|
11
|
+
redis://:c1da049a75b3@0.redis.default.demoredis.microbosh:6379/0
|
12
|
+
$ cf set-env myapp REDIS_URI redis://:c1da049a75b3@0.redis.default.redis-123.microbosh:6379/0
|
13
|
+
|
14
|
+
$ cf unset-env myapp REDIS_URI
|
15
|
+
$ bosh delete redis
|
16
|
+
```
|
17
|
+
|
18
|
+
The resulting redis servers can be discovered and accessed by any systems (such as Cloud Foundry applications) using the same bosh (or microbosh) or a connected DNS.
|
19
|
+
|
20
|
+
## Requirements
|
21
|
+
|
22
|
+
You must use the same BOSH for deploying redis as you use to deploy Cloud Foundry (unless your DNS is configured to be shared across the two BOSH).
|
23
|
+
|
24
|
+
It is also requried that you have login access to the same BOSH being used to deploy your Cloud Foundry.
|
25
|
+
|
26
|
+
Confirm this by running:
|
27
|
+
|
28
|
+
```
|
29
|
+
$ bosh status
|
30
|
+
$ bosh deployments
|
31
|
+
```
|
32
|
+
|
33
|
+
The former will confirm you are targeting a bosh. The latter will display the deployments. One of which should be your Cloud Foundry.
|
34
|
+
|
35
|
+
## Installation
|
36
|
+
|
37
|
+
Install via RubyGems:
|
38
|
+
|
39
|
+
```
|
40
|
+
$ gem install bosh_cli "~> 1.5.0.pre" --source https://s3.amazonaws.com/bosh-jenkins-gems/
|
41
|
+
$ gem install bosh_cli_plugin_redis
|
42
|
+
```
|
43
|
+
|
44
|
+
The `bosh_cli` gem is currently only available from S3, rather than RubyGem itself. So it needs to be installed first.
|
45
|
+
|
46
|
+
## Usage
|
47
|
+
|
48
|
+
Each time you install the latest `redis-cf-plugin` you will want to re-upload the latest available redis release to your bosh. If no newer release is available then nothing good nor bad will occur.
|
49
|
+
|
50
|
+
```
|
51
|
+
$ bosh prepare redis
|
52
|
+
Uploading new redis release to bosh...
|
53
|
+
```
|
54
|
+
|
55
|
+
To create/provision a new redis service you run the following command. By default, it will select the smallest known instance size.
|
56
|
+
|
57
|
+
```
|
58
|
+
$ bosh create redis myapp-redis
|
59
|
+
$ bosh create redis myapp-redis --size small
|
60
|
+
$ bosh create redis myapp-redis --size medium
|
61
|
+
$ bosh create redis myapp-redis --size large
|
62
|
+
$ bosh create redis myapp-redis --size xlarge
|
63
|
+
```
|
64
|
+
|
65
|
+
NOTE: By default, the `default` security group is used. It must have port `6379` open.
|
66
|
+
|
67
|
+
To chose a different security group, use the `--security-group` option:
|
68
|
+
|
69
|
+
```
|
70
|
+
$ bosh create redis --security-group redis-server
|
71
|
+
```
|
72
|
+
|
73
|
+
To see the list of available instance sizes or to edit the list of available instance size, see the section "Customizing" below.
|
74
|
+
|
75
|
+
* TODO - how to show available instance sizes
|
76
|
+
* TODO - how to update a redis server to a different instance size/flavor
|
77
|
+
* TODO - how to update the persistent disk for the redis server
|
78
|
+
|
79
|
+
## Customizing
|
80
|
+
|
81
|
+
* TODO - how to edit available instance sizes (via the bosh deployment file templates)
|
82
|
+
|
83
|
+
## Releasing new plugin gem versions
|
84
|
+
|
85
|
+
There are two reasons to release new versions of this plugin.
|
86
|
+
|
87
|
+
1. Package the latest [redis-boshrelease](https://github.com/cloudfoundry-community/redis-boshrelease) bosh release (which describes how the redis service is implemented)
|
88
|
+
2. New features or bug fixes to the plugin
|
89
|
+
|
90
|
+
To package the latest "final release" of the redis bosh release into this source repository, run the following command:
|
91
|
+
|
92
|
+
```
|
93
|
+
$ cd /path/to/releases
|
94
|
+
$ git clone https://github.com/cloudfoundry-community/redis-boshrelease.git
|
95
|
+
$ cd -
|
96
|
+
$ rake bosh:release:import[/path/to/releases/redis-boshrelease]
|
97
|
+
# for zsh shell quotes are required around rake arguments:
|
98
|
+
$ rake bosh:release:import'[/path/to/releases/redis-boshrelease]'
|
99
|
+
```
|
100
|
+
|
101
|
+
Note: only the latest "final release" will be packaged. See https://github.com/cloudfoundry-community/redis-boshrelease#readme for information on creating new bosh releases.
|
102
|
+
|
103
|
+
To locally test the plugin (`bosh` cli loads plugins from its local path automatically):
|
104
|
+
|
105
|
+
```
|
106
|
+
$ cf /path/to/bosh_cli_plugin_redis
|
107
|
+
$ bosh redis
|
108
|
+
```
|
109
|
+
|
110
|
+
To release a new version of the plugin as a RubyGem:
|
111
|
+
|
112
|
+
1. Edit `bosh_cli_plugin_redis.gemspec` to update the major or minor or patch version.
|
113
|
+
2. Run the release command:
|
114
|
+
|
115
|
+
```
|
116
|
+
$ rake release
|
117
|
+
```
|
118
|
+
|
119
|
+
## Contributing
|
120
|
+
|
121
|
+
For fixes or features to the `bosh_cli_plugin_redis` (`bosh redis`) plugin:
|
122
|
+
|
123
|
+
1. Fork it
|
124
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
125
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
126
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
127
|
+
5. Create new Pull Request
|
128
|
+
|
129
|
+
For fixes or features to the redis bosh release, please visit https://github.com/cloudfoundry-community/redis-boshrelease. Final releases of `redis-boshrelease` will be distributed in future gem versions of this plugin.
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
bosh_release = "redis-boshrelease"
|
4
|
+
target_bosh_release_path = File.expand_path("../bosh_release", __FILE__)
|
5
|
+
|
6
|
+
namespace :bosh do
|
7
|
+
namespace :release do
|
8
|
+
desc "Import latest #{bosh_release}"
|
9
|
+
task :import, :path do |t, args|
|
10
|
+
source_bosh_release = File.expand_path(args[:path])
|
11
|
+
unless File.directory?(source_bosh_release)
|
12
|
+
$stderr.puts "Please pass path to source bosh release"
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
sh "rm -rf #{target_bosh_release_path}"
|
17
|
+
|
18
|
+
# required directories to pass bosh_cli validations
|
19
|
+
%w[config jobs packages src].each do |dir|
|
20
|
+
sh "mkdir -p #{target_bosh_release_path}/#{dir}"
|
21
|
+
sh "touch #{target_bosh_release_path}/#{dir}/.gitkeep"
|
22
|
+
end
|
23
|
+
|
24
|
+
chdir(target_bosh_release_path) do
|
25
|
+
sh "cp -R #{source_bosh_release}/releases #{target_bosh_release_path}"
|
26
|
+
sh "cp -R #{source_bosh_release}/templates #{target_bosh_release_path}"
|
27
|
+
|
28
|
+
sh "cp -R #{source_bosh_release}/.final_builds #{target_bosh_release_path}"
|
29
|
+
sh "cp -R #{source_bosh_release}/config/final.yml #{target_bosh_release_path}/config"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Remove any large temporary tgz from internal bosh_release"
|
34
|
+
task :clean do
|
35
|
+
chdir(target_bosh_release_path) do
|
36
|
+
sh "ls .final_builds/**/*.tgz | xargs rm; true"
|
37
|
+
sh "ls releases/**/*.tgz | xargs rm; true"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
task :release => "bosh:release:clean"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "bosh_cli_plugin_redis"
|
5
|
+
spec.version = "0.2.0"
|
6
|
+
spec.authors = ["Dr Nic Williams"]
|
7
|
+
spec.email = ["drnicwilliams@gmail.com"]
|
8
|
+
spec.description = %q{Create dedicated Redis servers using Bosh}
|
9
|
+
spec.summary = %q{Create dedicated Redis servers using Bosh}
|
10
|
+
spec.homepage = ""
|
11
|
+
spec.license = "MIT"
|
12
|
+
|
13
|
+
spec.files = `git ls-files`.split($/)
|
14
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
|
18
|
+
spec.add_runtime_dependency "bosh_cli", "~> 1.5.0.pre"
|
19
|
+
spec.add_runtime_dependency "rake"
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
end
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
blobstore:
|
3
|
+
provider: s3
|
4
|
+
options:
|
5
|
+
bucket_name: redis-boshrelease
|
6
|
+
access_key_id: AKIAJPWUHOHV42IMTNQQ
|
7
|
+
secret_access_key: e3uIA4EnWpb9zy1YtWREr/0moGcEdky+2wLfprqb
|
8
|
+
encryption_key: cloudfoundry-community
|
9
|
+
min_cli_version: 1.5.0.pre.699
|
10
|
+
final_name: redis
|
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
packages:
|
3
|
+
- name: redis
|
4
|
+
version: 1
|
5
|
+
sha1: !binary |-
|
6
|
+
OGJlZjUyYzQ2ZmRlNWI5ZWMwYzliYzVkY2I2YjQ2MjYxYmYzYTEwOA==
|
7
|
+
fingerprint: !binary |-
|
8
|
+
MDY3Y2QwMjVmNjFlZjAxNjI1NzFhYTg2NTQwYTE1OGMwOWE3YzM2Ng==
|
9
|
+
dependencies: []
|
10
|
+
jobs:
|
11
|
+
- name: redis
|
12
|
+
version: 1
|
13
|
+
fingerprint: !binary |-
|
14
|
+
ODk5Mzk1NzViM2ZkZGZlYjc4ZTk0NjNiNmI2Y2E5MDY3ZTczMDI2Zg==
|
15
|
+
sha1: !binary |-
|
16
|
+
MmRmNzYwY2I0ZGJiODdhYzE0YTBiZGMwYzBhNTU5OTc2NWViMzU2Mg==
|
17
|
+
commit_hash: 59e77715
|
18
|
+
uncommitted_changes: true
|
19
|
+
name: redis
|
20
|
+
version: 1
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Then target that deployment file:
|
2
|
+
#
|
3
|
+
# $ bosh deployment path/to/file/above
|
4
|
+
#
|
5
|
+
# Then apply this template:
|
6
|
+
#
|
7
|
+
# $ bosh diff templates/aws/single_vm.yml.erb
|
8
|
+
#
|
9
|
+
---
|
10
|
+
name: NAME
|
11
|
+
director_uuid: UUID
|
12
|
+
networks: {}
|
13
|
+
properties:
|
14
|
+
redis:
|
15
|
+
resource: medium
|
16
|
+
security_group: redis-server
|
@@ -0,0 +1,107 @@
|
|
1
|
+
---
|
2
|
+
<%-
|
3
|
+
# Example source deployment file that can be used:
|
4
|
+
# ---
|
5
|
+
# name: NAME
|
6
|
+
# director_uuid: 4ae3a0f0-70a5-4c0d-95f2-7fafaefe8b9e
|
7
|
+
# networks: {}
|
8
|
+
# properties:
|
9
|
+
# redis:
|
10
|
+
# instance_type: m1.medium
|
11
|
+
# security_groups: redis-server
|
12
|
+
#
|
13
|
+
# Then target that deployment file:
|
14
|
+
#
|
15
|
+
# $ bosh deployment path/to/file/above
|
16
|
+
#
|
17
|
+
# Then apply this template:
|
18
|
+
#
|
19
|
+
# $ bosh diff templates/aws/single_vm.yml.erb
|
20
|
+
#
|
21
|
+
redis_sg = find("properties.redis.security_group")
|
22
|
+
redis_port = 6379
|
23
|
+
redis_password = random_string 12, :redis
|
24
|
+
redis_resource = find("properties.redis.resource")
|
25
|
+
-%>
|
26
|
+
name: <%= find("name") %>
|
27
|
+
director_uuid: <%= find("director_uuid") %>
|
28
|
+
|
29
|
+
release:
|
30
|
+
name: redis
|
31
|
+
version: latest
|
32
|
+
|
33
|
+
compilation:
|
34
|
+
workers: 10
|
35
|
+
network: default
|
36
|
+
reuse_compilation_vms: true
|
37
|
+
cloud_properties:
|
38
|
+
instance_type: m1.small
|
39
|
+
|
40
|
+
update:
|
41
|
+
canaries: 1
|
42
|
+
canary_watch_time: 30000-300000
|
43
|
+
update_watch_time: 30000-300000
|
44
|
+
max_in_flight: 4
|
45
|
+
max_errors: 1
|
46
|
+
|
47
|
+
networks:
|
48
|
+
- name: default
|
49
|
+
type: dynamic
|
50
|
+
cloud_properties:
|
51
|
+
security_groups:
|
52
|
+
- <%= redis_sg %>
|
53
|
+
|
54
|
+
resource_pools:
|
55
|
+
- name: small
|
56
|
+
network: default
|
57
|
+
size: <%= redis_resource == "small" ? 1 : 0 %>
|
58
|
+
stemcell:
|
59
|
+
name: bosh-stemcell
|
60
|
+
version: latest
|
61
|
+
cloud_properties:
|
62
|
+
instance_type: m1.small
|
63
|
+
|
64
|
+
- name: medium
|
65
|
+
network: default
|
66
|
+
size: <%= redis_resource == "medium" ? 1 : 0 %>
|
67
|
+
stemcell:
|
68
|
+
name: bosh-stemcell
|
69
|
+
version: latest
|
70
|
+
cloud_properties:
|
71
|
+
instance_type: m1.medium
|
72
|
+
|
73
|
+
- name: large
|
74
|
+
network: default
|
75
|
+
size: <%= redis_resource == "large" ? 1 : 0 %>
|
76
|
+
stemcell:
|
77
|
+
name: bosh-stemcell
|
78
|
+
version: latest
|
79
|
+
cloud_properties:
|
80
|
+
instance_type: m1.large
|
81
|
+
|
82
|
+
- name: xlarge
|
83
|
+
network: default
|
84
|
+
size: <%= redis_resource == "xlarge" ? 1 : 0 %>
|
85
|
+
stemcell:
|
86
|
+
name: bosh-stemcell
|
87
|
+
version: latest
|
88
|
+
cloud_properties:
|
89
|
+
instance_type: m1.xlarge
|
90
|
+
|
91
|
+
jobs:
|
92
|
+
- name: redis
|
93
|
+
template: redis
|
94
|
+
instances: 1
|
95
|
+
resource_pool: <%= redis_resource %>
|
96
|
+
networks:
|
97
|
+
- name: default
|
98
|
+
default:
|
99
|
+
- dns
|
100
|
+
- gateway
|
101
|
+
|
102
|
+
properties:
|
103
|
+
redis:
|
104
|
+
resource: <%= redis_resource %>
|
105
|
+
security_group: <%= redis_sg %>
|
106
|
+
port: <%= redis_port %>
|
107
|
+
password: <%= redis_password %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
resources:
|
3
|
+
- small
|
4
|
+
- medium
|
5
|
+
- large
|
6
|
+
- xlarge
|
7
|
+
|
8
|
+
properties:
|
9
|
+
- name: redis.resource
|
10
|
+
description: Resource/flavor of instance to use
|
11
|
+
- name: redis.security_group
|
12
|
+
description: Security group for instance(s). Must have TCP ports 22 & 6379 open.
|
13
|
+
default: default
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Then target that deployment file:
|
2
|
+
#
|
3
|
+
# $ bosh deployment path/to/file/above
|
4
|
+
#
|
5
|
+
# Then apply this template:
|
6
|
+
#
|
7
|
+
# $ bosh diff templates/openstack/single_vm.yml.erb
|
8
|
+
#
|
9
|
+
---
|
10
|
+
name: NAME
|
11
|
+
director_uuid: UUID
|
12
|
+
networks: {}
|
13
|
+
properties:
|
14
|
+
redis:
|
15
|
+
resource: medium
|
16
|
+
security_group: redis-server
|
@@ -0,0 +1,107 @@
|
|
1
|
+
---
|
2
|
+
<%-
|
3
|
+
# Example source deployment file that can be used:
|
4
|
+
# ---
|
5
|
+
# name: NAME
|
6
|
+
# director_uuid: 4ae3a0f0-70a5-4c0d-95f2-7fafaefe8b9e
|
7
|
+
# networks: {}
|
8
|
+
# properties:
|
9
|
+
# redis:
|
10
|
+
# instance_type: m1.medium
|
11
|
+
# security_groups: redis-server
|
12
|
+
#
|
13
|
+
# Then target that deployment file:
|
14
|
+
#
|
15
|
+
# $ bosh deployment path/to/file/above
|
16
|
+
#
|
17
|
+
# Then apply this template:
|
18
|
+
#
|
19
|
+
# $ bosh diff templates/openstack/single_vm.yml.erb
|
20
|
+
#
|
21
|
+
redis_sg = find("properties.redis.security_group")
|
22
|
+
redis_port = 6379
|
23
|
+
redis_password = random_string 12, :redis
|
24
|
+
redis_resource = find("properties.redis.resource")
|
25
|
+
-%>
|
26
|
+
name: <%= find("name") %>
|
27
|
+
director_uuid: <%= find("director_uuid") %>
|
28
|
+
|
29
|
+
release:
|
30
|
+
name: redis
|
31
|
+
version: latest
|
32
|
+
|
33
|
+
compilation:
|
34
|
+
workers: 10
|
35
|
+
network: default
|
36
|
+
reuse_compilation_vms: true
|
37
|
+
cloud_properties:
|
38
|
+
instance_type: m1.small
|
39
|
+
|
40
|
+
update:
|
41
|
+
canaries: 1
|
42
|
+
canary_watch_time: 30000-300000
|
43
|
+
update_watch_time: 30000-300000
|
44
|
+
max_in_flight: 4
|
45
|
+
max_errors: 1
|
46
|
+
|
47
|
+
networks:
|
48
|
+
- name: default
|
49
|
+
type: dynamic
|
50
|
+
cloud_properties:
|
51
|
+
security_groups:
|
52
|
+
- <%= redis_sg %>
|
53
|
+
|
54
|
+
resource_pools:
|
55
|
+
- name: small
|
56
|
+
network: default
|
57
|
+
size: <%= redis_resource == "small" ? 1 : 0 %>
|
58
|
+
stemcell:
|
59
|
+
name: bosh-stemcell
|
60
|
+
version: latest
|
61
|
+
cloud_properties:
|
62
|
+
instance_type: m1.small
|
63
|
+
|
64
|
+
- name: medium
|
65
|
+
network: default
|
66
|
+
size: <%= redis_resource == "medium" ? 1 : 0 %>
|
67
|
+
stemcell:
|
68
|
+
name: bosh-stemcell
|
69
|
+
version: latest
|
70
|
+
cloud_properties:
|
71
|
+
instance_type: m1.medium
|
72
|
+
|
73
|
+
- name: large
|
74
|
+
network: default
|
75
|
+
size: <%= redis_resource == "large" ? 1 : 0 %>
|
76
|
+
stemcell:
|
77
|
+
name: bosh-stemcell
|
78
|
+
version: latest
|
79
|
+
cloud_properties:
|
80
|
+
instance_type: m1.large
|
81
|
+
|
82
|
+
- name: xlarge
|
83
|
+
network: default
|
84
|
+
size: <%= redis_resource == "xlarge" ? 1 : 0 %>
|
85
|
+
stemcell:
|
86
|
+
name: bosh-stemcell
|
87
|
+
version: latest
|
88
|
+
cloud_properties:
|
89
|
+
instance_type: m1.xlarge
|
90
|
+
|
91
|
+
jobs:
|
92
|
+
- name: redis
|
93
|
+
template: redis
|
94
|
+
instances: 1
|
95
|
+
resource_pool: <%= redis_resource %>
|
96
|
+
networks:
|
97
|
+
- name: default
|
98
|
+
default:
|
99
|
+
- dns
|
100
|
+
- gateway
|
101
|
+
|
102
|
+
properties:
|
103
|
+
redis:
|
104
|
+
resource: <%= redis_resource %>
|
105
|
+
security_group: <%= redis_sg %>
|
106
|
+
port: <%= redis_port %>
|
107
|
+
password: <%= redis_password %>
|
@@ -0,0 +1,254 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
# for the #sh helper
|
4
|
+
require "rake"
|
5
|
+
require "rake/file_utils"
|
6
|
+
|
7
|
+
module Bosh::Cli::Command
|
8
|
+
class Redis < Base
|
9
|
+
include FileUtils
|
10
|
+
include Bosh::Cli::Validation
|
11
|
+
|
12
|
+
usage "redis"
|
13
|
+
desc "show micro bosh sub-commands"
|
14
|
+
def redis_help
|
15
|
+
say("bosh redis sub-commands:")
|
16
|
+
nl
|
17
|
+
cmds = Bosh::Cli::Config.commands.values.find_all {|c|
|
18
|
+
c.usage =~ /redis/
|
19
|
+
}
|
20
|
+
Bosh::Cli::Command::Help.list_commands(cmds)
|
21
|
+
end
|
22
|
+
|
23
|
+
usage "prepare redis"
|
24
|
+
desc "Prepare bosh for deploying one or more Redis services"
|
25
|
+
def prepare_redis
|
26
|
+
within_bosh_release do
|
27
|
+
# the releases/index.yml contains all the available release versions in an unordered
|
28
|
+
# hash of hashes in YAML format:
|
29
|
+
# ---
|
30
|
+
# builds:
|
31
|
+
# af61f03c5ad6327e0795402f1c458f2fc6f21201:
|
32
|
+
# version: 3
|
33
|
+
# 39c029d0af9effc6913f3333434b894ff6433638:
|
34
|
+
# version: 1
|
35
|
+
# 5f5d0a7fb577fec3c09408c94f7abbe2d52a042c:
|
36
|
+
# version: 4
|
37
|
+
# f044d47e0183f084db9dac5a6ef00d7bd21c8451:
|
38
|
+
# version: 2
|
39
|
+
release_index = YAML.load_file("releases/index.yml")
|
40
|
+
latest_version = release_index["builds"].values.inject(0) do |max_version, release|
|
41
|
+
version = release["version"]
|
42
|
+
max_version < version ? version : max_version
|
43
|
+
end
|
44
|
+
|
45
|
+
sh "bosh upload release releases/*-#{latest_version}.yml"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO - size must be valid
|
50
|
+
# TODO - name must be unique (cf services & bosh deployments)
|
51
|
+
|
52
|
+
usage "create redis"
|
53
|
+
desc "Create a Redis service deployed upon target bosh"
|
54
|
+
option "--name redis-<timestamp>", String, "Unique bosh deployment name"
|
55
|
+
option "--size small", String, "Size of provisioned VMs"
|
56
|
+
option "--security-group default", String, "Security group to assign to provisioned VMs"
|
57
|
+
def create_redis
|
58
|
+
auth_required
|
59
|
+
|
60
|
+
service_name = options[:name] || default_name
|
61
|
+
resource_size = options[:size] || default_size
|
62
|
+
security_group = options[:security_group] || default_security_group
|
63
|
+
redis_port = 6379
|
64
|
+
|
65
|
+
bosh_status # preload
|
66
|
+
nl
|
67
|
+
say "CPI: #{bosh_cpi}"
|
68
|
+
say "Deployment name: #{service_name.make_green}"
|
69
|
+
say "Resource size: #{resource_size.make_green}"
|
70
|
+
say "Security group: #{security_group.make_green}"
|
71
|
+
nl
|
72
|
+
unless confirmed?("Security group exists with ports 22 & #{redis_port}")
|
73
|
+
cancel_deployment
|
74
|
+
end
|
75
|
+
unless confirmed?("Creating redis service")
|
76
|
+
cancel_deployment
|
77
|
+
end
|
78
|
+
|
79
|
+
template_file = template_file("single_vm.yml.erb")
|
80
|
+
|
81
|
+
# Create an initial deployment file; upon which the CPI-specific template will be applied below
|
82
|
+
# Initial file will look like:
|
83
|
+
# ---
|
84
|
+
# name: NAME
|
85
|
+
# director_uuid: UUID
|
86
|
+
# networks: {}
|
87
|
+
# properties:
|
88
|
+
# redis:
|
89
|
+
# resource: medium
|
90
|
+
# security_group: redis-server
|
91
|
+
deployment_file = "deployments/redis/#{service_name}.yml"
|
92
|
+
step("Checking/creating #{redis_deployments_store_path} for deployment files",
|
93
|
+
"Failed to create #{redis_deployments_store_path} for deployment files", :fatal) do
|
94
|
+
mkdir_p(redis_deployments_store_path)
|
95
|
+
end
|
96
|
+
|
97
|
+
step("Creating deployment file #{deployment_file}",
|
98
|
+
"Failed to create deployment file #{deployment_file}", :fatal) do
|
99
|
+
File.open(deployment_file, "w") do |file|
|
100
|
+
file << {
|
101
|
+
"name" => service_name,
|
102
|
+
"director_uuid" => bosh_uuid,
|
103
|
+
"networks" => {},
|
104
|
+
"properties" => {
|
105
|
+
"redis" => {
|
106
|
+
"resource" => resource_size,
|
107
|
+
"security_group" => security_group
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}.to_yaml
|
111
|
+
end
|
112
|
+
|
113
|
+
stdout = Bosh::Cli::Config.output
|
114
|
+
Bosh::Cli::Config.output = nil
|
115
|
+
deployment_cmd(non_interactive: true).set_current(deployment_file)
|
116
|
+
biff_cmd(non_interactive: true).biff(template_file)
|
117
|
+
Bosh::Cli::Config.output = stdout
|
118
|
+
end
|
119
|
+
# re-set current deployment to show output
|
120
|
+
deployment_cmd.set_current(deployment_file)
|
121
|
+
deployment_cmd(non_interactive: options[:non_interactive]).perform
|
122
|
+
end
|
123
|
+
|
124
|
+
usage "show redis uri"
|
125
|
+
desc "Show the redis URI for connection via bosh DNS"
|
126
|
+
def show_redis_uri
|
127
|
+
load_bosh_and_validate_current_deployment
|
128
|
+
print service_uri
|
129
|
+
end
|
130
|
+
|
131
|
+
usage "delete redis"
|
132
|
+
desc "Delete current Redis service"
|
133
|
+
def delete_redis
|
134
|
+
load_bosh_and_validate_current_deployment
|
135
|
+
deployment_cmd(non_interactive: options[:non_interactive]).delete(deployment_name)
|
136
|
+
end
|
137
|
+
|
138
|
+
protected
|
139
|
+
|
140
|
+
def default_name
|
141
|
+
"redis-#{Time.now.to_i}"
|
142
|
+
end
|
143
|
+
|
144
|
+
def default_size
|
145
|
+
"small"
|
146
|
+
end
|
147
|
+
|
148
|
+
def default_security_group
|
149
|
+
"default"
|
150
|
+
end
|
151
|
+
|
152
|
+
def release_name
|
153
|
+
"redis"
|
154
|
+
end
|
155
|
+
|
156
|
+
def redis_deployments_store_path
|
157
|
+
"deployments/redis"
|
158
|
+
end
|
159
|
+
|
160
|
+
def bosh_release_dir
|
161
|
+
File.expand_path("../../../../../bosh_release", __FILE__)
|
162
|
+
end
|
163
|
+
|
164
|
+
def within_bosh_release(&block)
|
165
|
+
chdir(bosh_release_dir, &block)
|
166
|
+
end
|
167
|
+
|
168
|
+
def bosh_status
|
169
|
+
@bosh_status ||= begin
|
170
|
+
step("Fetching bosh information", "Cannot fetch bosh information", :fatal) do
|
171
|
+
@bosh_status = bosh_director_client.get_status
|
172
|
+
end
|
173
|
+
@bosh_status
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def bosh_uuid
|
178
|
+
bosh_status["uuid"]
|
179
|
+
end
|
180
|
+
|
181
|
+
def bosh_cpi
|
182
|
+
bosh_status["cpi"]
|
183
|
+
end
|
184
|
+
|
185
|
+
def template_file(file)
|
186
|
+
File.join(bosh_release_dir, "templates", bosh_cpi, file)
|
187
|
+
end
|
188
|
+
|
189
|
+
# TODO this is now a bosh cli command itself; use #director
|
190
|
+
def bosh_director_client
|
191
|
+
director
|
192
|
+
end
|
193
|
+
|
194
|
+
def deployment_cmd(options = {})
|
195
|
+
cmd = Bosh::Cli::Command::Deployment.new
|
196
|
+
options.each do |key, value|
|
197
|
+
cmd.add_option key.to_sym, value
|
198
|
+
end
|
199
|
+
cmd
|
200
|
+
end
|
201
|
+
|
202
|
+
def biff_cmd(options = {})
|
203
|
+
cmd = Bosh::Cli::Command::Biff.new
|
204
|
+
options.each do |key, value|
|
205
|
+
cmd.add_option key.to_sym, value
|
206
|
+
end
|
207
|
+
cmd
|
208
|
+
end
|
209
|
+
|
210
|
+
# TODO this is now a bosh cli command itself
|
211
|
+
def deployment_file
|
212
|
+
@current_deployment_file ||= ::Bosh::Cli::Command::Deployment.new.deployment
|
213
|
+
end
|
214
|
+
|
215
|
+
# TODO use bosh cli helpers to validate/require this
|
216
|
+
def load_bosh_and_validate_current_deployment
|
217
|
+
auth_required
|
218
|
+
unless File.exists?(deployment_file)
|
219
|
+
err "Target deployment file no longer exists: #{deployment_file}"
|
220
|
+
end
|
221
|
+
@deployment = YAML.load_file(deployment_file)
|
222
|
+
unless @deployment["release"] && @deployment["release"]["name"] == release_name
|
223
|
+
err "Target deployment file is not for redis service: #{deployment_file}"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def deployment_name
|
228
|
+
@deployment["name"]
|
229
|
+
end
|
230
|
+
|
231
|
+
def service_uri
|
232
|
+
password = @deployment["properties"]["redis"]["password"]
|
233
|
+
port = @deployment["properties"]["redis"]["port"]
|
234
|
+
db = 0
|
235
|
+
"redis://:#{password}@#{server_host}:#{port}/#{db}"
|
236
|
+
end
|
237
|
+
|
238
|
+
# returns the first DNS entry for the running instance
|
239
|
+
def server_host
|
240
|
+
@server_host ||= begin
|
241
|
+
vms = bosh_director_client.fetch_vm_state(deployment_name, use_cache: false)
|
242
|
+
if vms.empty?
|
243
|
+
err "Deployment has no running instances"
|
244
|
+
end
|
245
|
+
if vms.size > 1
|
246
|
+
say "#{"WARNING!".make_red} Deployment has more than 1 running instance (#{vms.size}); using first instance"
|
247
|
+
end
|
248
|
+
vm = vms.first
|
249
|
+
# bug in bosh dns means old dns entries might still point to this new VM
|
250
|
+
vm["dns"].select { |dns| dns =~ %r{#{deployment_name}} }.first
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bosh_cli_plugin_redis
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dr Nic Williams
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bosh_cli
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.5.0.pre
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.5.0.pre
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: bundler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
description: Create dedicated Redis servers using Bosh
|
63
|
+
email:
|
64
|
+
- drnicwilliams@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- ChangeLog.md
|
71
|
+
- Gemfile
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- bosh_cli_plugin_redis.gemspec
|
76
|
+
- bosh_release/.final_builds/jobs/redis/index.yml
|
77
|
+
- bosh_release/.final_builds/packages/redis/index.yml
|
78
|
+
- bosh_release/config/.gitkeep
|
79
|
+
- bosh_release/config/final.yml
|
80
|
+
- bosh_release/jobs/.gitkeep
|
81
|
+
- bosh_release/packages/.gitkeep
|
82
|
+
- bosh_release/releases/index.yml
|
83
|
+
- bosh_release/releases/redis-1.yml
|
84
|
+
- bosh_release/src/.gitkeep
|
85
|
+
- bosh_release/templates/aws/sample_deployment_file.yml
|
86
|
+
- bosh_release/templates/aws/single_vm.yml.erb
|
87
|
+
- bosh_release/templates/aws/spec
|
88
|
+
- bosh_release/templates/openstack/sample_deployment_file.yml
|
89
|
+
- bosh_release/templates/openstack/single_vm.yml.erb
|
90
|
+
- lib/bosh/cli/commands/redis.rb
|
91
|
+
homepage: ''
|
92
|
+
licenses:
|
93
|
+
- MIT
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
hash: 4389263479679262262
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
hash: 4389263479679262262
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 1.8.25
|
119
|
+
signing_key:
|
120
|
+
specification_version: 3
|
121
|
+
summary: Create dedicated Redis servers using Bosh
|
122
|
+
test_files: []
|