pcf_pause 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d7887dada4698d0764cbfb3e972b96af7789fc74
4
+ data.tar.gz: 3a360a8e8e55cc855793fa5cdd1f5e852c6e6457
5
+ SHA512:
6
+ metadata.gz: e4f985e984355a286e81cdae5c109f634379c1864e976b743a53093922d977ecca570320b42baa98d46ea4fef348bcf5a5dedd4419315455c7815495de4d8fb9
7
+ data.tar.gz: 048902181fdedf126822ec27fb3ba3470ef446d67339ba3c9b1cbf500fec28325920cc0f89ff7a207fcd24f584aceb8135dbe95baec77b4f5fb6fcc197dba803
data/lib/pcf_pause.rb ADDED
@@ -0,0 +1,18 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc. All rights reserved.
2
+
3
+ # Unauthorized use, copying or distribution of this source code via any
4
+ # medium is strictly prohibited without the express written consent of
5
+ # Pivotal Software, Inc.
6
+
7
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
8
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
10
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
12
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
13
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+
15
+ module PcfPause; end
16
+
17
+ require_relative 'pcf_pause/ops_man_info'
18
+ require_relative 'pcf_pause/pause'
@@ -0,0 +1,79 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc. All rights reserved.
2
+
3
+ # Unauthorized use, copying or distribution of this source code via any
4
+ # medium is strictly prohibited without the express written consent of
5
+ # Pivotal Software, Inc.
6
+
7
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
8
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
10
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
12
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
13
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+
15
+ module PcfPause
16
+ class OpsManInfo
17
+ attr_reader :url, :token
18
+
19
+ def initialize(url, username, password)
20
+ @url = url
21
+ @token = auth_header(username, password)
22
+ end
23
+
24
+ def get_products
25
+ get_info 'deployed/products/'
26
+ end
27
+
28
+ def get_manifest(product_id)
29
+ get_info "deployed/products/#{product_id}/manifest"
30
+ end
31
+
32
+ def get_vm_credentials(product_id)
33
+ get_info "deployed/products/#{product_id}/vm_credentials"
34
+ end
35
+
36
+ def get_vm_names(product_id)
37
+ manifest = get_manifest(product_id)
38
+ key = if manifest.has_key?('jobs') # 1.7 manifest
39
+ 'jobs'
40
+ else
41
+ 'instance_groups'
42
+ end
43
+ manifest[key].map { |vm| vm['name'] }
44
+ end
45
+
46
+ def get_director_manifest
47
+ get_info 'deployed/director/manifest'
48
+ end
49
+
50
+ def get_product_id(type)
51
+ get_products.detect { |product_info| product_info['type'] == type }['guid']
52
+ end
53
+
54
+ private
55
+
56
+ def get_info(path)
57
+ get_request = Net::HTTP::Get.new(File.join('/api/v0/', path))
58
+ get_request['Authorization'] = token
59
+ response = http_client.request(get_request)
60
+ fail("Unexpected response: #{response.inspect}") unless response.code == '200'
61
+ JSON.parse(response.body)
62
+ end
63
+
64
+ def http_client
65
+ uri = URI.parse(url)
66
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
67
+ http.use_ssl = true if url =~ /https/
68
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
69
+ http.read_timeout = 300
70
+ end
71
+ end
72
+
73
+ def auth_header(username, password)
74
+ CF::UAA::TokenIssuer.new(URI.join(url, 'uaa'), 'opsman', '').tap do |issuer|
75
+ issuer.skip_ssl_validation = true
76
+ end.owner_password_grant(username, password).auth_header
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,113 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc. All rights reserved.
2
+
3
+ # Unauthorized use, copying or distribution of this source code via any
4
+ # medium is strictly prohibited without the express written consent of
5
+ # Pivotal Software, Inc.
6
+
7
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
8
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
10
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
12
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
13
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+
15
+ require 'uaa'
16
+ require 'net/ssh'
17
+ require_relative 'ops_man_info'
18
+
19
+ module PcfPause
20
+ class Pause
21
+ attr_reader :logger
22
+
23
+ def initialize(logger = Logger.new(STDOUT))
24
+ @logger = logger
25
+ end
26
+
27
+ TARGET_JOBS = %w(
28
+ nats consul_server etcd_server diego_database nfs_server router ccdb
29
+ uaadb consoledb cloud_controller ha_proxy health_manager clock_global
30
+ cloud_controller_worker collector uaa diego_brain diego_cell doppler
31
+ loggregator_trafficcontroller
32
+ )
33
+
34
+ def get_job_sequence(bosh_vms_value)
35
+ bosh_vms_value.select do |vm_name|
36
+ TARGET_JOBS.any? { |job| vm_name.start_with?(job) }
37
+ end
38
+ end
39
+
40
+ def smoke_tests(url, username, password, key_path='')
41
+ bosh_command, bosh_vms_value = connect_to_bosh(password, url, username)
42
+
43
+ Net::SSH.start(URI.parse(url).host, 'ubuntu', keys: [key_path]) do |ssh|
44
+ exec_ssh ssh, "#{bosh_command} #{smoke_tests_command}"
45
+ end
46
+ logger.info 'Smoke tests have finished'
47
+ end
48
+
49
+ def start(url, username, password, key_path='')
50
+ bosh_command, bosh_vms_value = connect_to_bosh(password, url, username)
51
+
52
+ logger.info("Preparing to start instances")
53
+
54
+ Net::SSH.start(URI.parse(url).host, 'ubuntu', keys: [key_path]) do |ssh|
55
+ exec_ssh ssh, "#{bosh_command} #{start_command}"
56
+ logger.info "Started"
57
+ end
58
+ logger.info 'All instances started'
59
+ end
60
+
61
+ def stop(url, username, password, key_path='')
62
+ bosh_command, bosh_vms_value = connect_to_bosh(password, url, username)
63
+
64
+ stop_sequence = get_job_sequence(bosh_vms_value).reverse
65
+
66
+ logger.info("Preparing to stop instances #{stop_sequence.join(', ')}")
67
+ Net::SSH.start(URI.parse(url).host, 'ubuntu', keys: [key_path]) do |ssh|
68
+ stop_sequence.each do |job_name|
69
+ exec_ssh ssh, "#{bosh_command} #{stop_command(job_name)}"
70
+ logger.info "Stopped #{job_name}"
71
+ end
72
+ end
73
+ logger.info 'All instances stopped'
74
+ end
75
+
76
+ def connect_to_bosh(password, url, username)
77
+ logger.info("Connecting to OpsMan at #{url}")
78
+ ops_man = PcfPause::OpsManInfo.new(url, username, password)
79
+
80
+ manifest = ops_man.get_director_manifest
81
+ uaa_secret = manifest['jobs'][0]['properties']['uaa']['clients']['ops_manager']['secret']
82
+ director_ip = manifest['jobs'][0]['properties']['director']['address']
83
+
84
+ product_id = ops_man.get_product_id 'cf'
85
+ bosh_vms_value = ops_man.get_vm_names product_id
86
+ bosh_command = "BOSH_CLIENT=ops_manager BOSH_CLIENT_SECRET=#{uaa_secret} BUNDLE_GEMFILE=/home/tempest-web/tempest/web/vendor/bosh/Gemfile bundle exec bosh -n --ca-cert /var/tempest/workspaces/default/root_ca_certificate -d /var/tempest/workspaces/default/deployments/#{product_id}.yml -t #{director_ip}"
87
+ return bosh_command, bosh_vms_value
88
+ end
89
+
90
+ def start_command
91
+ "start --force"
92
+ end
93
+
94
+ def stop_command(job_name)
95
+ "stop #{job_name} --hard"
96
+ end
97
+
98
+ def smoke_tests_command
99
+ "run errand smoke-tests"
100
+ end
101
+
102
+ def exec_ssh(ssh, command)
103
+ logger.debug 'SSH: executing command'
104
+ ssh.exec!(command) do |ch, stream, data|
105
+ puts data
106
+ ch.on_request "exit-status" do |ch, data|
107
+ exit_status = data.read_long
108
+ raise "process terminated with exit status: #{exit_status}" if exit_status != 0
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,17 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc. All rights reserved.
2
+ #
3
+ # Unauthorized use, copying or distribution of this source code via any
4
+ # medium is strictly prohibited without the express written consent of
5
+ # Pivotal Software, Inc.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
8
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
10
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
12
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
13
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+
15
+ module PcfPause
16
+ VERSION = '0.9.0'
17
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pcf_pause
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - CF London
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cf-uaa-lib
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-ssh
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 3.2.0
41
+ description: Tool for stopping & starting ERT
42
+ email:
43
+ - cf-london-eng@pivotal.io
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/pcf_pause.rb
49
+ - lib/pcf_pause/ops_man_info.rb
50
+ - lib/pcf_pause/pause.rb
51
+ - lib/pcf_pause/version.rb
52
+ homepage:
53
+ licenses:
54
+ - Nonstandard
55
+ metadata: {}
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 2.6.4
73
+ signing_key:
74
+ specification_version: 4
75
+ summary: Tool for stopping & starting ERT
76
+ test_files: []