ops_manager_cli 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Dockerfile +6 -9
- data/Gemfile +0 -1
- data/README.md +12 -5
- data/lib/ops_manager/api/base.rb +26 -0
- data/lib/ops_manager/api/opsman.rb +49 -59
- data/lib/ops_manager/api/pivnet.rb +22 -42
- data/lib/ops_manager/appliance_deployment.rb +99 -27
- data/lib/ops_manager/cli.rb +11 -17
- data/lib/ops_manager/deployments/vsphere.rb +9 -7
- data/lib/ops_manager/director_template_generator.rb +19 -16
- data/lib/ops_manager/installation.rb +1 -1
- data/lib/ops_manager/installation_runner.rb +10 -12
- data/lib/ops_manager/product_deployment.rb +3 -1
- data/lib/ops_manager/product_installation.rb +1 -1
- data/lib/ops_manager/product_template_generator.rb +12 -8
- data/lib/ops_manager/semver.rb +8 -0
- data/lib/ops_manager/version.rb +1 -1
- data/ops_manager.gemspec +1 -1
- metadata +12 -14
- data/bin/clean_tapes +0 -19
- data/lib/ops_manager/installation_settings.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 275c833c1e7b72ba2ab90fa53b3ef0025556907f
|
4
|
+
data.tar.gz: 435c7bde99641128d0f9fb57f108918f4a92cd16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41210680cd70a74580a55afd53368ac4e985b1e7c9b6cf6e08bd1a900711fd3c19252fa26d82042d860fbbb1836ea79708746e2473edb37de63a4dfca225a836
|
7
|
+
data.tar.gz: 507f8d1f8929e727e9fd6cf75955d3226150bd11251ea4baeb1099b22dd630d7e4df944780ebfe72866615130779d591f355fcc740fd1842a194aca3193aa450
|
data/.travis.yml
CHANGED
data/Dockerfile
CHANGED
@@ -1,28 +1,25 @@
|
|
1
1
|
FROM ruby:2.3.0
|
2
2
|
|
3
3
|
ENV GEM_NAME ops_manager_cli
|
4
|
-
ENV GEM_VERSION 0.
|
4
|
+
ENV GEM_VERSION 0.4.0
|
5
5
|
ENV OVFTOOL_VERSION 4.1.0-2459827
|
6
|
-
ENV OVFTOOL_INSTALLER
|
7
|
-
ARG DOWNLOAD_URL
|
8
|
-
ENV DOWNLOAD_URL ${DOWNLOAD_URL}
|
6
|
+
ENV OVFTOOL_INSTALLER VMware-ovftool-${OVFTOOL_VERSION}-lin.x86_64.bundle
|
7
|
+
ARG DOWNLOAD_URL
|
9
8
|
|
10
9
|
# ================== Installs OVF tools ==============
|
11
10
|
RUN echo $DOWNLOAD_URL
|
12
|
-
RUN wget -
|
13
|
-
&& wget -q ${DOWNLOAD_URL}.sha256 \
|
14
|
-
&& sha256sum -c ${OVFTOOL_INSTALLER}.sha256 \
|
11
|
+
RUN wget -v ${DOWNLOAD_URL} \
|
15
12
|
&& sh ${OVFTOOL_INSTALLER} -p /usr/local --eulas-agreed --required \
|
16
13
|
&& rm -f ${OVFTOOL_INSTALLER}*
|
17
14
|
|
18
15
|
# ================== Installs Spruce ==============
|
19
|
-
RUN wget --no-check-certificate
|
16
|
+
RUN wget -v --no-check-certificate https://github.com/geofffranks/spruce/releases/download/v1.0.1/spruce_1.0.1_linux_amd64.tar.gz \
|
20
17
|
&& tar -xvf spruce_1.0.1_linux_amd64.tar.gz \
|
21
18
|
&& chmod +x /spruce_1.0.1_linux_amd64/spruce \
|
22
19
|
&& ln -s /spruce_1.0.1_linux_amd64/spruce /usr/bin/.
|
23
20
|
|
24
21
|
# ================== Installs JQ ==============
|
25
|
-
RUN wget -
|
22
|
+
RUN wget -v -O /usr/local/bin/jq --no-check-certificate https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
|
26
23
|
RUN chmod +x /usr/local/bin/jq
|
27
24
|
|
28
25
|
# ================== Installs ops_manager_cli gem ==============
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,16 +1,17 @@
|
|
1
|
-
# OpsManagerCli
|
1
|
+
# OpsManagerCli [![Build Status](https://travis-ci.org/compozed/ops_manager_cli.png?branch=master)](https://travis-ci.org/compozed/ops_manager_cli) [![Code Climate](https://codeclimate.com/github/compozed/ops_manager_cli.png)](https://codeclimate.com/github/compozed/ops_manager_cli)
|
2
|
+
|
2
3
|
|
3
4
|
Command line tool to interact with Pivotal Operations Manager through its API, because GUIs are evil.
|
4
5
|
|
5
6
|
Questions? Pop in our [slack channel](https://cloudfoundry.slack.com/messages/ops_manager_cli/)!
|
6
7
|
|
7
|
-
*Please note that the APIs of Ops Manager is experimental at this point. Changes to the APIs with new Ops Manager releases may break functionality
|
8
|
+
*Please note that the APIs of Ops Manager is experimental at this point. Changes to the APIs with new Ops Manager releases may break functionality.*
|
8
9
|
|
9
10
|
## Features
|
10
11
|
|
11
12
|
### Core features
|
12
13
|
|
13
|
-
- Support for deploying on vSphere infrastructure
|
14
|
+
- Support for deploying on vSphere infrastructure
|
14
15
|
- Deploy/Upgrade Ops Manager appliance
|
15
16
|
- Deploy/Upgrade product tiles
|
16
17
|
- Generate config settings templates for product tiles deployments
|
@@ -25,11 +26,17 @@ Questions? Pop in our [slack channel](https://cloudfoundry.slack.com/messages/op
|
|
25
26
|
|
26
27
|
### Limitations:
|
27
28
|
|
28
|
-
- No support for enabling and running errands
|
29
|
+
- No support for enabling and running errands for ops_manager **< 1.7.x**
|
30
|
+
|
29
31
|
|
30
32
|
### Test with Ops Manager Version
|
31
33
|
|
32
|
-
- up to 1.
|
34
|
+
- up to 1.8.3.0
|
35
|
+
|
36
|
+
## Upgrading OpsManager appliance from **1.7.x** to **1.8.x**
|
37
|
+
|
38
|
+
On ops_manager_cli **>=0.4.0** support for upgrading to **1.8.x** was removed.
|
39
|
+
Use ops_manager_cli **0.3.1** to upgrade from **1.7.x** -> **1.8.x**.
|
33
40
|
|
34
41
|
## Dependencies
|
35
42
|
|
data/lib/ops_manager/api/base.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
1
|
class OpsManager
|
2
2
|
module Api
|
3
3
|
class Base
|
4
|
+
attr_reader :silent
|
5
|
+
|
4
6
|
include OpsManager::Logging
|
5
7
|
|
8
|
+
def initialize(opts = {})
|
9
|
+
@silent = opts[:silent]
|
10
|
+
end
|
11
|
+
|
12
|
+
%w{ get post put delete multipart_post}.each do |m|
|
13
|
+
define_method "authenticated_#{m}" do |endpoint, opts = {}|
|
14
|
+
send(m, endpoint, add_authentication(opts))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
6
18
|
def get(endpoint, opts = {})
|
7
19
|
uri = uri_for(endpoint)
|
8
20
|
http = http_for(uri)
|
@@ -136,6 +148,20 @@ class OpsManager
|
|
136
148
|
http.read_timeout = 1200
|
137
149
|
end
|
138
150
|
end
|
151
|
+
|
152
|
+
def add_authentication(opts={})
|
153
|
+
opts[:headers] ||= {}
|
154
|
+
opts[:headers]['Authorization'] ||= authorization_header
|
155
|
+
opts
|
156
|
+
end
|
157
|
+
|
158
|
+
def say_green(str)
|
159
|
+
puts str.green unless silent
|
160
|
+
end
|
161
|
+
|
162
|
+
def print_green(str)
|
163
|
+
print str.green unless silent
|
164
|
+
end
|
139
165
|
end
|
140
166
|
end
|
141
167
|
end
|
@@ -6,31 +6,18 @@ require "uaa"
|
|
6
6
|
class OpsManager
|
7
7
|
module Api
|
8
8
|
class Opsman < OpsManager::Api::Base
|
9
|
-
attr_reader :silent
|
10
|
-
|
11
|
-
def initialize(opts = {})
|
12
|
-
@silent = opts[:silent]
|
13
|
-
end
|
14
|
-
|
15
|
-
def say_green(str)
|
16
|
-
puts str.green unless silent
|
17
|
-
end
|
18
|
-
|
19
|
-
def print_green(str)
|
20
|
-
print str.green unless silent
|
21
|
-
end
|
22
|
-
|
23
9
|
def create_user
|
24
10
|
body= "setup[decryption_passphrase]=#{password}&setup[decryption_passphrase_confirmation]=#{password}&setup[eula_accepted]=true&setup[identity_provider]=internal&setup[admin_user_name]=#{username}&setup[admin_password]=#{password}&setup[admin_password_confirmation]=#{password}"
|
25
11
|
post("/api/v0/setup" , body: body)
|
26
12
|
end
|
27
13
|
|
28
14
|
def upload_installation_settings(filepath = 'installation_settings.json')
|
29
|
-
|
15
|
+
print_green '====> Uploading installation settings ...'
|
30
16
|
yaml = UploadIO.new(filepath, 'text/yaml')
|
31
17
|
opts = { "installation[file]" => yaml}
|
32
18
|
res = authenticated_multipart_post("/api/installation_settings", opts)
|
33
19
|
raise OpsManager::InstallationSettingsError.new(res.body) unless res.code == '200'
|
20
|
+
say_green 'done'
|
34
21
|
res
|
35
22
|
end
|
36
23
|
|
@@ -39,39 +26,48 @@ class OpsManager
|
|
39
26
|
end
|
40
27
|
|
41
28
|
def get_installation_settings(opts = {})
|
42
|
-
|
43
|
-
authenticated_get("/api/installation_settings", opts)
|
29
|
+
print_green '====> Downloading installation settings ...'
|
30
|
+
res = authenticated_get("/api/installation_settings", opts)
|
31
|
+
say_green 'done'
|
32
|
+
res
|
44
33
|
end
|
45
34
|
|
46
35
|
def upload_installation_assets
|
47
|
-
|
36
|
+
print_green( '====> Uploading installation assets ...')
|
48
37
|
zip = UploadIO.new("#{Dir.pwd}/installation_assets.zip", 'application/x-zip-compressed')
|
49
38
|
opts = {:passphrase => @password, "installation[file]" => zip }
|
50
|
-
multipart_post( "/api/v0/installation_asset_collection", opts)
|
39
|
+
res = multipart_post( "/api/v0/installation_asset_collection", opts)
|
40
|
+
say_green 'done'
|
41
|
+
res
|
51
42
|
end
|
52
43
|
|
53
44
|
def get_installation_assets
|
54
45
|
opts = { write_to: "installation_assets.zip" }
|
55
|
-
say_green
|
56
|
-
authenticated_get("/api/v0/installation_asset_collection", opts)
|
46
|
+
say_green '====> Download installation assets ...'
|
47
|
+
res = authenticated_get("/api/v0/installation_asset_collection", opts)
|
48
|
+
say_green 'done'
|
49
|
+
res
|
57
50
|
end
|
58
51
|
|
59
52
|
def delete_products(opts = {})
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
print_green '====> Deleating unused products ...'
|
54
|
+
res = authenticated_delete('/api/v0/products', opts)
|
55
|
+
say_green 'done'
|
56
|
+
res
|
63
57
|
end
|
64
58
|
|
65
59
|
def trigger_installation(opts = {})
|
66
|
-
print_green('====> Applying changes
|
67
|
-
authenticated_post('/api/v0/installations', opts)
|
60
|
+
print_green('====> Applying changes')
|
61
|
+
res = authenticated_post('/api/v0/installations', opts)
|
62
|
+
raise OpsManager::InstallationError.new(res.body) if res.code =~ /422/
|
63
|
+
res
|
68
64
|
end
|
69
65
|
|
70
66
|
def add_staged_products(name, version)
|
71
|
-
print_green( "====> Adding available product to the installation...")
|
67
|
+
print_green( "====> Adding available product to the installation ...")
|
72
68
|
body = "name=#{name}&product_version=#{version}"
|
73
69
|
res = authenticated_post('/api/v0/staged/products', body: body)
|
74
|
-
raise OpsManager::ProductDeploymentError.new(res.body) if res.code
|
70
|
+
raise OpsManager::ProductDeploymentError.new(res.body) if res.code =~ /404|500/
|
75
71
|
say_green('done')
|
76
72
|
res
|
77
73
|
end
|
@@ -91,21 +87,24 @@ class OpsManager
|
|
91
87
|
end
|
92
88
|
|
93
89
|
def get_installations(opts = {})
|
94
|
-
|
90
|
+
print_green '====> Getting installations ...'
|
91
|
+
res = authenticated_get('/api/v0/installations')
|
92
|
+
say_green 'done'
|
93
|
+
res
|
95
94
|
end
|
96
95
|
|
97
96
|
def upgrade_product_installation(guid, product_version)
|
98
|
-
|
97
|
+
print_green "====> Bumping product installation #{guid} product_version to #{product_version} ..."
|
99
98
|
opts = { to_version: product_version }
|
100
|
-
|
101
|
-
res = put("/api/v0/staged/products/#{guid}", opts)
|
99
|
+
res = authenticated_put("/api/v0/staged/products/#{guid}", opts)
|
102
100
|
raise OpsManager::UpgradeError.new(res.body) unless res.code == '200'
|
101
|
+
say_green 'done'
|
103
102
|
res
|
104
103
|
end
|
105
104
|
|
106
105
|
def upload_product(filepath)
|
107
106
|
file = "#{filepath}"
|
108
|
-
cmd = "curl -k \"https://#{target}/api/v0/available_products\" -F 'product[file]=@#{file}' -X POST -H 'Authorization: Bearer #{access_token}'"
|
107
|
+
cmd = "curl -s -k \"https://#{target}/api/v0/available_products\" -F 'product[file]=@#{file}' -X POST -H 'Authorization: Bearer #{access_token}'"
|
109
108
|
logger.info "running cmd: #{cmd}"
|
110
109
|
body = `#{cmd}`
|
111
110
|
logger.info "Upload product response: #{body}"
|
@@ -116,24 +115,29 @@ class OpsManager
|
|
116
115
|
authenticated_get("/api/v0/available_products")
|
117
116
|
end
|
118
117
|
|
119
|
-
def
|
120
|
-
|
121
|
-
directors = products.select{ |i| i.fetch('name') =~/p-bosh|microbosh/ }
|
122
|
-
versions = directors.inject([]){ |r, i| r << OpsManager::Semver.new(i.fetch('product_version')) }
|
123
|
-
versions.sort.last.to_s.gsub(/.0$/,'')
|
124
|
-
|
118
|
+
def get_diagnostic_report
|
119
|
+
authenticated_get("/api/v0/diagnostic_report")
|
125
120
|
rescue Errno::ETIMEDOUT , Errno::EHOSTUNREACH, Net::HTTPFatalError, Net::OpenTimeout
|
126
121
|
nil
|
127
122
|
end
|
128
123
|
|
129
|
-
|
130
124
|
def import_stemcell(filepath)
|
131
125
|
return unless filepath
|
132
|
-
say_green('====> Uploading stemcell...')
|
133
126
|
tar = UploadIO.new(filepath, 'multipart/form-data')
|
127
|
+
print_green "====> Uploading stemcell: #{tar} ..."
|
134
128
|
opts = { "stemcell[file]" => tar }
|
135
|
-
res =
|
129
|
+
res = nil
|
130
|
+
|
131
|
+
3.times do
|
132
|
+
res = authenticated_multipart_post("/api/v0/stemcells", opts)
|
133
|
+
case res.code
|
134
|
+
when '200' ; break
|
135
|
+
when '503' ; sleep(60)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
136
139
|
raise OpsManager::StemcellUploadError.new(res.body) unless res.code == '200'
|
140
|
+
say_green 'done'
|
137
141
|
res
|
138
142
|
end
|
139
143
|
|
@@ -150,24 +154,13 @@ class OpsManager
|
|
150
154
|
end
|
151
155
|
|
152
156
|
def get_token
|
153
|
-
token_issuer.owner_password_grant(
|
157
|
+
token_issuer.owner_password_grant(username, password, 'opsman.admin').tap do |token|
|
154
158
|
logger.info "UAA Token: #{token.inspect}"
|
155
159
|
end
|
156
160
|
rescue CF::UAA::TargetError
|
157
161
|
nil
|
158
162
|
end
|
159
163
|
|
160
|
-
def authenticated_get(endpoint, opts = {})
|
161
|
-
get(endpoint, add_authentication(opts))
|
162
|
-
end
|
163
|
-
|
164
|
-
def authenticated_post(endpoint, opts = {})
|
165
|
-
post(endpoint, add_authentication(opts))
|
166
|
-
end
|
167
|
-
|
168
|
-
def authenticated_multipart_post(endpoint, opts = {})
|
169
|
-
multipart_post(endpoint, add_authentication(opts))
|
170
|
-
end
|
171
164
|
|
172
165
|
private
|
173
166
|
def token_issuer
|
@@ -179,11 +172,8 @@ class OpsManager
|
|
179
172
|
@access_token ||= get_token.info['access_token']
|
180
173
|
end
|
181
174
|
|
182
|
-
|
183
|
-
|
184
|
-
opts[:headers] ||= {}
|
185
|
-
opts[:headers]['Authorization'] ||= "Bearer #{access_token}"
|
186
|
-
opts
|
175
|
+
def authorization_header
|
176
|
+
"Bearer #{access_token}"
|
187
177
|
end
|
188
178
|
end
|
189
179
|
end
|
@@ -2,64 +2,44 @@ class OpsManager
|
|
2
2
|
module Api
|
3
3
|
class Pivnet < OpsManager::Api::Base
|
4
4
|
|
5
|
-
def
|
6
|
-
|
5
|
+
def get_product_releases(product_slug, opts = {})
|
6
|
+
authenticated_get("/api/v2/products/#{product_slug}/releases", opts)
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def accept_product_release_eula(product_slug, release_id)
|
10
|
+
print_green("====> Accepting #{product_slug} release #{release_id} eula ...")
|
11
|
+
res = authenticated_post("/api/v2/products/#{product_slug}/releases/#{release_id}/eula_acceptance")
|
12
|
+
say_green "done"
|
13
|
+
res
|
14
|
+
end
|
11
15
|
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
def get_product_release_files(product_slug, release_id)
|
17
|
+
authenticated_get("/api/v2/products/#{product_slug}/releases/#{release_id}/product_files")
|
18
|
+
end
|
15
19
|
|
16
|
-
|
17
|
-
|
20
|
+
def download_product_release_file(product_slug, release_id, file_id, opts = {})
|
21
|
+
print_green "====> Downloading stemcell: #{opts[:write_to]} ..."
|
22
|
+
res = authenticated_post("/api/v2/products/#{product_slug}/releases/#{release_id}/product_files/#{file_id}/download", opts)
|
23
|
+
say_green "done"
|
24
|
+
res
|
18
25
|
end
|
19
26
|
|
20
27
|
def get_authentication
|
21
|
-
|
22
|
-
|
23
|
-
res = get("/api/v2/authentication", opts)
|
28
|
+
say_green "====> Authentication to Pivnet"
|
29
|
+
res = authenticated_get("/api/v2/authentication")
|
24
30
|
raise OpsManager::PivnetAuthenticationError.new(res.body) unless res.code == '200'
|
25
31
|
res
|
26
32
|
end
|
27
33
|
|
28
34
|
private
|
29
|
-
|
30
|
-
def accept_release_eula(release_id)
|
31
|
-
puts "====> Accepting stemcell eula ...".green
|
32
|
-
opts = { headers: { 'Authorization' => "Token #{pivnet_token}" } }
|
33
|
-
post("/api/v2/products/stemcells/releases/#{release_id}/eula_acceptance", opts)
|
34
|
-
end
|
35
|
-
|
36
|
-
def download_product(release_id, product_file_id, stemcell_path)
|
37
|
-
opts = { write_to: stemcell_path, headers: { 'Authorization' => "Token #{pivnet_token}" } }
|
38
|
-
post("/api/v2/products/stemcells/releases/#{release_id}/product_files/#{product_file_id}/download", opts)
|
39
|
-
end
|
40
|
-
|
41
|
-
def get_stemcell_releases(opts = {})
|
42
|
-
get("/api/v2/products/stemcells/releases", opts)
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_product_files(release_id, opts = {})
|
46
|
-
get("/api/v2/products/stemcells/releases/#{release_id}/product_files",opts)
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_release_for(stemcell_version)
|
50
|
-
releases = JSON.parse(get_stemcell_releases.body).fetch('releases')
|
51
|
-
releases.select{ |r| r.fetch('version') == stemcell_version }.first
|
52
|
-
end
|
53
|
-
|
54
|
-
def get_product_file_for(release_id, filename_regex)
|
55
|
-
products = JSON.parse(get_product_files(release_id).body).fetch('product_files')
|
56
|
-
products.select{ |r| r.fetch('aws_object_key') =~ filename_regex }.first
|
57
|
-
end
|
58
|
-
|
59
35
|
def target
|
60
36
|
@target ||= "network.pivotal.io"
|
61
37
|
end
|
62
38
|
|
39
|
+
def authorization_header
|
40
|
+
"Token #{pivnet_token}"
|
41
|
+
end
|
42
|
+
|
63
43
|
def pivnet_token
|
64
44
|
@pivnet_token ||= OpsManager.get_conf(:pivnet_token)
|
65
45
|
end
|
@@ -1,14 +1,15 @@
|
|
1
1
|
require "ops_manager/api/opsman"
|
2
2
|
require "ops_manager/api/pivnet"
|
3
|
-
require "ops_manager/installation_settings"
|
4
3
|
require 'ops_manager/configs/opsman_deployment'
|
4
|
+
require 'fileutils'
|
5
5
|
|
6
6
|
class OpsManager::ApplianceDeployment
|
7
7
|
extend Forwardable
|
8
|
-
def_delegators :pivnet_api, :
|
8
|
+
def_delegators :pivnet_api, :get_product_releases, :accept_product_release_eula,
|
9
|
+
:get_product_release_files, :download_product_release_file
|
9
10
|
def_delegators :opsman_api, :create_user, :trigger_installation, :get_installation_assets,
|
10
|
-
:get_installation_settings, :
|
11
|
-
:password, :username, :
|
11
|
+
:get_installation_settings, :get_diagnostic_report, :upload_installation_assets,
|
12
|
+
:import_stemcell, :target, :password, :username, :ops_manager_version=
|
12
13
|
|
13
14
|
attr_reader :config_file
|
14
15
|
|
@@ -26,15 +27,17 @@ class OpsManager::ApplianceDeployment
|
|
26
27
|
|
27
28
|
case
|
28
29
|
when current_version.empty?
|
29
|
-
puts "No OpsManager deployed at #{
|
30
|
+
puts "No OpsManager deployed at #{config.ip}. Deploying ...".green
|
30
31
|
deploy
|
31
32
|
create_first_user
|
32
33
|
when current_version < desired_version then
|
33
|
-
puts "OpsManager at #{
|
34
|
+
puts "OpsManager at #{config.ip} version is #{current_version}. Upgrading to #{desired_version} .../".green
|
34
35
|
upgrade
|
35
36
|
when current_version == desired_version then
|
36
|
-
puts "OpsManager at #{
|
37
|
+
puts "OpsManager at #{config.ip} version is already #{config.desired_version}. Skiping ...".green
|
37
38
|
end
|
39
|
+
|
40
|
+
puts '====> Finish!'.green
|
38
41
|
end
|
39
42
|
|
40
43
|
def deploy
|
@@ -48,38 +51,107 @@ class OpsManager::ApplianceDeployment
|
|
48
51
|
end
|
49
52
|
|
50
53
|
def create_first_user
|
51
|
-
puts '====> Creating initial user
|
54
|
+
puts '====> Creating initial user'.green
|
52
55
|
until( create_user.code.to_i == 200) do
|
53
|
-
print '.'.green ; sleep 1
|
56
|
+
print ' .'.green ; sleep 1
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
def upgrade
|
58
61
|
get_installation_assets
|
59
|
-
|
62
|
+
download_current_stemcells
|
60
63
|
stop_current_vm(current_vm_name)
|
61
64
|
deploy
|
62
65
|
upload_installation_assets
|
63
|
-
|
66
|
+
provision_stemcells
|
64
67
|
OpsManager::InstallationRunner.trigger!.wait_for_result
|
68
|
+
end
|
65
69
|
|
66
|
-
|
70
|
+
def list_current_stemcells
|
71
|
+
JSON.parse(installation_settings).fetch('products').inject([]) do |a, p|
|
72
|
+
a << p['stemcell'].fetch('version')
|
73
|
+
end
|
67
74
|
end
|
68
75
|
|
76
|
+
# Finds available stemcell's pivotal network release.
|
77
|
+
# If it can not find the exact version it will try to find the newest minor version available.
|
78
|
+
# #
|
79
|
+
# @param version [String] the version number, eg: '2362.17'
|
80
|
+
# @return release_id [Integer] the pivotal netowkr release id of the found stemcell.
|
81
|
+
def find_stemcell_release(version)
|
82
|
+
version = OpsManager::Semver.new(version)
|
83
|
+
releases = stemcell_releases.collect do |r|
|
84
|
+
{
|
85
|
+
release_id: r['id'],
|
86
|
+
version: OpsManager::Semver.new(r['version']),
|
87
|
+
}
|
88
|
+
end
|
89
|
+
releases.keep_if{ |r| r[:version].major == version.major }
|
90
|
+
exact_version = releases.select {|r| r[:version] == version }
|
91
|
+
return exact_version.first[:release_id] unless exact_version.empty?
|
92
|
+
releases_sorted_by_version = releases.sort_by{ |r| r[:version].minor }.reverse
|
93
|
+
return releases_sorted_by_version.first[:release_id] unless releases_sorted_by_version.empty?
|
94
|
+
end
|
95
|
+
|
96
|
+
# Finds stemcell's pivotal network release file.
|
97
|
+
# #
|
98
|
+
# @param release_id [String] the version number, eg: '2362.17'
|
99
|
+
# @param filename [Regex] the version number, eg: /vsphere/
|
100
|
+
# @return id and name [Array] the pivotal network file ID and Filename for the matching stemcell.
|
101
|
+
def find_stemcell_file(release_id, filename)
|
102
|
+
files = JSON.parse(get_product_release_files('stemcells', release_id).body).fetch('product_files')
|
103
|
+
file = files.select{ |r| r.fetch('aws_object_key') =~ filename }.first
|
104
|
+
return file['id'], file['aws_object_key'].split('/')[-1]
|
105
|
+
end
|
106
|
+
|
107
|
+
# Lists all the available stemcells in the current installation_settings.
|
108
|
+
# Downloads those stemcells.
|
109
|
+
def download_current_stemcells
|
110
|
+
puts "Downloading existing stemcells ...".green
|
111
|
+
FileUtils.mkdir_p current_stemcell_dir
|
112
|
+
list_current_stemcells.each do |stemcell_version|
|
113
|
+
release_id = find_stemcell_release(stemcell_version)
|
114
|
+
accept_product_release_eula('stemcells', release_id )
|
115
|
+
file_id, file_name = find_stemcell_file(release_id, /vsphere/)
|
116
|
+
download_product_release_file('stemcells', release_id, file_id, write_to: "#{current_stemcell_dir}/#{file_name}")
|
117
|
+
end
|
118
|
+
end
|
69
119
|
|
70
120
|
def new_vm_name
|
71
121
|
@new_vm_name ||= "#{config.name}-#{config.desired_version}"
|
72
122
|
end
|
73
123
|
|
74
|
-
private
|
75
124
|
def current_version
|
76
|
-
@current_version ||= OpsManager::Semver.new(
|
125
|
+
@current_version ||= OpsManager::Semver.new(version_from_diagnostic_report)
|
77
126
|
end
|
78
127
|
|
79
128
|
def desired_version
|
80
129
|
@desired_version ||= OpsManager::Semver.new(config.desired_version)
|
81
130
|
end
|
82
131
|
|
132
|
+
def provision_stemcells
|
133
|
+
Dir.glob("#{current_stemcell_dir}/*").each do |stemcell_filepath|
|
134
|
+
import_stemcell(stemcell_filepath)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
def diagnostic_report
|
140
|
+
@diagnostic_report ||= get_diagnostic_report
|
141
|
+
end
|
142
|
+
|
143
|
+
def version_from_diagnostic_report
|
144
|
+
return unless diagnostic_report
|
145
|
+
version = parsed_diagnostic_report
|
146
|
+
.fetch("versions")
|
147
|
+
.fetch("release_version")
|
148
|
+
version.gsub(/.0$/,'')
|
149
|
+
end
|
150
|
+
|
151
|
+
def parsed_diagnostic_report
|
152
|
+
JSON.parse(diagnostic_report.body)
|
153
|
+
end
|
154
|
+
|
83
155
|
def current_vm_name
|
84
156
|
@current_vm_name ||= "#{config.name}-#{current_version}"
|
85
157
|
end
|
@@ -88,14 +160,6 @@ class OpsManager::ApplianceDeployment
|
|
88
160
|
@desired_vm_name ||= "#{config.name}-#{config.desired_version}"
|
89
161
|
end
|
90
162
|
|
91
|
-
def provision_missing_stemcells
|
92
|
-
puts '====> Reprovisioning missing stemcells...'.green
|
93
|
-
installation_settings.stemcells.each do |s|
|
94
|
-
download_stemcell(s.fetch(:version), s.fetch(:file), /vsphere/)
|
95
|
-
import_stemcell(s.fetch(:file))
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
163
|
def pivnet_api
|
100
164
|
@pivnet_api ||= OpsManager::Api::Pivnet.new
|
101
165
|
end
|
@@ -109,15 +173,23 @@ class OpsManager::ApplianceDeployment
|
|
109
173
|
@config ||= OpsManager::Configs::OpsmanDeployment.new(parsed_yml)
|
110
174
|
end
|
111
175
|
|
176
|
+
def desired_version?(version)
|
177
|
+
!!(desired_version.to_s =~/#{version}/)
|
178
|
+
end
|
179
|
+
|
112
180
|
def installation_settings
|
113
|
-
@installation_settings ||=
|
181
|
+
@installation_settings ||= get_installation_settings.body
|
114
182
|
end
|
115
183
|
|
116
|
-
def
|
117
|
-
|
184
|
+
def get_stemcell_releases
|
185
|
+
get_product_releases('stemcells')
|
118
186
|
end
|
119
187
|
|
120
|
-
def
|
121
|
-
|
188
|
+
def stemcell_releases
|
189
|
+
@stemcell_releases ||= JSON.parse(get_stemcell_releases.body).fetch('releases')
|
190
|
+
end
|
191
|
+
|
192
|
+
def current_stemcell_dir
|
193
|
+
"/tmp/current_stemcells"
|
122
194
|
end
|
123
195
|
end
|
data/lib/ops_manager/cli.rb
CHANGED
@@ -75,19 +75,7 @@ class OpsManager
|
|
75
75
|
class DeleteUnusedProducts < Clamp::Command
|
76
76
|
|
77
77
|
def execute
|
78
|
-
OpsManager.new.delete_products
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
class GetUaaToken < Clamp::Command
|
83
|
-
def execute
|
84
|
-
puts OpsManager::Api::Opsman.new.get_token.info.fetch('access_token')
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
class SSH < Clamp::Command
|
89
|
-
def execute
|
90
|
-
`ssh ubuntu@#{OpsManager.get_conf(:target)}`
|
78
|
+
OpsManager::Api::Opsman.new.delete_products
|
91
79
|
end
|
92
80
|
end
|
93
81
|
|
@@ -106,7 +94,7 @@ class OpsManager
|
|
106
94
|
if @installation_id == "last"
|
107
95
|
puts OpsManager::Installation.all.last.logs
|
108
96
|
else
|
109
|
-
puts OpsManager::Installation.new(@installation_id).logs
|
97
|
+
puts OpsManager::Installation.new(@installation_id.to_i).logs
|
110
98
|
end
|
111
99
|
end
|
112
100
|
end
|
@@ -119,7 +107,7 @@ class OpsManager
|
|
119
107
|
|
120
108
|
class Curl < Clamp::Command
|
121
109
|
option ['-X', '--http-method'], "HTTP_METHOD", "HTTP Method (GET,POST)", default: 'GET'
|
122
|
-
parameter "ENDPOINT", "OpsManager api endpoint. eg: /v0/installation_settings", required: true
|
110
|
+
parameter "ENDPOINT", "OpsManager api endpoint. eg: /api/v0/installation_settings", required: true
|
123
111
|
|
124
112
|
def execute
|
125
113
|
puts case http_method.strip
|
@@ -138,6 +126,12 @@ class OpsManager
|
|
138
126
|
end
|
139
127
|
end
|
140
128
|
|
129
|
+
class Version < Clamp::Command
|
130
|
+
def execute
|
131
|
+
puts OpsManager::VERSION
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
141
135
|
# Core commands
|
142
136
|
subcommand "status", "Test credentials and shows status", Status
|
143
137
|
subcommand "target", "Target an OpsManager appliance", Target
|
@@ -148,12 +142,12 @@ class OpsManager
|
|
148
142
|
subcommand "get-product-template", "Generates Product tile installation template", GetProductTemplate
|
149
143
|
|
150
144
|
# Other commands
|
145
|
+
subcommand "version", "Shows OpsManagerCLI version", Version
|
151
146
|
subcommand "curl", "Authenticated curl requests(POST/GET)", Curl
|
147
|
+
subcommand "delete-unused-products", "Deletes unused product tiles", DeleteUnusedProducts
|
152
148
|
subcommand "get-installation-settings", "Gets installation settings", GetInstallationSettings
|
153
149
|
subcommand "get-installation-logs", "Gets installation logs", GetInstallationLogs
|
154
|
-
subcommand "get-uaa-token", "Gets uaa token from OpsManager", GetUaaToken
|
155
150
|
subcommand "import-stemcell", "Uploads stemcell to OpsManager", ImportStemcell
|
156
|
-
subcommand "delete-unused-products", "Deletes unused product tiles", DeleteUnusedProducts
|
157
151
|
|
158
152
|
end
|
159
153
|
end
|
@@ -1,27 +1,29 @@
|
|
1
1
|
require 'rbvmomi'
|
2
2
|
require "uri"
|
3
|
+
require 'shellwords'
|
3
4
|
require "ops_manager/logging"
|
4
5
|
|
5
6
|
class OpsManager
|
6
7
|
module Deployments
|
7
8
|
module Vsphere
|
8
9
|
include OpsManager::Logging
|
9
|
-
include OpsManager::Logging
|
10
10
|
|
11
11
|
def deploy_vm(name, ip)
|
12
|
-
|
12
|
+
print '====> Deploying ova ...'.green
|
13
13
|
vcenter_target= "vi://#{vcenter_username}:#{vcenter_password}@#{config.opts['vcenter']['host']}/#{config.opts['vcenter']['datacenter']}/host/#{config.opts['vcenter']['cluster']}"
|
14
14
|
cmd = "echo yes | ovftool --acceptAllEulas --noSSLVerify --powerOn --X:waitForIp --net:\"Network 1=#{config.opts['portgroup']}\" --name=#{name} -ds=#{config.opts['datastore']} --prop:ip0=#{ip} --prop:netmask0=#{config.opts['netmask']} --prop:gateway=#{config.opts['gateway']} --prop:DNS=#{config.opts['dns']} --prop:ntp_servers=#{config.opts['ntp_servers'].join(',')} --prop:admin_password=#{config.password} #{config.opts['ova_path']} #{vcenter_target}"
|
15
|
-
logger.info cmd
|
16
|
-
|
15
|
+
logger.info "Running: #{cmd}"
|
16
|
+
logger.info `#{cmd}`
|
17
|
+
puts 'done'.green
|
17
18
|
end
|
18
19
|
|
19
20
|
def stop_current_vm(name)
|
20
|
-
|
21
|
+
print "====> Stopping vm #{name}...".green
|
21
22
|
dc = vim.serviceInstance.find_datacenter(config.opts['vcenter']['datacenter'])
|
22
23
|
logger.info "finding vm: #{name}"
|
23
24
|
vm = dc.find_vm(name) or fail "VM not found"
|
24
25
|
vm.PowerOffVM_Task.wait_for_completion
|
26
|
+
puts 'done'.green
|
25
27
|
end
|
26
28
|
|
27
29
|
private
|
@@ -30,11 +32,11 @@ class OpsManager
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def vcenter_username
|
33
|
-
URI.encode(config.opts['vcenter']['username'])
|
35
|
+
Shellwords.escape(URI.encode(config.opts['vcenter']['username']))
|
34
36
|
end
|
35
37
|
|
36
38
|
def vcenter_password
|
37
|
-
URI.encode(config.opts['vcenter']['password'])
|
39
|
+
Shellwords.escape(URI.encode(config.opts['vcenter']['password']))
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -7,53 +7,56 @@ class OpsManager
|
|
7
7
|
delete_uaa_ssl
|
8
8
|
delete_guid
|
9
9
|
delete_ip_assignments
|
10
|
+
add_merging_strategy_for_networks
|
11
|
+
|
10
12
|
installation_settings.to_h
|
11
13
|
end
|
12
14
|
|
13
15
|
def generate_yml
|
14
16
|
generate.to_yaml
|
15
|
-
.gsub('"(( merge on
|
17
|
+
.gsub('"(( merge on name ))"', '(( merge on name ))')
|
16
18
|
.gsub('"(( merge on identifier ))"', '(( merge on identifier ))')
|
17
19
|
end
|
18
20
|
|
19
21
|
private
|
20
22
|
def installation_settings
|
21
23
|
return @installation_settings if @installation_settings
|
22
|
-
|
23
|
-
@installation_settings =
|
24
|
+
res = OpsManager::Api::Opsman.new(silent: true).get_installation_settings
|
25
|
+
@installation_settings = JSON.parse(res.body)
|
24
26
|
end
|
25
27
|
|
26
28
|
def merge_director_template_products
|
27
|
-
installation_settings.merge!('products' =>
|
29
|
+
installation_settings.merge!('products' => product_template.fetch('products'))
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_merging_strategy_for_networks
|
33
|
+
installation_settings['infrastructure']['networks'].tap do |networks|
|
34
|
+
networks.unshift("(( merge on name ))") if networks
|
35
|
+
end
|
28
36
|
end
|
29
37
|
|
30
38
|
def delete_schema_version
|
31
|
-
|
39
|
+
installation_settings.delete('installation_schema_version')
|
32
40
|
end
|
33
41
|
|
34
42
|
def delete_ip_assignments
|
35
|
-
|
43
|
+
installation_settings.delete('ip_assignments')
|
36
44
|
end
|
37
45
|
|
38
46
|
def delete_guid
|
39
|
-
|
47
|
+
installation_settings.delete('guid')
|
40
48
|
end
|
41
49
|
|
42
50
|
def delete_director_ssl
|
43
|
-
|
51
|
+
product_template["products"][1].delete("director_ssl")
|
44
52
|
end
|
45
53
|
|
46
54
|
def delete_uaa_ssl
|
47
|
-
|
55
|
+
product_template["products"][1].delete("uaa_ssl")
|
48
56
|
end
|
49
57
|
|
50
|
-
def
|
51
|
-
@
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
def installation_settings_response
|
56
|
-
OpsManager::Api::Opsman.new(silent: true).get_installation_settings
|
58
|
+
def product_template
|
59
|
+
@product_template ||= OpsManager::ProductTemplateGenerator.new('p-bosh').generate
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class OpsManager
|
2
2
|
class InstallationRunner
|
3
3
|
extend Forwardable
|
4
|
-
def_delegators :opsman_api, :trigger_installation, :get_installation,
|
4
|
+
def_delegators :opsman_api, :trigger_installation, :get_installation,
|
5
5
|
:get_staged_products, :get_staged_products_errands
|
6
6
|
attr_reader :id
|
7
7
|
|
8
8
|
def trigger!
|
9
|
-
res = trigger_installation( body: body
|
9
|
+
res = trigger_installation( body: body )
|
10
10
|
@id = JSON.parse(res.body).fetch('install').fetch('id').to_i
|
11
11
|
self
|
12
12
|
end
|
@@ -17,7 +17,7 @@ class OpsManager
|
|
17
17
|
|
18
18
|
def wait_for_result
|
19
19
|
while JSON.parse(get_installation(id).body).fetch('status') == 'running'
|
20
|
-
print '.'.green
|
20
|
+
print ' .'.green
|
21
21
|
sleep 10
|
22
22
|
end
|
23
23
|
puts ''
|
@@ -27,8 +27,7 @@ class OpsManager
|
|
27
27
|
def body
|
28
28
|
@body ||= [ 'ignore_warnings=true' ]
|
29
29
|
@body << errands_body
|
30
|
-
|
31
|
-
@body
|
30
|
+
@body.join('&')
|
32
31
|
end
|
33
32
|
|
34
33
|
def opsman_api
|
@@ -36,18 +35,16 @@ class OpsManager
|
|
36
35
|
end
|
37
36
|
|
38
37
|
def errands_body
|
39
|
-
staged_products_guids.collect
|
40
|
-
post_deploy_errands_body_for(product_guid)
|
41
|
-
end
|
38
|
+
staged_products_guids.collect { |product_guid| post_deploy_errands_body_for(product_guid) }
|
42
39
|
end
|
43
40
|
|
44
41
|
def post_deploy_errands_body_for(product_guid)
|
45
42
|
post_deploy_errands = post_deploy_errands_for(product_guid)
|
46
43
|
|
47
|
-
|
48
|
-
post_deploy_errands.collect{ |e| "enabled_errands[#{product_guid}][post_deploy_errands][]=#{e}" }
|
49
|
-
else
|
44
|
+
if post_deploy_errands.empty?
|
50
45
|
"enabled_errands[#{product_guid}]{}"
|
46
|
+
else
|
47
|
+
post_deploy_errands.collect{ |e| "enabled_errands[#{product_guid}][post_deploy_errands][]=#{e}" }
|
51
48
|
end
|
52
49
|
end
|
53
50
|
|
@@ -65,7 +62,8 @@ class OpsManager
|
|
65
62
|
|
66
63
|
def errands_for(product_guid)
|
67
64
|
res = get_staged_products_errands(product_guid)
|
68
|
-
|
65
|
+
|
66
|
+
if res.code == '200'
|
69
67
|
JSON.parse(res.body)['errands']
|
70
68
|
else
|
71
69
|
[]
|
@@ -44,9 +44,11 @@ class OpsManager
|
|
44
44
|
print "====> Uploading product...".green
|
45
45
|
if ProductDeployment.exists?(config.name, config.desired_version)
|
46
46
|
puts "product already exists".green
|
47
|
-
|
47
|
+
elsif config.filepath
|
48
48
|
upload_product(config.filepath)
|
49
49
|
puts "done".green
|
50
|
+
else
|
51
|
+
puts "no filepath provided, skipping product upload.".green
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class OpsManager
|
2
2
|
class ProductTemplateGenerator
|
3
|
-
OPS_MANAGER_PASSWORD_LENGTH =
|
4
|
-
OPS_MANAGER_SECRET_LENGTH =
|
3
|
+
OPS_MANAGER_PASSWORD_LENGTH = 32
|
4
|
+
OPS_MANAGER_SECRET_LENGTH = 32
|
5
5
|
OPS_MANAGER_SALT_LENGTH = 16
|
6
6
|
|
7
7
|
attr_reader :product_name
|
@@ -25,6 +25,7 @@ class OpsManager
|
|
25
25
|
delete_private_key_pem
|
26
26
|
delete_product_version_from_properties
|
27
27
|
add_merging_strategy_for_jobs
|
28
|
+
add_merging_strategy_for_job_properties
|
28
29
|
|
29
30
|
{ 'products' => [ "(( merge on identifier ))" , selected_product ] }
|
30
31
|
end
|
@@ -109,6 +110,12 @@ class OpsManager
|
|
109
110
|
selected_product['jobs'].unshift("(( merge on identifier ))")
|
110
111
|
end
|
111
112
|
|
113
|
+
def add_merging_strategy_for_job_properties
|
114
|
+
selected_product['jobs'].each do |j|
|
115
|
+
j['properties'].unshift("(( merge on identifier ))") if j['properties']
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
112
119
|
def delete_partitions
|
113
120
|
delete_from_jobs('partitions')
|
114
121
|
end
|
@@ -136,12 +143,9 @@ class OpsManager
|
|
136
143
|
end
|
137
144
|
|
138
145
|
def installation_settings
|
139
|
-
|
140
|
-
OpsManager::
|
141
|
-
|
142
|
-
|
143
|
-
def installation_settings_response
|
144
|
-
OpsManager::Api::Opsman.new(silent: true).get_installation_settings
|
146
|
+
return @installation_settings if @installation_settings
|
147
|
+
res = OpsManager::Api::Opsman.new(silent: true).get_installation_settings
|
148
|
+
@installation_settings = JSON.parse(res.body)
|
145
149
|
end
|
146
150
|
end
|
147
151
|
end
|
data/lib/ops_manager/semver.rb
CHANGED
data/lib/ops_manager/version.rb
CHANGED
data/ops_manager.gemspec
CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.10"
|
21
21
|
spec.add_development_dependency "rake"
|
22
22
|
spec.add_development_dependency "rspec"
|
23
|
-
spec.add_development_dependency "vcr"
|
24
23
|
spec.add_development_dependency "webmock"
|
25
24
|
spec.add_development_dependency "byebug"
|
26
25
|
spec.add_dependency "rbvmomi"
|
@@ -29,4 +28,5 @@ Gem::Specification.new do |spec|
|
|
29
28
|
spec.add_dependency "net-ping"
|
30
29
|
spec.add_dependency "cf-uaa-lib"
|
31
30
|
spec.add_dependency "session_config"
|
31
|
+
spec.add_dependency "rubysl-shellwords"
|
32
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ops_manager_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CompoZed
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: webmock
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: byebug
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,13 +81,13 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rbvmomi
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
|
-
type: :
|
90
|
+
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: multipart-post
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: clamp
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: net-ping
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
@@ -137,7 +137,7 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: cf-uaa-lib
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - ">="
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
154
|
+
name: session_config
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - ">="
|
@@ -165,7 +165,7 @@ dependencies:
|
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
168
|
+
name: rubysl-shellwords
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - ">="
|
@@ -196,7 +196,6 @@ files:
|
|
196
196
|
- LICENSE.txt
|
197
197
|
- README.md
|
198
198
|
- Rakefile
|
199
|
-
- bin/clean_tapes
|
200
199
|
- bin/console
|
201
200
|
- bin/setup
|
202
201
|
- exe/ops_manager
|
@@ -214,7 +213,6 @@ files:
|
|
214
213
|
- lib/ops_manager/errors.rb
|
215
214
|
- lib/ops_manager/installation.rb
|
216
215
|
- lib/ops_manager/installation_runner.rb
|
217
|
-
- lib/ops_manager/installation_settings.rb
|
218
216
|
- lib/ops_manager/logging.rb
|
219
217
|
- lib/ops_manager/product_deployment.rb
|
220
218
|
- lib/ops_manager/product_installation.rb
|
data/bin/clean_tapes
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
echo 'Replacing sensitive data in the source file with dummy data'
|
4
|
-
|
5
|
-
USAGE="Usage ./clean_tapes SENSITIVE_INFO DUMMY_INFO"
|
6
|
-
|
7
|
-
if [[ $# -ne 2 ]]; then
|
8
|
-
echo "Illegal number of parameters"
|
9
|
-
echo $USAGE
|
10
|
-
exit
|
11
|
-
fi
|
12
|
-
|
13
|
-
pattern=$1
|
14
|
-
replacement=$2
|
15
|
-
|
16
|
-
pushd spec/fixtures/vcr_cassettes/
|
17
|
-
ack -l $pattern | xargs perl -pi -E "s/$pattern/$replacement/g"
|
18
|
-
popd
|
19
|
-
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class OpsManager
|
2
|
-
class InstallationSettings < Hash
|
3
|
-
def initialize(parsed_installation_settings)
|
4
|
-
super.merge!(parsed_installation_settings)
|
5
|
-
end
|
6
|
-
|
7
|
-
def stemcells
|
8
|
-
self.fetch('products').inject([]) do |a, p|
|
9
|
-
a << {
|
10
|
-
version: p['stemcell'].fetch('version'),
|
11
|
-
file: p['stemcell'].fetch('file'),
|
12
|
-
}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|