hpe3par_sdk 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +55 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/Gemfile +15 -0
- data/LICENSE +201 -0
- data/README.md +192 -0
- data/Rakefile +103 -0
- data/bin/console +25 -0
- data/bin/setup +20 -0
- data/hpe3par_sdk.gemspec +45 -0
- data/lib/Hpe3parSdk.rb +19 -0
- data/lib/Hpe3parSdk/client.rb +2647 -0
- data/lib/Hpe3parSdk/constants.rb +421 -0
- data/lib/Hpe3parSdk/cpg_manager.rb +72 -0
- data/lib/Hpe3parSdk/exceptions.rb +503 -0
- data/lib/Hpe3parSdk/flash_cache_manager.rb +54 -0
- data/lib/Hpe3parSdk/host_manager.rb +152 -0
- data/lib/Hpe3parSdk/host_set_manager.rb +128 -0
- data/lib/Hpe3parSdk/http.rb +164 -0
- data/lib/Hpe3parSdk/models.rb +1850 -0
- data/lib/Hpe3parSdk/multi_log.rb +86 -0
- data/lib/Hpe3parSdk/port_manager.rb +62 -0
- data/lib/Hpe3parSdk/qos_manager.rb +64 -0
- data/lib/Hpe3parSdk/ssh.rb +46 -0
- data/lib/Hpe3parSdk/task_manager.rb +98 -0
- data/lib/Hpe3parSdk/tcl_parser.rb +15 -0
- data/lib/Hpe3parSdk/util.rb +30 -0
- data/lib/Hpe3parSdk/version.rb +14 -0
- data/lib/Hpe3parSdk/vlun_manager.rb +119 -0
- data/lib/Hpe3parSdk/volume_manager.rb +292 -0
- data/lib/Hpe3parSdk/volume_set_manager.rb +126 -0
- data/lib/Hpe3parSdk/wsapi_version.rb +73 -0
- metadata +194 -0
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
8
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
9
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
10
|
+
# specific language governing permissions and limitations under the License.
|
11
|
+
|
12
|
+
require 'bundler/gem_tasks'
|
13
|
+
require 'rake/clean'
|
14
|
+
|
15
|
+
task :console do
|
16
|
+
exec 'irb -r Hpe3parSdk -I ./lib'
|
17
|
+
end
|
18
|
+
|
19
|
+
namespace :build do
|
20
|
+
begin
|
21
|
+
require 'rspec/core/rake_task'
|
22
|
+
|
23
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
24
|
+
puts '', 'RSpec Task started....'
|
25
|
+
t.pattern = Dir.glob('spec/**/*_spec.rb')
|
26
|
+
t.rspec_opts = '--format html --out test_reports/rspec_results.html'
|
27
|
+
t.fail_on_error = true
|
28
|
+
end
|
29
|
+
|
30
|
+
task default: :spec
|
31
|
+
rescue LoadError => le
|
32
|
+
# no rspec available
|
33
|
+
puts "(#{le.message})"
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
require 'rubocop/rake_task'
|
38
|
+
desc 'Run RuboCop - Ruby static code analyzer'
|
39
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
40
|
+
puts '', 'Rubocop Task started....'
|
41
|
+
# task.patterns = ['lib/**/*.rb']
|
42
|
+
task.fail_on_error = false
|
43
|
+
task.formatters = ['html']
|
44
|
+
task.options = ['--out', 'rubocop_report.html']
|
45
|
+
end
|
46
|
+
rescue LoadError => le
|
47
|
+
# no rspec available
|
48
|
+
puts "(#{le.message})"
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
# $stdout.reopen("ruby_lint_report.txt", "w")
|
53
|
+
# $stdout.sync = true
|
54
|
+
require 'ruby-lint/rake_task'
|
55
|
+
RubyLint::RakeTask.new do |task|
|
56
|
+
task.name = 'lint'
|
57
|
+
task.description = 'Rake task to run ruby-lint on lib'
|
58
|
+
task.debug = TrueClass
|
59
|
+
task.files = ['./lib/']
|
60
|
+
# task.configuration = ''
|
61
|
+
end
|
62
|
+
# $stdout = STDOUT
|
63
|
+
|
64
|
+
require 'rdoc/task'
|
65
|
+
Rake::RDocTask.new(:rdoc) do |rd|
|
66
|
+
rd.title = 'Ruby 3PAR Library'
|
67
|
+
rd.rdoc_files.include('lib/**/*.rb', 'README.md')
|
68
|
+
rd.rdoc_dir = 'rdoc'
|
69
|
+
rd.main = 'README.md'
|
70
|
+
end
|
71
|
+
|
72
|
+
desc 'Clean up previous build'
|
73
|
+
task :clobber do
|
74
|
+
CLOBBER << 'rubocop_report.html'
|
75
|
+
CLOBBER << 'test_reports'
|
76
|
+
CLOBBER << 'coverage'
|
77
|
+
CLOBBER << 'Gemfile.lock'
|
78
|
+
Rake::Task['clobber'].invoke
|
79
|
+
Rake::Task['build:clobber_rdoc'].invoke
|
80
|
+
end
|
81
|
+
|
82
|
+
require 'bundler/inline'
|
83
|
+
|
84
|
+
task :deploy do
|
85
|
+
gemfile(true) do
|
86
|
+
source 'https://rubygems.org'
|
87
|
+
gem 'nexus'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Run RDoc, ruby-lint, rubocop, unit tests, coverage and generate gemfile of the project'
|
95
|
+
task :build_client do
|
96
|
+
Rake::Task['build:clobber'].invoke
|
97
|
+
Rake::Task['build:spec'].invoke
|
98
|
+
Rake::Task['build'].invoke
|
99
|
+
Rake::Task['build:rdoc'].invoke
|
100
|
+
Rake::Task['build:lint'].invoke
|
101
|
+
Rake::Task['build:rubocop'].invoke
|
102
|
+
Rake::Task['build:deploy'].invoke
|
103
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
10
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
11
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
12
|
+
# specific language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
require 'bundler/setup'
|
15
|
+
require 'Hpe3parSdk'
|
16
|
+
|
17
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
18
|
+
# with your gem easier. You can also use a different console, if you like.
|
19
|
+
|
20
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
21
|
+
# require "pry"
|
22
|
+
# Pry.start
|
23
|
+
|
24
|
+
require 'irb'
|
25
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
10
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
11
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
12
|
+
# specific language governing permissions and limitations under the License.
|
13
|
+
|
14
|
+
set -euo pipefail
|
15
|
+
IFS=$'\n\t'
|
16
|
+
set -vx
|
17
|
+
|
18
|
+
bundle install
|
19
|
+
|
20
|
+
# Do any other automated setup that you need to do here
|
data/hpe3par_sdk.gemspec
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
8
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
9
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
10
|
+
# specific language governing permissions and limitations under the License.
|
11
|
+
|
12
|
+
# coding: utf-8
|
13
|
+
lib = File.expand_path('../lib', __FILE__)
|
14
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
15
|
+
require 'Hpe3parSdk/version'
|
16
|
+
|
17
|
+
Gem::Specification.new do |spec|
|
18
|
+
spec.name = 'hpe3par_sdk'
|
19
|
+
spec.version = Hpe3parSdk::VERSION
|
20
|
+
spec.authors = ['Hewlett Packard Enterprise']
|
21
|
+
spec.email = ['hpe_storage_ruby_sdk@groups.ext.hpe.com']
|
22
|
+
|
23
|
+
spec.summary = 'HPE 3PAR Software Development Kit for Ruby'
|
24
|
+
spec.description = 'HPE 3PAR Software Development Kit for Ruby'
|
25
|
+
spec.homepage = 'https://github.com/HewlettPackard/hpe3par_ruby_sdk'
|
26
|
+
spec.license = 'Apache-2.0'
|
27
|
+
|
28
|
+
|
29
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
30
|
+
spec.bindir = 'exe'
|
31
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
|
+
spec.require_paths = ['lib']
|
33
|
+
|
34
|
+
spec.required_ruby_version = '>= 2.1'
|
35
|
+
|
36
|
+
spec.add_dependency 'net-ssh', '~> 4'
|
37
|
+
spec.add_runtime_dependency 'httparty', '~> 0.15.6'
|
38
|
+
|
39
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
40
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
41
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
42
|
+
spec.add_development_dependency 'rubocop', '~> 0.52'
|
43
|
+
spec.add_development_dependency 'simplecov', '~> 0.15.0'
|
44
|
+
spec.add_development_dependency 'ruby-lint', '~> 2.0', '>= 2.0.4'
|
45
|
+
end
|
data/lib/Hpe3parSdk.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
8
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
9
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
10
|
+
# specific language governing permissions and limitations under the License.
|
11
|
+
|
12
|
+
require 'Hpe3parSdk/version'
|
13
|
+
|
14
|
+
module Hpe3parSdk
|
15
|
+
require 'Hpe3parSdk/exceptions'
|
16
|
+
require 'Hpe3parSdk/constants'
|
17
|
+
require 'Hpe3parSdk/client'
|
18
|
+
require 'Hpe3parSdk/models'
|
19
|
+
end
|
@@ -0,0 +1,2647 @@
|
|
1
|
+
# (c) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software distributed
|
8
|
+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
9
|
+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
10
|
+
# specific language governing permissions and limitations under the License.
|
11
|
+
|
12
|
+
require_relative 'http'
|
13
|
+
require_relative 'ssh'
|
14
|
+
require_relative 'util'
|
15
|
+
require_relative 'volume_manager'
|
16
|
+
require_relative 'cpg_manager'
|
17
|
+
require_relative 'volume_set_manager'
|
18
|
+
require_relative 'qos_manager'
|
19
|
+
require_relative 'vlun_manager'
|
20
|
+
require_relative 'host_manager'
|
21
|
+
require_relative 'host_set_manager'
|
22
|
+
require_relative 'flash_cache_manager'
|
23
|
+
require_relative 'port_manager'
|
24
|
+
require_relative 'task_manager'
|
25
|
+
require_relative 'wsapi_version'
|
26
|
+
|
27
|
+
module Hpe3parSdk
|
28
|
+
class Client
|
29
|
+
def initialize(api_url,debug:false, secure: false, timeout: nil, suppress_ssl_warnings: false, app_type: 'ruby-3parclient', log_file_path: nil)
|
30
|
+
unless api_url.is_a?(String)
|
31
|
+
raise Hpe3parSdk::HPE3PARException.new(nil,
|
32
|
+
"'api_url' parameter is mandatory and should be of type String")
|
33
|
+
end
|
34
|
+
|
35
|
+
@api_url = api_url
|
36
|
+
@debug = debug
|
37
|
+
@secure = secure
|
38
|
+
@timeout = timeout
|
39
|
+
@suppress_ssl_warnings = suppress_ssl_warnings
|
40
|
+
@log_level = Logger::INFO
|
41
|
+
@log_file_path = log_file_path
|
42
|
+
init_log
|
43
|
+
@http = HTTPJSONRestClient.new(
|
44
|
+
@api_url, @secure, @debug,
|
45
|
+
@suppress_ssl_warnings, @timeout = nil
|
46
|
+
)
|
47
|
+
check_WSAPI_version
|
48
|
+
@vlun_query_supported = false
|
49
|
+
@cpg = CPGManager.new(@http)
|
50
|
+
@qos = QOSManager.new(@http)
|
51
|
+
@flash_cache = FlashCacheManager.new(@http)
|
52
|
+
@port = PortManager.new(@http)
|
53
|
+
@task = TaskManager.new(@http)
|
54
|
+
@host_and_vv_set_filter_supported = false
|
55
|
+
@ssh = nil
|
56
|
+
@vlun = VlunManager.new(@http, @vlun_query_supported)
|
57
|
+
@host = HostManager.new(@http, @vlun_query_supported)
|
58
|
+
@volume_set = VolumeSetManager.new(@http, @host_and_vv_set_filter_supported)
|
59
|
+
@host_set = HostSetManager.new(@http, @host_and_vv_set_filter_supported)
|
60
|
+
@app_type = app_type
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
private def init_log
|
65
|
+
unless @log_file_path.nil?
|
66
|
+
client_logger = Logger.new(@log_file_path, 'daily', formatter: CustomFormatter.new)
|
67
|
+
else
|
68
|
+
client_logger = Logger.new(STDOUT)
|
69
|
+
end
|
70
|
+
if @debug
|
71
|
+
@log_level = Logger::DEBUG
|
72
|
+
end
|
73
|
+
Hpe3parSdk.logger = MultiLog.new(:level => @log_level, :loggers => client_logger)
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
private def check_WSAPI_version
|
78
|
+
begin
|
79
|
+
@api_version = get_ws_api_version
|
80
|
+
rescue HPE3PARException => ex
|
81
|
+
ex_message = ex.message
|
82
|
+
if ex_message && ex_message.include?('SSL Certificate Verification Failed')
|
83
|
+
raise Hpe3parSdk::SSLCertFailed
|
84
|
+
else
|
85
|
+
msg = "Error: #{ex_message} - Error communicating with 3PAR WSAPI. '
|
86
|
+
'Check proxy settings. If error persists, either the '
|
87
|
+
'3PAR WSAPI is not running OR the version of the WSAPI is '
|
88
|
+
'not supported."
|
89
|
+
raise Hpe3parSdk::HPE3PARException(message: msg)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
compare_version(@api_version)
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
private def set_ssh_options(username, password, port=22, conn_timeout=nil)
|
98
|
+
@ssh=Hpe3parSdk::SSH.new(@api_url.split("//")[1].split(":")[0], username, password)
|
99
|
+
end
|
100
|
+
|
101
|
+
private def compare_version(api_version)
|
102
|
+
@min_version = WSAPIVersion
|
103
|
+
.parse(WSAPIVersionSupport::WSAPI_MIN_SUPPORTED_VERSION)
|
104
|
+
@min_version_with_compression = WSAPIVersion
|
105
|
+
.parse(WSAPIVersionSupport::WSAPI_MIN_VERSION_COMPRESSION_SUPPORT)
|
106
|
+
|
107
|
+
@current_version = WSAPIVersion.new(api_version['major'], api_version['minor'],
|
108
|
+
api_version['revision'])
|
109
|
+
if @current_version < @min_version
|
110
|
+
err_msg = "Unsupported 3PAR WS API version #{@current_version}, min supported version is, #{WSAPIVersionSupport::WSAPI_MIN_SUPPORTED_VERSION}"
|
111
|
+
raise Hpe3parSdk::UnsupportedVersion.new(nil, err_msg)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Check for VLUN query support.
|
115
|
+
min_vlun_query_support_version = WSAPIVersion
|
116
|
+
.parse(WSAPIVersionSupport::WSAPI_MIN_VERSION_VLUN_QUERY_SUPPORT)
|
117
|
+
if @current_version >= min_vlun_query_support_version
|
118
|
+
@vlun_query_supported = true
|
119
|
+
end
|
120
|
+
|
121
|
+
# Check for Host and VV Set query support
|
122
|
+
if @current_version >= @min_version_with_compression
|
123
|
+
@host_and_vv_set_filter_supported = true
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
# Get the 3PAR WS API version.
|
129
|
+
#
|
130
|
+
# ==== Returns
|
131
|
+
#
|
132
|
+
# WSAPI version hash
|
133
|
+
def get_ws_api_version
|
134
|
+
# remove everything down to host:port
|
135
|
+
host_url = @api_url.split('/api')
|
136
|
+
@http.set_url(host_url[0])
|
137
|
+
begin
|
138
|
+
# get the api version
|
139
|
+
response = @http.get('/api')
|
140
|
+
response[1]
|
141
|
+
rescue => ex
|
142
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
143
|
+
raise ex
|
144
|
+
end
|
145
|
+
ensure
|
146
|
+
# reset the url
|
147
|
+
@http.set_url(@api_url)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Gets the WSAPI Configuration.
|
151
|
+
#
|
152
|
+
# ==== Returns
|
153
|
+
#
|
154
|
+
# WSAPI configuration hash
|
155
|
+
def get_ws_api_configuration_info
|
156
|
+
begin
|
157
|
+
response = @http.get('/wsapiconfiguration')
|
158
|
+
response[1]
|
159
|
+
rescue => ex
|
160
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
161
|
+
raise ex
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Creates a new FlashCache
|
166
|
+
#
|
167
|
+
# ==== Attributes
|
168
|
+
#
|
169
|
+
# * size_in_gib - Specifies the node pair size of the Flash Cache on the system
|
170
|
+
# type size_in_gib: Integer
|
171
|
+
# * mode - Values supported Simulator: 1, Real: 2 (default)
|
172
|
+
# type mode: Integer
|
173
|
+
#
|
174
|
+
# ==== Raises
|
175
|
+
#
|
176
|
+
# * Hpe3parSdk::HTTPBadRequest
|
177
|
+
# - NO_SPACE - Not enough space is available for the operation.
|
178
|
+
# * Hpe3parSdk::HTTPBadRequest
|
179
|
+
# - INV_INPUT_EXCEEDS_RANGE - A JSON input object contains a name-value pair with a numeric value that exceeds the expected range. Flash Cache exceeds the expected range. The HTTP ref member contains the name.
|
180
|
+
# * Hpe3parSdk::HTTPConflict
|
181
|
+
# - EXISTENT_FLASH_CACHE - The Flash Cache already exists.
|
182
|
+
# * Hpe3parSdk::HTTPForbidden
|
183
|
+
# - FLASH_CACHE_NOT_SUPPORTED - Flash Cache is not supported.
|
184
|
+
# * Hpe3parSdk::HTTPBadRequest
|
185
|
+
# - INV_FLASH_CACHE_SIZE - Invalid Flash Cache size. The size must be a multiple of 16 G.
|
186
|
+
def create_flash_cache(size_in_gib, mode = nil)
|
187
|
+
begin
|
188
|
+
@flash_cache.create_flash_cache(size_in_gib, mode)
|
189
|
+
rescue => ex
|
190
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
191
|
+
raise ex
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
# Get Flash Cache information
|
197
|
+
#
|
198
|
+
# ==== Returns
|
199
|
+
#
|
200
|
+
# FlashCache - Details of the specified flash cache
|
201
|
+
def get_flash_cache
|
202
|
+
begin
|
203
|
+
@flash_cache.get_flash_cache
|
204
|
+
rescue => ex
|
205
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
206
|
+
raise ex
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# Deletes an existing Flash Cache
|
211
|
+
#
|
212
|
+
# ==== Raises
|
213
|
+
#
|
214
|
+
# * Hpe3parSdk::HTTPForbidden
|
215
|
+
# - FLASH_CACHE_IS_BEING_REMOVED - Unable to delete the Flash Cache, the Flash Cache is being removed.
|
216
|
+
# * Hpe3parSdk::HTTPForbidden
|
217
|
+
# - FLASH_CACHE_NOT_SUPPORTED - Flash Cache is not supported on this system.
|
218
|
+
# * Hpe3parSdk::HTTPNotFound
|
219
|
+
# - NON_EXISTENT_FLASH_CACHE - The Flash Cache does not exist.
|
220
|
+
def delete_flash_cache
|
221
|
+
begin
|
222
|
+
@flash_cache.delete_flash_cache
|
223
|
+
rescue => ex
|
224
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
225
|
+
raise ex
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
# Gets the Storage System Information
|
230
|
+
#
|
231
|
+
# ==== Returns
|
232
|
+
#
|
233
|
+
# Hash of Storage System Info
|
234
|
+
def get_storage_system_info
|
235
|
+
begin
|
236
|
+
response = @http.get('/system')
|
237
|
+
response[1]
|
238
|
+
rescue => ex
|
239
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
240
|
+
raise ex
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# Gets the overall system capacity for the 3PAR server.
|
245
|
+
#
|
246
|
+
# ==== Returns
|
247
|
+
#
|
248
|
+
# Hash of system capacity information
|
249
|
+
#
|
250
|
+
#
|
251
|
+
# capacity = {
|
252
|
+
# "allCapacity"=> { # Overall system capacity
|
253
|
+
# # includes FC, NL, SSD
|
254
|
+
# # device types
|
255
|
+
# "totalMiB"=>20054016, # Total system capacity
|
256
|
+
# # in MiB
|
257
|
+
# "allocated"=>{ # Allocated space info
|
258
|
+
# "totalAllocatedMiB"=>12535808, # Total allocated
|
259
|
+
# # capacity
|
260
|
+
# "volumes"=> { # Volume capacity info
|
261
|
+
# "totalVolumesMiB"=>10919936, # Total capacity
|
262
|
+
# # allocated to volumes
|
263
|
+
# "nonCPGsMiB"=> 0, # Total non-CPG capacity
|
264
|
+
# "nonCPGUserMiB"=> 0, # The capacity allocated
|
265
|
+
# # to non-CPG user space
|
266
|
+
# "nonCPGSnapshotMiB"=>0, # The capacity allocated
|
267
|
+
# # to non-CPG snapshot
|
268
|
+
# # volumes
|
269
|
+
# "nonCPGAdminMiB"=> 0, # The capacity allocated
|
270
|
+
# # to non-CPG
|
271
|
+
# # administrative volumes
|
272
|
+
# "CPGsMiB"=>10919936, # Total capacity
|
273
|
+
# # allocated to CPGs
|
274
|
+
# "CPGUserMiB"=>7205538, # User CPG space
|
275
|
+
# "CPGUserUsedMiB"=>7092550, # The CPG allocated to
|
276
|
+
# # user space that is
|
277
|
+
# # in use
|
278
|
+
# "CPGUserUnusedMiB"=>112988, # The CPG allocated to
|
279
|
+
# # user space that is not
|
280
|
+
# # in use
|
281
|
+
# "CPGSnapshotMiB"=>2411870, # Snapshot CPG space
|
282
|
+
# "CPGSnapshotUsedMiB"=>210256, # CPG allocated to
|
283
|
+
# # snapshot that is in use
|
284
|
+
# "CPGSnapshotUnusedMiB"=>2201614, # CPG allocated to
|
285
|
+
# # snapshot space that is
|
286
|
+
# # not in use
|
287
|
+
# "CPGAdminMiB"=>1302528, # Administrative volume
|
288
|
+
# # CPG space
|
289
|
+
# "CPGAdminUsedMiB"=> 115200, # The CPG allocated to
|
290
|
+
# # administrative space
|
291
|
+
# # that is in use
|
292
|
+
# "CPGAdminUnusedMiB"=>1187328, # The CPG allocated to
|
293
|
+
# # administrative space
|
294
|
+
# # that is not in use
|
295
|
+
# "unmappedMiB"=>0 # Allocated volume space
|
296
|
+
# # that is unmapped
|
297
|
+
# },
|
298
|
+
# "system"=> { # System capacity info
|
299
|
+
# "totalSystemMiB"=> 1615872, # System space capacity
|
300
|
+
# "internalMiB"=>780288, # The system capacity
|
301
|
+
# # allocated to internal
|
302
|
+
# # resources
|
303
|
+
# "spareMiB"=> 835584, # Total spare capacity
|
304
|
+
# "spareUsedMiB"=> 0, # The system capacity
|
305
|
+
# # allocated to spare resources
|
306
|
+
# # in use
|
307
|
+
# "spareUnusedMiB"=> 835584 # The system capacity
|
308
|
+
# # allocated to spare resources
|
309
|
+
# # that are unused
|
310
|
+
# }
|
311
|
+
# },
|
312
|
+
# "freeMiB"=> 7518208, # Free capacity
|
313
|
+
# "freeInitializedMiB"=> 7518208, # Free initialized capacity
|
314
|
+
# "freeUninitializedMiB"=> 0, # Free uninitialized capacity
|
315
|
+
# "unavailableCapacityMiB"=> 0, # Unavailable capacity in MiB
|
316
|
+
# "failedCapacityMiB"=> 0 # Failed capacity in MiB
|
317
|
+
# },
|
318
|
+
# "FCCapacity"=> { # System capacity from FC devices only
|
319
|
+
# ... # Same structure as above
|
320
|
+
# },
|
321
|
+
# "NLCapacity"=> { # System capacity from NL devices only
|
322
|
+
# ... # Same structure as above
|
323
|
+
# },
|
324
|
+
# "SSDCapacity"=> { # System capacity from SSD devices only
|
325
|
+
# ... # Same structure as above
|
326
|
+
# }
|
327
|
+
# }
|
328
|
+
def get_overall_system_capacity
|
329
|
+
begin
|
330
|
+
response = @http.get('/capacity')
|
331
|
+
response[1]
|
332
|
+
rescue => ex
|
333
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
334
|
+
raise ex
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
# This authenticates against the 3PAR WSAPI server and creates a session.
|
339
|
+
|
340
|
+
# ==== Attributes
|
341
|
+
#
|
342
|
+
# * username - The username
|
343
|
+
# type username: String
|
344
|
+
# * password - The Password
|
345
|
+
# type password: String
|
346
|
+
def login(username, password, optional = nil)
|
347
|
+
set_ssh_options(username, password, port=22, conn_timeout=nil)
|
348
|
+
@volume = VolumeManager.new(@http, @ssh, @app_type)
|
349
|
+
@http.authenticate(username, password, optional)
|
350
|
+
end
|
351
|
+
|
352
|
+
# Get the list of all 3PAR Tasks
|
353
|
+
#
|
354
|
+
# ==== Returns
|
355
|
+
#
|
356
|
+
# Array of Task
|
357
|
+
def get_all_tasks
|
358
|
+
begin
|
359
|
+
@task.get_all_tasks
|
360
|
+
rescue => ex
|
361
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
362
|
+
raise ex
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
# Get the status of a 3PAR Task
|
367
|
+
#
|
368
|
+
# ==== Attributes
|
369
|
+
#
|
370
|
+
# * task_id - the task id
|
371
|
+
# type task_id: Integer
|
372
|
+
#
|
373
|
+
# ==== Returns
|
374
|
+
#
|
375
|
+
# Task
|
376
|
+
#
|
377
|
+
# ==== Raises
|
378
|
+
#
|
379
|
+
# * Hpe3parSdk::HTTPBadRequest
|
380
|
+
# - INV_INPUT_BELOW_RANGE - Bad Request Task ID must be a positive value.
|
381
|
+
# * Hpe3parSdk::HTTPBadRequest
|
382
|
+
# - INV_INPUT_EXCEEDS_RANGE - Bad Request Task ID is too large.
|
383
|
+
# * Hpe3parSdk::HTTPNotFound
|
384
|
+
# - NON_EXISTENT_TASK - Task with the specified Task ID does not exist.
|
385
|
+
# * Hpe3parSdk::HTTPBadRequest
|
386
|
+
# - INV_INPUT_WRONG_TYPE - Task ID is not an integer.
|
387
|
+
def get_task(task_id)
|
388
|
+
begin
|
389
|
+
@task.get_task(task_id)
|
390
|
+
rescue => ex
|
391
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
392
|
+
raise ex
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
|
397
|
+
def vlun_exists?(volname,lunid,host=nil,port=nil)
|
398
|
+
begin
|
399
|
+
@vlun.vlun_exists?(volname,lunid,host,port)
|
400
|
+
rescue => ex
|
401
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
402
|
+
raise ex
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
# Creates a new VLUN.
|
407
|
+
#
|
408
|
+
# When creating a VLUN, the volumeName is required. The lun member is
|
409
|
+
# not required if auto is set to True.
|
410
|
+
# Either hostname or portPos (or both in the case of matched sets) is
|
411
|
+
# also required. The noVcn and overrideLowerPriority members are
|
412
|
+
# optional.
|
413
|
+
# * volume_name: Name of the volume to be exported
|
414
|
+
# type volume_name: String
|
415
|
+
# * lun: LUN id
|
416
|
+
# type lun: Integer
|
417
|
+
# * host_name: Name of the host which the volume is to be exported.
|
418
|
+
# type host_name: String
|
419
|
+
# * port_pos: System port of VLUN exported to. It includes node number, slot number, and card port number
|
420
|
+
# type port_pos: Hash
|
421
|
+
# port_pos = {'node'=> 1, # System node (0-7)
|
422
|
+
# 'slot'=> 2, # PCI bus slot in the node (0-5)
|
423
|
+
# 'port'=> 1} # Port number on the FC card (0-4)
|
424
|
+
# * no_vcn: A VLUN change notification (VCN) not be issued after export (-novcn).
|
425
|
+
# type no_vcn: Boolean
|
426
|
+
# * override_lower_priority: Existing lower priority VLUNs will be overridden (-ovrd). Use only if hostname member exists.
|
427
|
+
# type override_lower_priority: Boolean
|
428
|
+
#
|
429
|
+
# ==== Returns
|
430
|
+
#
|
431
|
+
# VLUN id
|
432
|
+
# ==== Raises
|
433
|
+
#
|
434
|
+
# * Hpe3parSdk::HTTPBadRequest
|
435
|
+
# - INV_INPUT_ MISSING_REQUIRED - Missing volume or hostname or lunid.
|
436
|
+
# * Hpe3parSdk::HTTPNotFound
|
437
|
+
# - NON_EXISTENT_VOL MISSING_REQUIRED - Specified volume does not exist.
|
438
|
+
# * Hpe3parSdk::HTTPNotFound
|
439
|
+
# - NON_EXISTENT_HOST - Specified hostname not found.
|
440
|
+
# * Hpe3parSdk::HTTPNotFound
|
441
|
+
# - NON_EXISTENT_PORT - Specified port does not exist.
|
442
|
+
def create_vlun(volume_name, lun = nil, host_name = nil, port_pos = nil, no_vcn = false, override_lower_priority = false, auto = false)
|
443
|
+
begin
|
444
|
+
@vlun.create_vlun(volume_name, host_name, lun, port_pos, no_vcn, override_lower_priority, auto)
|
445
|
+
rescue => ex
|
446
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
447
|
+
raise ex
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
# Gets VLUNs.
|
452
|
+
#
|
453
|
+
# ==== Returns
|
454
|
+
#
|
455
|
+
# Array of VLUN objects
|
456
|
+
def get_vluns
|
457
|
+
begin
|
458
|
+
@vlun.get_vluns
|
459
|
+
rescue => ex
|
460
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
461
|
+
raise ex
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
# Gets information about a VLUN.
|
466
|
+
#
|
467
|
+
# ==== Attributes
|
468
|
+
#
|
469
|
+
# * volume_name: The volume name of the VLUN to find
|
470
|
+
# type volume_name: String
|
471
|
+
#
|
472
|
+
# ==== Returns
|
473
|
+
#
|
474
|
+
# VLUN object
|
475
|
+
#
|
476
|
+
# ==== Raises
|
477
|
+
#
|
478
|
+
# * Hpe3parSdk::HTTPNotFound
|
479
|
+
# - NON_EXISTENT_VLUN - VLUN doesn't exist
|
480
|
+
def get_vlun(volume_name)
|
481
|
+
begin
|
482
|
+
@vlun.get_vlun(volume_name)
|
483
|
+
rescue => ex
|
484
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
485
|
+
raise ex
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
489
|
+
# Deletes a VLUN.
|
490
|
+
#
|
491
|
+
# ==== Attributes
|
492
|
+
#
|
493
|
+
# * volume_name: Volume name of the VLUN
|
494
|
+
# type volume_name: String
|
495
|
+
# * lun_id: LUN ID
|
496
|
+
# type lun_id: Integer
|
497
|
+
# * host_name: Name of the host which the volume is exported. For VLUN of port type,the value is empty
|
498
|
+
# type host_name: String
|
499
|
+
# * port: Specifies the system port of the VLUN export. It includes the system node number, PCI bus slot number, and card port number on the FC card in the format<node>:<slot>:<cardPort>
|
500
|
+
# type port: Hash
|
501
|
+
#
|
502
|
+
# port = {'node'=> 1, # System node (0-7)
|
503
|
+
# 'slot'=> 2, # PCI bus slot in the node (0-5)
|
504
|
+
# 'port'=>1} # Port number on the FC card (0-4)
|
505
|
+
# ==== Raises
|
506
|
+
#
|
507
|
+
# * Hpe3parSdk::HTTPBadRequest
|
508
|
+
# - INV_INPUT_MISSING_REQUIRED - Incomplete VLUN info. Missing
|
509
|
+
# volumeName or lun, or both hostname and port.
|
510
|
+
# * Hpe3parSdk::HTTPBadRequest
|
511
|
+
# - INV_INPUT_PORT_SELECTION - Specified port is invalid.
|
512
|
+
# * Hpe3parSdk::HTTPBadRequest
|
513
|
+
# - INV_INPUT_EXCEEDS_RANGE - The LUN specified exceeds expected
|
514
|
+
# range.
|
515
|
+
# * Hpe3parSdk::HTTPNotFound
|
516
|
+
# - NON_EXISTENT_HOST - The host does not exist
|
517
|
+
# * Hpe3parSdk::HTTPNotFound
|
518
|
+
# - NON_EXISTENT_VLUN - The VLUN does not exist
|
519
|
+
# * Hpe3parSdk::HTTPNotFound
|
520
|
+
# - NON_EXISTENT_PORT - The port does not exist
|
521
|
+
# * Hpe3parSdk::HTTPForbidden
|
522
|
+
# - PERM_DENIED - Permission denied
|
523
|
+
def delete_vlun(volume_name, lun_id, host_name = nil, port = nil)
|
524
|
+
begin
|
525
|
+
@vlun.delete_vlun(volume_name, lun_id, host_name, port)
|
526
|
+
rescue => ex
|
527
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
528
|
+
raise ex
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
# Gets QoS Rules.
|
533
|
+
#
|
534
|
+
# ==== Returns
|
535
|
+
#
|
536
|
+
# Array of QoSRule objects
|
537
|
+
#
|
538
|
+
def query_qos_rules
|
539
|
+
begin
|
540
|
+
@qos.query_qos_rules
|
541
|
+
rescue => ex
|
542
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
543
|
+
raise ex
|
544
|
+
end
|
545
|
+
end
|
546
|
+
|
547
|
+
# Queries a QoS rule
|
548
|
+
#
|
549
|
+
# ==== Attributes
|
550
|
+
#
|
551
|
+
# * target_name : Name of the target. When targetType is sys, target name must be sys:all_others.
|
552
|
+
# type target_name: String
|
553
|
+
# * target_type : Target type is vvset or sys
|
554
|
+
# type target_type: String
|
555
|
+
# ==== Returns
|
556
|
+
#
|
557
|
+
# QoSRule object
|
558
|
+
#
|
559
|
+
# ==== Raises
|
560
|
+
#
|
561
|
+
# * Hpe3parSdk::HTTPNotFound
|
562
|
+
# - NON_EXISTENT_QOS_RULE - QoS rule does not exist.
|
563
|
+
# * Hpe3parSdk::HTTPBadRequest
|
564
|
+
# - INV_INPUT_ILLEGAL_CHAR - Illegal character in the input.
|
565
|
+
def query_qos_rule(target_name, target_type = 'vvset')
|
566
|
+
begin
|
567
|
+
@qos.query_qos_rule(target_name, target_type)
|
568
|
+
rescue => ex
|
569
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
570
|
+
raise ex
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
574
|
+
def qos_rule_exists?(target_name, target_type = 'vvset')
|
575
|
+
begin
|
576
|
+
@qos.qos_rule_exists?(target_name, target_type)
|
577
|
+
rescue => ex
|
578
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
579
|
+
raise ex
|
580
|
+
end
|
581
|
+
end
|
582
|
+
|
583
|
+
# Creates QOS rules
|
584
|
+
|
585
|
+
# The QoS rule can be applied to VV sets. By using sys:all_others,
|
586
|
+
# you can apply the rule to all volumes in the system for which no
|
587
|
+
# QoS rule has been defined.
|
588
|
+
# ioMinGoal and ioMaxLimit must be used together to set I/O limits.
|
589
|
+
# Similarly, bwMinGoalKB and bwMaxLimitKB must be used together.
|
590
|
+
# If ioMaxLimitOP is set to 2 (no limit), ioMinGoalOP must also be
|
591
|
+
# to set to 2 (zero), and vice versa. They cannot be set to
|
592
|
+
# 'none' individually. Similarly, if bwMaxLimitOP is set to 2 (no
|
593
|
+
# limit), then bwMinGoalOP must also be set to 2.
|
594
|
+
# If ioMaxLimitOP is set to 1 (no limit), ioMinGoalOP must also be
|
595
|
+
# to set to 1 (zero) and vice versa. Similarly, if bwMaxLimitOP is
|
596
|
+
# set to 1 (zero), then bwMinGoalOP must also be set to 1.
|
597
|
+
# The ioMinGoalOP and ioMaxLimitOP fields take precedence over
|
598
|
+
# the ioMinGoal and ioMaxLimit fields.
|
599
|
+
# The bwMinGoalOP and bwMaxLimitOP fields take precedence over
|
600
|
+
# the bwMinGoalKB and bwMaxLimitKB fields
|
601
|
+
#
|
602
|
+
# ==== Attributes
|
603
|
+
#
|
604
|
+
# * target_type: Type of QoS target, either enum TARGET_TYPE_VVS or TARGET_TYPE_SYS.
|
605
|
+
# type target_type: VVSET or SYS. Refer QoStargetType::VVSET for complete enumeration
|
606
|
+
# * target_name: Name of the target object on which the QoS rule will be created.
|
607
|
+
# type target_name: String
|
608
|
+
# * qos_rules: QoS options
|
609
|
+
# type qos_rules: Hash
|
610
|
+
# qos_rules = {
|
611
|
+
# 'priority'=> 2, # Refer Hpe3parSdk::QoSpriorityEnumeration for complete enumeration
|
612
|
+
# 'bwMinGoalKB'=> 1024, # bandwidth rate minimum goal in
|
613
|
+
# # kilobytes per second
|
614
|
+
# 'bwMaxLimitKB'=> 1024, # bandwidth rate maximum limit in
|
615
|
+
# # kilobytes per second
|
616
|
+
# 'ioMinGoal'=> 10000, # I/O-per-second minimum goal
|
617
|
+
# 'ioMaxLimit'=> 2000000, # I/0-per-second maximum limit
|
618
|
+
# 'enable'=> false, # QoS rule for target enabled?
|
619
|
+
# 'bwMinGoalOP'=> 1, # zero none operation enum, when set to
|
620
|
+
# # 1, bandwidth minimum goal is 0
|
621
|
+
# # when set to 2, the bandwidth mimumum
|
622
|
+
# # goal is none (NoLimit)
|
623
|
+
# 'bwMaxLimitOP'=> 1, # zero none operation enum, when set to
|
624
|
+
# # 1, bandwidth maximum limit is 0
|
625
|
+
# # when set to 2, the bandwidth maximum
|
626
|
+
# # limit is none (NoLimit)
|
627
|
+
# 'ioMinGoalOP'=>1, # zero none operation enum, when set to
|
628
|
+
# # 1, I/O minimum goal is 0
|
629
|
+
# # when set to 2, the I/O minimum goal is
|
630
|
+
# # none (NoLimit)
|
631
|
+
# 'ioMaxLimitOP'=> 1, # zero none operation enum, when set to
|
632
|
+
# # 1, I/O maximum limit is 0
|
633
|
+
# # when set to 2, the I/O maximum limit
|
634
|
+
# # is none (NoLimit)
|
635
|
+
# 'latencyGoal'=>5000, # Latency goal in milliseconds
|
636
|
+
# 'defaultLatency'=> false# Use latencyGoal or defaultLatency?
|
637
|
+
# }
|
638
|
+
#
|
639
|
+
# ==== Raises
|
640
|
+
#
|
641
|
+
# * Hpe3parSdk::HTTPBadRequest
|
642
|
+
# - INV_INPUT_EXCEEDS_RANGE - Invalid input: number exceeds expected range.
|
643
|
+
# * Hpe3parSdk::HTTPNotFound
|
644
|
+
# - NON_EXISTENT_QOS_RULE - QoS rule does not exists.
|
645
|
+
# * Hpe3parSdk::HTTPBadRequest
|
646
|
+
# - INV_INPUT_ILLEGAL_CHAR - Illegal character in the input.
|
647
|
+
# * Hpe3parSdk::HTTPBadRequest
|
648
|
+
# - EXISTENT_QOS_RULE - QoS rule already exists.
|
649
|
+
# * Hpe3parSdk::HTTPBadRequest
|
650
|
+
# - INV_INPUT_MIN_GOAL_GRT_MAX_LIMIT - I/O-per-second maximum limit should be greater than the minimum goal.
|
651
|
+
# * Hpe3parSdk::HTTPBadRequest
|
652
|
+
# - INV_INPUT_BW_MIN_GOAL_GRT_MAX_LIMIT - Bandwidth maximum limit should be greater than the mimimum goal.
|
653
|
+
# * Hpe3parSdk::HTTPBadRequest
|
654
|
+
# - INV_INPUT_BELOW_RANGE - I/O-per-second limit is below range.Bandwidth limit is below range.
|
655
|
+
# * Hpe3parSdk::HTTPBadRequest
|
656
|
+
# - UNLICENSED_FEATURE - The system is not licensed for QoS.
|
657
|
+
def create_qos_rules(target_name, qos_rules, target_type = QoStargetType::VVSET)
|
658
|
+
if @current_version < @min_version && !qos_rules.nil?
|
659
|
+
qos_rules.delete_if { |key, _value| key == :latencyGoaluSecs }
|
660
|
+
end
|
661
|
+
begin
|
662
|
+
@qos.create_qos_rules(target_name, qos_rules, target_type)
|
663
|
+
rescue => ex
|
664
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
665
|
+
raise ex
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
# Modifies an existing QOS rules
|
670
|
+
#
|
671
|
+
# The QoS rule can be applied to VV sets. By using sys:all_others,
|
672
|
+
# you can apply the rule to all volumes in the system for which no
|
673
|
+
# QoS rule has been defined.
|
674
|
+
# ioMinGoal and ioMaxLimit must be used together to set I/O limits.
|
675
|
+
# Similarly, bwMinGoalKB and bwMaxLimitKB must be used together.
|
676
|
+
# If ioMaxLimitOP is set to 2 (no limit), ioMinGoalOP must also be
|
677
|
+
# to set to 2 (zero), and vice versa. They cannot be set to
|
678
|
+
# 'none' individually. Similarly, if bwMaxLimitOP is set to 2 (no
|
679
|
+
# limit), then bwMinGoalOP must also be set to 2.
|
680
|
+
# If ioMaxLimitOP is set to 1 (no limit), ioMinGoalOP must also be
|
681
|
+
# to set to 1 (zero) and vice versa. Similarly, if bwMaxLimitOP is
|
682
|
+
# set to 1 (zero), then bwMinGoalOP must also be set to 1.
|
683
|
+
# The ioMinGoalOP and ioMaxLimitOP fields take precedence over
|
684
|
+
# the ioMinGoal and ioMaxLimit fields.
|
685
|
+
# The bwMinGoalOP and bwMaxLimitOP fields take precedence over
|
686
|
+
# the bwMinGoalKB and bwMaxLimitKB fields
|
687
|
+
#
|
688
|
+
# ==== Attributes
|
689
|
+
#
|
690
|
+
# * target_name: Name of the target object on which the QoS rule will be created.
|
691
|
+
# type target_name: String
|
692
|
+
# * target_type: Type of QoS target, either vvset or sys.Refer Hpe3parSdk::QoStargetTypeConstants for complete enumeration
|
693
|
+
# type target_type: String
|
694
|
+
# * qos_rules: QoS options
|
695
|
+
# type qos_rules: Hash
|
696
|
+
# qos_rules = {
|
697
|
+
# 'priority'=> 2, # Refer Hpe3parSdk::QoSpriorityEnumeration for complete enumeration
|
698
|
+
# 'bwMinGoalKB'=> 1024, # bandwidth rate minimum goal in
|
699
|
+
# # kilobytes per second
|
700
|
+
# 'bwMaxLimitKB'=> 1024, # bandwidth rate maximum limit in
|
701
|
+
# # kilobytes per second
|
702
|
+
# 'ioMinGoal'=> 10000, # I/O-per-second minimum goal.
|
703
|
+
# 'ioMaxLimit'=> 2000000, # I/0-per-second maximum limit
|
704
|
+
# 'enable'=> True, # QoS rule for target enabled?
|
705
|
+
# 'bwMinGoalOP'=> 1, # zero none operation enum, when set to
|
706
|
+
# # 1, bandwidth minimum goal is 0
|
707
|
+
# # when set to 2, the bandwidth minimum
|
708
|
+
# # goal is none (NoLimit)
|
709
|
+
# 'bwMaxLimitOP'=> 1, # zero none operation enum, when set to
|
710
|
+
# # 1, bandwidth maximum limit is 0
|
711
|
+
# # when set to 2, the bandwidth maximum
|
712
|
+
# # limit is none (NoLimit)
|
713
|
+
# 'ioMinGoalOP'=> 1, # zero none operation enum, when set to
|
714
|
+
# # 1, I/O minimum goal minimum goal is 0
|
715
|
+
# # when set to 2, the I/O minimum goal is
|
716
|
+
# # none (NoLimit)
|
717
|
+
# 'ioMaxLimitOP'=> 1, # zero none operation enum, when set to
|
718
|
+
# # 1, I/O maximum limit is 0
|
719
|
+
# # when set to 2, the I/O maximum limit
|
720
|
+
# # is none (NoLimit)
|
721
|
+
# 'latencyGoal'=> 5000, # Latency goal in milliseconds
|
722
|
+
# 'defaultLatency'=> false# Use latencyGoal or defaultLatency?
|
723
|
+
# }
|
724
|
+
#
|
725
|
+
# ==== Raises
|
726
|
+
#
|
727
|
+
# * Hpe3parSdk::HTTPBadRequest
|
728
|
+
# INV_INPUT_EXCEEDS_RANGE - Invalid input: number exceeds expected
|
729
|
+
# range.
|
730
|
+
# * Hpe3parSdk::HTTPNotFound
|
731
|
+
# NON_EXISTENT_QOS_RULE - QoS rule does not exists.
|
732
|
+
# * Hpe3parSdk::HTTPBadRequest
|
733
|
+
# INV_INPUT_ILLEGAL_CHAR - Illegal character in the input.
|
734
|
+
# * Hpe3parSdk::HTTPBadRequest
|
735
|
+
# EXISTENT_QOS_RULE - QoS rule already exists.
|
736
|
+
# * Hpe3parSdk::HTTPBadRequest
|
737
|
+
# INV_INPUT_IO_MIN_GOAL_GRT_MAX_LIMIT - I/O-per-second maximum limit
|
738
|
+
# should be greater than the minimum goal.
|
739
|
+
# * Hpe3parSdk::HTTPBadRequest
|
740
|
+
# INV_INPUT_BW_MIN_GOAL_GRT_MAX_LIMIT - Bandwidth maximum limit
|
741
|
+
# should be greater than the minimum goal.
|
742
|
+
# * Hpe3parSdk::HTTPBadRequest
|
743
|
+
# INV_INPUT_BELOW_RANGE - I/O-per-second limit is below
|
744
|
+
# range. Bandwidth limit is below range.
|
745
|
+
# * Hpe3parSdk::HTTPBadRequest
|
746
|
+
# UNLICENSED_FEATURE - The system is not licensed for QoS.
|
747
|
+
def modify_qos_rules(target_name, qos_rules, target_type = QoStargetTypeConstants::VVSET)
|
748
|
+
if @current_version < @min_version && !qos_rules.nil?
|
749
|
+
qos_rules.delete_if { |key, _value| key == :latencyGoaluSecs }
|
750
|
+
end
|
751
|
+
begin
|
752
|
+
@qos.modify_qos_rules(target_name, qos_rules, target_type)
|
753
|
+
rescue => ex
|
754
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
755
|
+
raise ex
|
756
|
+
end
|
757
|
+
end
|
758
|
+
|
759
|
+
# Deletes QoS rules.
|
760
|
+
#
|
761
|
+
# ==== Attributes
|
762
|
+
#
|
763
|
+
# * target_name: Name of the target. When target_type is sys, target_name must be sys:all_others.
|
764
|
+
# type target_name: String
|
765
|
+
# * target_type: target type is vvset or sys
|
766
|
+
# type target_type: String
|
767
|
+
#
|
768
|
+
# ==== Raises
|
769
|
+
#
|
770
|
+
# * Hpe3parSdk::HTTPNotFound
|
771
|
+
# NON_EXISTENT_QOS_RULE - QoS rule does not exist.
|
772
|
+
# * Hpe3parSdk::HTTPBadRequest
|
773
|
+
# INV_INPUT_ILLEGAL_CHAR - Illegal character in the input
|
774
|
+
def delete_qos_rules(target_name, target_type = QoStargetTypeConstants::VVSET)
|
775
|
+
begin
|
776
|
+
@qos.delete_qos_rules(target_name, target_type)
|
777
|
+
rescue => ex
|
778
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
779
|
+
raise ex
|
780
|
+
end
|
781
|
+
end
|
782
|
+
|
783
|
+
# Gets all hosts.
|
784
|
+
#
|
785
|
+
# ==== Returns
|
786
|
+
#
|
787
|
+
# Array of Host.
|
788
|
+
def get_hosts
|
789
|
+
begin
|
790
|
+
@host.get_hosts
|
791
|
+
rescue => ex
|
792
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
793
|
+
raise ex
|
794
|
+
end
|
795
|
+
end
|
796
|
+
|
797
|
+
# Gets host information by name.
|
798
|
+
#
|
799
|
+
# ==== Attributes
|
800
|
+
#
|
801
|
+
# * name - The name of the host to find.
|
802
|
+
# type name: String
|
803
|
+
#
|
804
|
+
# ==== Returns
|
805
|
+
#
|
806
|
+
# Host.
|
807
|
+
#
|
808
|
+
# ==== Raises
|
809
|
+
#
|
810
|
+
# * Hpe3parSdk::HTTPBadRequest
|
811
|
+
# - INV_INPUT - Invalid URI syntax.
|
812
|
+
# * Hpe3parSdk::HTTPNotFound
|
813
|
+
# - NON_EXISTENT_HOST - Host not found.
|
814
|
+
# * Hpe3parSdk::HTTPInternalServerError
|
815
|
+
# - INT_SERV_ERR - Internal server error.
|
816
|
+
# * Hpe3parSdk::HTTPBadRequest
|
817
|
+
# - INV_INPUT_ILLEGAL_CHAR - Host name contains invalid character.
|
818
|
+
def get_host(name)
|
819
|
+
begin
|
820
|
+
@host.get_host(name)
|
821
|
+
rescue => ex
|
822
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
823
|
+
raise ex
|
824
|
+
end
|
825
|
+
end
|
826
|
+
|
827
|
+
# Creates a new Host.
|
828
|
+
#
|
829
|
+
# ==== Attributes
|
830
|
+
#
|
831
|
+
# * name - The name of the host.
|
832
|
+
# type name: String
|
833
|
+
# * iscsi_names - Array of iSCSI iqns.
|
834
|
+
# type iscsi_names: Array
|
835
|
+
# * fcwwns - Array of Fibre Channel World Wide Names.
|
836
|
+
# type fcwwns: Array
|
837
|
+
# * optional - The optional stuff.
|
838
|
+
# type optional: Hash
|
839
|
+
# optional = {
|
840
|
+
# 'persona'=> 1, # Refer Hpe3parSdk::HostPersona for complete enumeration.
|
841
|
+
# # 3.1.3 default: Generic-ALUA
|
842
|
+
# # 3.1.2 default: General
|
843
|
+
# 'domain'=> 'myDomain', # Create the host in the
|
844
|
+
# # specified domain, or default
|
845
|
+
# # domain if unspecified.
|
846
|
+
# 'forceTearDown'=> false, # If True, force to tear down
|
847
|
+
# # low-priority VLUN exports.
|
848
|
+
# 'descriptors'=>
|
849
|
+
# {'location'=> 'earth', # The host's location
|
850
|
+
# 'IPAddr'=> '10.10.10.10', # The host's IP address
|
851
|
+
# 'os'=> 'linux', # The operating system running on the host.
|
852
|
+
# 'model'=> 'ex', # The host's model
|
853
|
+
# 'contact'=> 'Smith', # The host's owner and contact
|
854
|
+
# 'comment'=> "Joe's box"} # Additional host information
|
855
|
+
# }
|
856
|
+
#
|
857
|
+
# ==== Raises
|
858
|
+
#
|
859
|
+
# * Hpe3parSdk::HTTPForbidden
|
860
|
+
# - PERM_DENIED - Permission denied.
|
861
|
+
# * Hpe3parSdk::HTTPBadRequest
|
862
|
+
# - INV_INPUT_MISSING_REQUIRED - Name not specified.
|
863
|
+
# * Hpe3parSdk::HTTPBadRequest
|
864
|
+
# - INV_INPUT_PARAM_CONFLICT - FCWWNs and iSCSINames are both specified.
|
865
|
+
# * Hpe3parSdk::HTTPBadRequest
|
866
|
+
# - INV_INPUT_EXCEEDS_LENGTH - Host name, domain name, or iSCSI name is too long.
|
867
|
+
# * Hpe3parSdk::HTTPBadRequest
|
868
|
+
# - INV_INPUT_EMPTY_STR - Input string (for domain name, iSCSI name, etc.) is empty.
|
869
|
+
# * Hpe3parSdk::HTTPBadRequest
|
870
|
+
# - INV_INPUT_ILLEGAL_CHAR - Any error from host-name or domain-name parsing.
|
871
|
+
# * Hpe3parSdk::HTTPBadRequest
|
872
|
+
# - INV_INPUT_TOO_MANY_WWN_OR_iSCSI - More than 1024 WWNs or iSCSI names are specified.
|
873
|
+
# * Hpe3parSdk::HTTPBadRequest
|
874
|
+
# - INV_INPUT_WRONG_TYPE - The length of WWN is not 16. WWN specification contains non-hexadecimal digit.
|
875
|
+
# * Hpe3parSdk::HTTPConflict
|
876
|
+
# - EXISTENT_PATH - host WWN/iSCSI name already used by another host.
|
877
|
+
# * Hpe3parSdk::HTTPConflict
|
878
|
+
# - EXISTENT_HOST - host name is already used.
|
879
|
+
# * Hpe3parSdk::HTTPBadRequest
|
880
|
+
# - NO_SPACE - No space to create host.
|
881
|
+
def create_host(name, iscsi_names = nil, fcwwns = nil, optional = nil)
|
882
|
+
begin
|
883
|
+
@host.create_host(name, iscsi_names, fcwwns, optional)
|
884
|
+
rescue => ex
|
885
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
886
|
+
raise ex
|
887
|
+
end
|
888
|
+
end
|
889
|
+
|
890
|
+
# Modifies an existing Host.
|
891
|
+
#
|
892
|
+
# ==== Attributes
|
893
|
+
#
|
894
|
+
# * name - Name of the host.
|
895
|
+
# type name: String
|
896
|
+
# * mod_request - Objects for host modification request.
|
897
|
+
# type mod_request: Hash
|
898
|
+
# mod_request = {
|
899
|
+
# 'newName'=> 'myNewName', # New name of the host
|
900
|
+
# 'pathOperation'=> 1, # Refer Hpe3parSdk::HostEditOperation for complete enumeration
|
901
|
+
# 'FCWWNs'=> [], # One or more WWN to set for the host.
|
902
|
+
# 'iSCSINames'=> [], # One or more iSCSI names to set for the host.
|
903
|
+
# 'forcePathRemoval'=> false, # If True, remove SSN(s) or
|
904
|
+
# # iSCSI(s) even if there are
|
905
|
+
# # VLUNs exported to host
|
906
|
+
# 'persona'=> 1, # Refer Hpe3parSdk::HostPersona for complete enumeration.
|
907
|
+
# 'descriptors'=>
|
908
|
+
# {'location'=> 'earth', # The host's location
|
909
|
+
# 'IPAddr'=> '10.10.10.10', # The host's IP address
|
910
|
+
# 'os'=> 'linux', # The operating system running on the host.
|
911
|
+
# 'model'=> 'ex', # The host's model
|
912
|
+
# 'contact'=> 'Smith', # The host's owner and contact
|
913
|
+
# 'comment'=> 'Joes box'} # Additional host information
|
914
|
+
# 'chapOperation'=> 1, # Refer Hpe3parSdk::HostEditOperation for complete enumeration
|
915
|
+
# 'chapOperationMode'=> TARGET, # Refer Hpe3parSdk::ChapOperationMode for complete enumeration
|
916
|
+
# 'chapName'=> 'MyChapName', # The chap name
|
917
|
+
# 'chapSecret'=> 'xyz', # The chap secret for the host or the target
|
918
|
+
# 'chapSecretHex'=> false, # If True, the chapSecret is treated as Hex.
|
919
|
+
# 'chapRemoveTargetOnly'=> true # If True, then remove target chap only
|
920
|
+
# }
|
921
|
+
#
|
922
|
+
# ==== Raises
|
923
|
+
#
|
924
|
+
# * Hpe3parSdk::HTTPBadRequest
|
925
|
+
# - INV_INPUT - Missing host name.
|
926
|
+
# * Hpe3parSdk::HTTPBadRequest
|
927
|
+
# - INV_INPUT_PARAM_CONFLICT - Both iSCSINames & FCWWNs are specified. (lot of other possibilities).
|
928
|
+
# * Hpe3parSdk::HTTPBadRequest
|
929
|
+
# - INV_INPUT_ONE_REQUIRED - iSCSINames or FCWwns missing.
|
930
|
+
# * Hpe3parSdk::HTTPBadRequest
|
931
|
+
# - INV_INPUT_ONE_REQUIRED - No path operation specified.
|
932
|
+
# * Hpe3parSdk::HTTPBadRequest
|
933
|
+
# - INV_INPUT_BAD_ENUM_VALUE - Invalid enum value.
|
934
|
+
# * Hpe3parSdk::HTTPBadRequest
|
935
|
+
# - INV_INPUT_MISSING_REQUIRED - Required fields missing.
|
936
|
+
# * Hpe3parSdk::HTTPBadRequest
|
937
|
+
# - INV_INPUT_EXCEEDS_LENGTH - Host descriptor argument length, new host name, or iSCSI name is too long.
|
938
|
+
# * Hpe3parSdk::HTTPBadRequest
|
939
|
+
# - INV_INPUT_ILLEGAL_CHAR - Error parsing host or iSCSI name.
|
940
|
+
# * Hpe3parSdk::HTTPConflict
|
941
|
+
# - EXISTENT_HOST - New host name is already used.
|
942
|
+
# * Hpe3parSdk::HTTPNotFound
|
943
|
+
# - NON_EXISTENT_HOST - Host to be modified does not exist.
|
944
|
+
# * Hpe3parSdk::HTTPBadRequest
|
945
|
+
# - INV_INPUT_TOO_MANY_WWN_OR_iSCSI - More than 1024 WWNs or iSCSI names are specified.
|
946
|
+
# * Hpe3parSdk::HTTPBadRequest
|
947
|
+
# - INV_INPUT_WRONG_TYPE - Input value is of the wrong type.
|
948
|
+
# * Hpe3parSdk::HTTPConflict
|
949
|
+
# - EXISTENT_PATH - WWN or iSCSI name is already claimed by other host.
|
950
|
+
# * Hpe3parSdk::HTTPBadRequest
|
951
|
+
# - INV_INPUT_BAD_LENGTH - CHAP hex secret length is not 16 bytes, or chap ASCII secret length is not 12 to 16 characters.
|
952
|
+
# * Hpe3parSdk::HTTPNotFound
|
953
|
+
# - NO_INITIATOR_CHAP - Setting target CHAP without initiator CHAP.
|
954
|
+
# * Hpe3parSdk::HTTPNotFound
|
955
|
+
# - NON_EXISTENT_CHAP - Remove non-existing CHAP.
|
956
|
+
# * Hpe3parSdk::HTTPConflict
|
957
|
+
# - NON_UNIQUE_CHAP_SECRET - CHAP secret is not unique.
|
958
|
+
# * Hpe3parSdk::HTTPConflict
|
959
|
+
# - EXPORTED_VLUN - Setting persona with active export; remove a host path on an active export.
|
960
|
+
# * Hpe3parSdk::HTTPBadRequest
|
961
|
+
# - NON_EXISTENT_PATH - Remove a non-existing path.
|
962
|
+
# * Hpe3parSdk::HTTPConflict
|
963
|
+
# - LUN_HOSTPERSONA_CONFLICT - LUN number and persona capability conflict.
|
964
|
+
# * Hpe3parSdk::HTTPBadRequest
|
965
|
+
# - INV_INPUT_DUP_PATH - Duplicate path specified.
|
966
|
+
def modify_host(name, mod_request)
|
967
|
+
begin
|
968
|
+
@host.modify_host(name, mod_request)
|
969
|
+
rescue => ex
|
970
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
971
|
+
raise ex
|
972
|
+
end
|
973
|
+
end
|
974
|
+
|
975
|
+
# Deletes a host.
|
976
|
+
#
|
977
|
+
# ==== Attributes
|
978
|
+
#
|
979
|
+
# * name - The name of host to be deleted.
|
980
|
+
# type name: String
|
981
|
+
#
|
982
|
+
# ==== Raises
|
983
|
+
#
|
984
|
+
# * Hpe3parSdk::HTTPNotFound
|
985
|
+
# - NON_EXISTENT_HOST - Host not found
|
986
|
+
# * Hpe3parSdk::HTTPConflict
|
987
|
+
# - HOST_IN_SET - Host is a member of a set
|
988
|
+
def delete_host(name)
|
989
|
+
begin
|
990
|
+
@host.delete_host(name)
|
991
|
+
rescue => ex
|
992
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
993
|
+
raise ex
|
994
|
+
end
|
995
|
+
end
|
996
|
+
|
997
|
+
# Finds the host with the specified FC WWN path.
|
998
|
+
#
|
999
|
+
# ==== Attributes
|
1000
|
+
#
|
1001
|
+
# * wwn - Lookup based on WWN.
|
1002
|
+
# type wwn: String
|
1003
|
+
#
|
1004
|
+
# ==== Returns
|
1005
|
+
#
|
1006
|
+
# Host with specified FC WWN.
|
1007
|
+
#
|
1008
|
+
# ==== Raises
|
1009
|
+
#
|
1010
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1011
|
+
# - INV_INPUT - Invalid URI syntax.
|
1012
|
+
# * Hpe3parSdk::HTTPNotFound
|
1013
|
+
# - NON_EXISTENT_HOST - HOST Not Found
|
1014
|
+
# * Hpe3parSdk::HTTPInternalServerError
|
1015
|
+
# - INTERNAL_SERVER_ERR - Internal server error.
|
1016
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1017
|
+
# - INV_INPUT_ILLEGAL_CHAR - Host name contains invalid character.
|
1018
|
+
def query_host_by_fc_path(wwn = nil)
|
1019
|
+
begin
|
1020
|
+
@host.query_host_by_fc_path(wwn)
|
1021
|
+
rescue => ex
|
1022
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1023
|
+
raise ex
|
1024
|
+
end
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
# Finds the host with the specified iSCSI initiator.
|
1028
|
+
#
|
1029
|
+
# ==== Attributes
|
1030
|
+
#
|
1031
|
+
# * iqn - Lookup based on iSCSI initiator.
|
1032
|
+
# type iqn: String
|
1033
|
+
#
|
1034
|
+
# ==== Returns
|
1035
|
+
#
|
1036
|
+
# Host with specified IQN.
|
1037
|
+
#
|
1038
|
+
# ==== Raises
|
1039
|
+
#
|
1040
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1041
|
+
# - INV_INPUT - Invalid URI syntax.
|
1042
|
+
# * Hpe3parSdk::HTTPNotFound
|
1043
|
+
# - NON_EXISTENT_HOST - The specified host not found.
|
1044
|
+
# * Hpe3parSdk::HTTPInternalServerError
|
1045
|
+
# - INTERNAL_SERVER_ERR - Internal server error.
|
1046
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1047
|
+
# - INV_INPUT_ILLEGAL_CHAR - The host name contains invalid character.
|
1048
|
+
def query_host_by_iscsi_path(iqn = nil)
|
1049
|
+
begin
|
1050
|
+
@host.query_host_by_iscsi_path(iqn)
|
1051
|
+
rescue => ex
|
1052
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1053
|
+
raise ex
|
1054
|
+
end
|
1055
|
+
end
|
1056
|
+
|
1057
|
+
# Gets all host sets.
|
1058
|
+
#
|
1059
|
+
# ==== Returns
|
1060
|
+
#
|
1061
|
+
# Array of HostSet.
|
1062
|
+
def get_host_sets
|
1063
|
+
begin
|
1064
|
+
@host_set.get_host_sets
|
1065
|
+
rescue => ex
|
1066
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1067
|
+
raise ex
|
1068
|
+
end
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
# Creates a new HostSet.
|
1072
|
+
#
|
1073
|
+
# ==== Attributes
|
1074
|
+
#
|
1075
|
+
# * name - Name of the host set to be created.
|
1076
|
+
# type name: String
|
1077
|
+
# * domain - The domain in which the host set will be created.
|
1078
|
+
# type domain: String
|
1079
|
+
# * comment - Comment for the host set.
|
1080
|
+
# type comment: String
|
1081
|
+
# * setmembers - The hosts to be added to the set. The existence of the host will not be checked.
|
1082
|
+
# type setmembers: Array of String
|
1083
|
+
#
|
1084
|
+
# ==== Raises
|
1085
|
+
#
|
1086
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1087
|
+
# - EXISTENT_SET - The set already exits.
|
1088
|
+
# * Hpe3parSdk::HTTPNotFound
|
1089
|
+
# - NON_EXISTENT_DOMAIN - The domain does not exist.
|
1090
|
+
# * Hpe3parSdk::HTTPConflict
|
1091
|
+
# - MEMBER_IN_DOMAINSET - The host is in a domain set.
|
1092
|
+
# * Hpe3parSdk::HTTPConflict
|
1093
|
+
# - MEMBER_IN_SET - The object is already part of the set.
|
1094
|
+
# * Hpe3parSdk::HTTPConflict
|
1095
|
+
# - MEMBER_NOT_IN_SAME_DOMAIN - Objects must be in the same domain to perform this operation.
|
1096
|
+
# * Hpe3parSdk::HTTPNotFound
|
1097
|
+
# - NON_EXISTENT_HOST - The host does not exists.
|
1098
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1099
|
+
# - INV_INPUT_DUP_NAME - Invalid input (duplicate name).
|
1100
|
+
def create_host_set(name, domain = nil, comment = nil, setmembers = nil)
|
1101
|
+
begin
|
1102
|
+
@host_set.create_host_set(name, domain, comment, setmembers)
|
1103
|
+
rescue => ex
|
1104
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1105
|
+
raise ex
|
1106
|
+
end
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
# Deletes a HostSet.
|
1110
|
+
#
|
1111
|
+
# ==== Attributes
|
1112
|
+
#
|
1113
|
+
# * name - The hostset to delete.
|
1114
|
+
# type name: String
|
1115
|
+
#
|
1116
|
+
# ==== Raises
|
1117
|
+
#
|
1118
|
+
# * Hpe3parSdk::HTTPNotFound
|
1119
|
+
# - NON_EXISTENT_SET - The set does not exists.
|
1120
|
+
# * Hpe3parSdk::HTTPConflict
|
1121
|
+
# - EXPORTED_VLUN - The host set has exported VLUNs.
|
1122
|
+
def delete_host_set(name)
|
1123
|
+
begin
|
1124
|
+
@host_set.delete_host_set(name)
|
1125
|
+
rescue => ex
|
1126
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1127
|
+
raise ex
|
1128
|
+
end
|
1129
|
+
end
|
1130
|
+
|
1131
|
+
# Modifies a HostSet.
|
1132
|
+
#
|
1133
|
+
# ==== Attributes
|
1134
|
+
#
|
1135
|
+
# * name - Hostset name
|
1136
|
+
# type name: String
|
1137
|
+
# * action - Add or Remove host(s) from the set
|
1138
|
+
# type action: Refer values of Hpe3parSdk::SetCustomAction::MEM_ADD and Hpe3parSdk::SetCustomAction::MEM_REMOVE
|
1139
|
+
# * setmembers - Host(s) to add to the set, the existence of the host(s) will not be checked
|
1140
|
+
# type setmembers: Array of String
|
1141
|
+
# * new_name - New name of set
|
1142
|
+
# type new_name: String
|
1143
|
+
# * comment - New comment for the set
|
1144
|
+
# type comment: String
|
1145
|
+
#
|
1146
|
+
# ==== Raises
|
1147
|
+
#
|
1148
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1149
|
+
# - EXISTENT_SET - The set already exits.
|
1150
|
+
# * Hpe3parSdk::HTTPNotFound
|
1151
|
+
# - NON_EXISTENT_SET - The set does not exists.
|
1152
|
+
# * Hpe3parSdk::HTTPConflict
|
1153
|
+
# - MEMBER_IN_DOMAINSET - The host is in a domain set.
|
1154
|
+
# * Hpe3parSdk::HTTPConflict
|
1155
|
+
# - MEMBER_IN_SET - The object is already part of the set.
|
1156
|
+
# * Hpe3parSdk::HTTPNotFound
|
1157
|
+
# - MEMBER_NOT_IN_SET - The object is not part of the set.
|
1158
|
+
# * Hpe3parSdk::HTTPConflict
|
1159
|
+
# - MEMBER_NOT_IN_SAME_DOMAIN - Objects must be in the same domain to perform this operation.
|
1160
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1161
|
+
# - INV_INPUT_DUP_NAME - Invalid input (duplicate name).
|
1162
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1163
|
+
# - INV_INPUT_PARAM_CONFLICT - Invalid input (parameters cannot be present at the same time).
|
1164
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1165
|
+
# - INV_INPUT_ILLEGAL_CHAR - Invalid contains one or more illegal characters.
|
1166
|
+
def modify_host_set(name, action = nil, setmembers = nil, new_name = nil, comment = nil)
|
1167
|
+
begin
|
1168
|
+
@host_set.modify_host_set(name, action, setmembers, new_name, comment)
|
1169
|
+
rescue => ex
|
1170
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1171
|
+
raise ex
|
1172
|
+
end
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
# Adds host(s) to a host set.
|
1176
|
+
#
|
1177
|
+
# ==== Attributes
|
1178
|
+
#
|
1179
|
+
# * set_name - Hostset name.
|
1180
|
+
# type set_name: String
|
1181
|
+
# * setmembers - Array of host names to add to the set.
|
1182
|
+
# type setmembers: Array of String
|
1183
|
+
def add_hosts_to_host_set(set_name, setmembers)
|
1184
|
+
begin
|
1185
|
+
@host_set.add_hosts_to_host_set(set_name, setmembers)
|
1186
|
+
rescue => ex
|
1187
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1188
|
+
raise ex
|
1189
|
+
end
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
# Removes host(s) from a host set.
|
1193
|
+
#
|
1194
|
+
# ==== Attributes
|
1195
|
+
#
|
1196
|
+
# * set_name - The host set name.
|
1197
|
+
# type set_name: String
|
1198
|
+
# * setmembers - Array of host names to remove from the set.
|
1199
|
+
# type setmembers: Array of String
|
1200
|
+
def remove_hosts_from_host_set(set_name, setmembers)
|
1201
|
+
begin
|
1202
|
+
@host_set.remove_hosts_from_host_set(set_name, setmembers)
|
1203
|
+
rescue => ex
|
1204
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1205
|
+
raise ex
|
1206
|
+
end
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
# Returns an array of every Hostset the given host is a part of. The array can contain zero, one, or multiple items.
|
1210
|
+
#
|
1211
|
+
# ==== Attributes
|
1212
|
+
#
|
1213
|
+
# * host_name - The host name of whose hostset is to be found.
|
1214
|
+
# type host_name: String
|
1215
|
+
#
|
1216
|
+
# ==== Returns
|
1217
|
+
#
|
1218
|
+
# Array of HostSet.
|
1219
|
+
def find_host_sets(host_name)
|
1220
|
+
begin
|
1221
|
+
@host_set.find_host_sets(host_name)
|
1222
|
+
rescue => ex
|
1223
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1224
|
+
raise ex
|
1225
|
+
end
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
# Gets hostset information by name.
|
1229
|
+
#
|
1230
|
+
# ==== Attributes
|
1231
|
+
#
|
1232
|
+
# * name - The name of the hostset to find.
|
1233
|
+
# type name: String
|
1234
|
+
#
|
1235
|
+
# ==== Returns
|
1236
|
+
#
|
1237
|
+
# HostSet.
|
1238
|
+
#
|
1239
|
+
# ==== Raises
|
1240
|
+
#
|
1241
|
+
# * Hpe3parSdk::HTTPNotFound
|
1242
|
+
# - NON_EXISTENT_SET - The set does not exist.
|
1243
|
+
def get_host_set(name)
|
1244
|
+
begin
|
1245
|
+
@host_set.get_host_set(name)
|
1246
|
+
rescue => ex
|
1247
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1248
|
+
raise ex
|
1249
|
+
end
|
1250
|
+
end
|
1251
|
+
|
1252
|
+
# Gets all of the VLUNs on a specific host.
|
1253
|
+
#
|
1254
|
+
# ==== Attributes
|
1255
|
+
#
|
1256
|
+
# * host_name - Name of the host.
|
1257
|
+
# type host_name: String
|
1258
|
+
#
|
1259
|
+
# ==== Returns
|
1260
|
+
#
|
1261
|
+
# Array of VLUN.
|
1262
|
+
#
|
1263
|
+
# ==== Raises
|
1264
|
+
#
|
1265
|
+
# * Hpe3parSdk::HTTPNotFound
|
1266
|
+
# - NON_EXISTENT_HOST - The specified host not found.
|
1267
|
+
def get_host_vluns(host_name)
|
1268
|
+
begin
|
1269
|
+
@host.get_host_vluns(host_name)
|
1270
|
+
rescue => ex
|
1271
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1272
|
+
raise ex
|
1273
|
+
end
|
1274
|
+
end
|
1275
|
+
|
1276
|
+
# Gets all Volumes in the array
|
1277
|
+
#
|
1278
|
+
# ==== Returns
|
1279
|
+
#
|
1280
|
+
# Array of VirtualVolume
|
1281
|
+
def get_volumes
|
1282
|
+
begin
|
1283
|
+
@volume.get_volumes(VolumeCopyType::BASE_VOLUME)
|
1284
|
+
rescue => ex
|
1285
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1286
|
+
raise ex
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
|
1290
|
+
# Gets the list of snapshots in the array
|
1291
|
+
#
|
1292
|
+
# ==== Returns
|
1293
|
+
#
|
1294
|
+
# Array of VirtualVolume
|
1295
|
+
def get_snapshots
|
1296
|
+
begin
|
1297
|
+
@volume.get_volumes(VolumeCopyType::VIRTUAL_COPY)
|
1298
|
+
rescue => ex
|
1299
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1300
|
+
raise ex
|
1301
|
+
end
|
1302
|
+
end
|
1303
|
+
|
1304
|
+
# Gets information about a volume by name
|
1305
|
+
#
|
1306
|
+
# ==== Attributes
|
1307
|
+
#
|
1308
|
+
# * name - The name of the volume to find
|
1309
|
+
# type name: String
|
1310
|
+
#
|
1311
|
+
# ==== Returns
|
1312
|
+
#
|
1313
|
+
# VirtualVolume
|
1314
|
+
#
|
1315
|
+
# ==== Raises
|
1316
|
+
#
|
1317
|
+
# * Hpe3parSdk::HPE3PARException
|
1318
|
+
# Error with code: 23 message: volume does not exist
|
1319
|
+
def get_volume(name)
|
1320
|
+
begin
|
1321
|
+
@volume.get_volume(name)
|
1322
|
+
rescue => ex
|
1323
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1324
|
+
raise ex
|
1325
|
+
end
|
1326
|
+
end
|
1327
|
+
|
1328
|
+
# Gets information about a volume by wwn
|
1329
|
+
#
|
1330
|
+
# ==== Attributes
|
1331
|
+
#
|
1332
|
+
# * wwn - The wwn of the volume to find
|
1333
|
+
# type wwn: String
|
1334
|
+
#
|
1335
|
+
# ==== Returns
|
1336
|
+
#
|
1337
|
+
# * VirtualVolume
|
1338
|
+
#
|
1339
|
+
# ==== Raises
|
1340
|
+
#
|
1341
|
+
# * Hpe3parSdk::HPE3PARException
|
1342
|
+
# Error with code: 23 message: volume does not exist
|
1343
|
+
def get_volume_by_wwn(wwn)
|
1344
|
+
begin
|
1345
|
+
@volume.get_volume_by_wwn(wwn)
|
1346
|
+
rescue => ex
|
1347
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1348
|
+
raise ex
|
1349
|
+
end
|
1350
|
+
end
|
1351
|
+
|
1352
|
+
# Creates a new volume.
|
1353
|
+
#
|
1354
|
+
# ==== Attributes
|
1355
|
+
#
|
1356
|
+
# * name - the name of the volume
|
1357
|
+
# type name: String
|
1358
|
+
# * cpg_name - the name of the destination CPG
|
1359
|
+
# type cpg_name: String
|
1360
|
+
# * size_MiB - size in MiB for the volume
|
1361
|
+
# type size_MiB: Integer
|
1362
|
+
# * optional - hash of other optional items
|
1363
|
+
# type optional: hash
|
1364
|
+
#
|
1365
|
+
# optional = {
|
1366
|
+
# 'id' => 12, # Volume ID. If not specified, next
|
1367
|
+
# # available is chosen
|
1368
|
+
# 'comment' => 'some comment', # Additional information up to 511
|
1369
|
+
# # characters
|
1370
|
+
# 'policies: { # Specifies VV policies
|
1371
|
+
# 'staleSS' => false, # True allows stale snapshots.
|
1372
|
+
# 'oneHost' => true, # True constrains volume export to
|
1373
|
+
# # single host or host cluster
|
1374
|
+
# 'zeroDetect' => true, # True requests Storage System to
|
1375
|
+
# # scan for zeros in incoming write
|
1376
|
+
# # data
|
1377
|
+
# 'system' => false, # True special volume used by system
|
1378
|
+
# # False is normal user volume
|
1379
|
+
# 'caching' => true}, # Read-only. True indicates write &
|
1380
|
+
# # read caching & read ahead enabled
|
1381
|
+
# 'snapCPG' => 'CPG name', # CPG Used for snapshots
|
1382
|
+
# 'ssSpcAllocWarningPct' => 12, # Snapshot space allocation warning
|
1383
|
+
# 'ssSpcAllocLimitPct' => 22, # Snapshot space allocation limit
|
1384
|
+
# 'tpvv' => true, # True: Create TPVV
|
1385
|
+
# # False (default) Create FPVV
|
1386
|
+
# 'usrSpcAllocWarningPct' => 22, # Enable user space allocation
|
1387
|
+
# # warning
|
1388
|
+
# 'usrSpcAllocLimitPct' => 22, # User space allocation limit
|
1389
|
+
# 'expirationHours' => 256, # Relative time from now to expire
|
1390
|
+
# # volume (max 43,800 hours)
|
1391
|
+
# 'retentionHours' => 256 # Relative time from now to retain
|
1392
|
+
# }
|
1393
|
+
#
|
1394
|
+
# ==== Raises
|
1395
|
+
#
|
1396
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1397
|
+
# - INV_INPUT - Invalid Parameter
|
1398
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1399
|
+
# - TOO_LARGE - Volume size above limit
|
1400
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1401
|
+
# - NO_SPACE - Not Enough space is available
|
1402
|
+
# * Hpe3parSdk::HTTPForbidden
|
1403
|
+
# - PERM_DENIED - Permission denied
|
1404
|
+
# * Hpe3parSdk::HTTPConflict
|
1405
|
+
# - EXISTENT_SV - Volume Exists already
|
1406
|
+
def create_volume(name, cpg_name, size_MiB, optional = nil)
|
1407
|
+
if @current_version < @min_version_with_compression && !optional.nil?
|
1408
|
+
optional.delete_if { |key, _value| key == :compression }
|
1409
|
+
end
|
1410
|
+
begin
|
1411
|
+
@volume.create_volume(name, cpg_name, size_MiB, optional)
|
1412
|
+
rescue => ex
|
1413
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1414
|
+
raise ex
|
1415
|
+
end
|
1416
|
+
end
|
1417
|
+
|
1418
|
+
# Deletes a volume
|
1419
|
+
#
|
1420
|
+
# ==== Attributes
|
1421
|
+
#
|
1422
|
+
# * name - the name of the volume
|
1423
|
+
# type name: String
|
1424
|
+
#
|
1425
|
+
# ==== Raises
|
1426
|
+
#
|
1427
|
+
# * Hpe3parSdk::HTTPNotFound
|
1428
|
+
# - NON_EXISTENT_VOL - The volume does not exist
|
1429
|
+
# * Hpe3parSdk::HTTPForbidden
|
1430
|
+
# - PERM_DENIED - Permission denied
|
1431
|
+
# * Hpe3parSdk::HTTPForbidden
|
1432
|
+
# - RETAINED - Volume retention time has not expired
|
1433
|
+
# * Hpe3parSdk::HTTPForbidden
|
1434
|
+
# - HAS_RO_CHILD - Volume has read-only child
|
1435
|
+
# * Hpe3parSdk::HTTPConflict
|
1436
|
+
# - HAS_CHILD - The volume has a child volume
|
1437
|
+
# * Hpe3parSdk::HTTPConflict
|
1438
|
+
# - IN_USE - The volume is in use by VV set, VLUN, etc
|
1439
|
+
def delete_volume(name)
|
1440
|
+
begin
|
1441
|
+
@volume.delete_volume(name)
|
1442
|
+
rescue => ex
|
1443
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1444
|
+
raise ex
|
1445
|
+
end
|
1446
|
+
end
|
1447
|
+
|
1448
|
+
# Modifies a volume
|
1449
|
+
#
|
1450
|
+
# ==== Attributes
|
1451
|
+
#
|
1452
|
+
# * name - the name of the volume
|
1453
|
+
# type name: String
|
1454
|
+
# * volumeMods - Hash of volume attributes to change
|
1455
|
+
# type volumeMods: Hash
|
1456
|
+
# volumeMods = {
|
1457
|
+
# 'newName' => 'newName', # New volume name
|
1458
|
+
# 'comment' => 'some comment', # New volume comment
|
1459
|
+
# 'snapCPG' => 'CPG name', # Snapshot CPG name
|
1460
|
+
# 'policies: { # Specifies VV policies
|
1461
|
+
# 'staleSS' => false, # True allows stale snapshots.
|
1462
|
+
# 'oneHost' => true, # True constrains volume export to
|
1463
|
+
# # single host or host cluster
|
1464
|
+
# 'zeroDetect' => true, # True requests Storage System to
|
1465
|
+
# # scan for zeros in incoming write
|
1466
|
+
# # data
|
1467
|
+
# 'system' => false, # True special volume used by system
|
1468
|
+
# # False is normal user volume
|
1469
|
+
# 'caching' => true}, # Read-only. True indicates write &
|
1470
|
+
# # read caching & read ahead enabled
|
1471
|
+
# 'ssSpcAllocWarningPct' => 12, # Snapshot space allocation warning
|
1472
|
+
# 'ssSpcAllocLimitPct' => 22, # Snapshot space allocation limit
|
1473
|
+
# 'tpvv' => true, # True: Create TPVV
|
1474
|
+
# # False: (default) Create FPVV
|
1475
|
+
# 'usrSpcAllocWarningPct' => 22, # Enable user space allocation
|
1476
|
+
# # warning
|
1477
|
+
# 'usrSpcAllocLimitPct' => 22, # User space allocation limit
|
1478
|
+
# 'userCPG' => 'User CPG name', # User CPG name
|
1479
|
+
# 'expirationHours' => 256, # Relative time from now to expire
|
1480
|
+
# # volume (max 43,800 hours)
|
1481
|
+
# 'retentionHours' => 256, # Relative time from now to retain
|
1482
|
+
# # volume (max 43,800 hours)
|
1483
|
+
# 'rmSsSpcAllocWarning' => false, # True removes snapshot space
|
1484
|
+
# # allocation warning.
|
1485
|
+
# # False sets it when value > 0
|
1486
|
+
# 'rmUsrSpcAllocWarwaning' => false,# True removes user space
|
1487
|
+
# # allocation warning.
|
1488
|
+
# # False sets it when value > 0
|
1489
|
+
# 'rmExpTime' => false, # True resets expiration time to 0.
|
1490
|
+
# # False sets it when value > 0
|
1491
|
+
# 'rmSsSpcAllocLimit' => false, # True removes snapshot space
|
1492
|
+
# # allocation limit.
|
1493
|
+
# # False sets it when value > 0
|
1494
|
+
# 'rmUsrSpcAllocLimit' => false # True removes user space
|
1495
|
+
# # allocation limit.
|
1496
|
+
# # False sets it when value > 0
|
1497
|
+
# }
|
1498
|
+
#
|
1499
|
+
# ==== Raises:
|
1500
|
+
#
|
1501
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1502
|
+
# - INV_INPUT_WARN_GT_LIMIT - Allocation warning level is higher than
|
1503
|
+
# the limit.
|
1504
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1505
|
+
# - INV_INPUT_USR_ALRT_NON_TPVV - User space allocation alerts are
|
1506
|
+
# valid only with a TPVV.
|
1507
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1508
|
+
# - INV_INPUT_RETAIN_GT_EXPIRE - Retention time is greater than
|
1509
|
+
# expiration time.
|
1510
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1511
|
+
# - INV_INPUT_VV_POLICY - Invalid policy specification (for example,
|
1512
|
+
# caching or system is set to true).
|
1513
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1514
|
+
# - INV_INPUT_EXCEEDS_LENGTH - Invalid input: string length exceeds
|
1515
|
+
# limit.
|
1516
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1517
|
+
# - INV_INPUT_TIME - Invalid time specified.
|
1518
|
+
# * Hpe3parSdk::HTTPForbidden
|
1519
|
+
# - INV_OPERATION_VV_MODIFY_USR_CPG_TPVV - usr_cpg cannot be modified
|
1520
|
+
# on a TPVV.
|
1521
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1522
|
+
# - UNLICENSED_FEATURE - Retention time cannot be modified on a
|
1523
|
+
# system without the Virtual Lock license.
|
1524
|
+
# * Hpe3parSdk::HTTPForbidden
|
1525
|
+
# - CPG_NOT_IN_SAME_DOMAIN - Snap CPG is not in the same domain as
|
1526
|
+
# the user CPG.
|
1527
|
+
# * Hpe3parSdk::HTTPForbidden
|
1528
|
+
# - INV_OPERATION_VV_PEER_VOLUME - Cannot modify a peer volume.
|
1529
|
+
# * Hpe3parSdk::HTTPInternalServerError
|
1530
|
+
# - INT_SERV_ERR - Metadata of the VV is corrupted.
|
1531
|
+
# * Hpe3parSdk::HTTPForbidden
|
1532
|
+
# - INV_OPERATION_VV_SYS_VOLUME - Cannot modify retention time on a
|
1533
|
+
# system volume.
|
1534
|
+
# * Hpe3parSdk::HTTPForbidden
|
1535
|
+
# - INV_OPERATION_VV_INTERNAL_VOLUME - Cannot modify an internal
|
1536
|
+
# volume
|
1537
|
+
# * Hpe3parSdk::HTTPConflict
|
1538
|
+
# - INV_OPERATION_VV_VOLUME_NOT_DEFINED_ALL_NODES - Cannot modify a
|
1539
|
+
# volume until the volume is defined on all volumes.
|
1540
|
+
# * Hpe3parSdk::HTTPConflict
|
1541
|
+
# - INVALID_OPERATION_VV_ONLINE_COPY_IN_PROGRESS - Cannot modify a
|
1542
|
+
# volume when an online copy for that volume is in progress.
|
1543
|
+
# * Hpe3parSdk::HTTPConflict
|
1544
|
+
# - INVALID_OPERATION_VV_VOLUME_CONV_IN_PROGRESS - Cannot modify a
|
1545
|
+
# volume in the middle of a conversion operation.
|
1546
|
+
# * Hpe3parSdk::HTTPConflict
|
1547
|
+
# - INVALID_OPERATION_VV_SNAPSPACE_NOT_MOVED_TO_CPG - Snapshot space
|
1548
|
+
# of a volume needs to be moved to a CPG before the user space.
|
1549
|
+
# * Hpe3parSdk::HTTPConflict
|
1550
|
+
# - INV_OPERATION_VV_VOLUME_ACCOUNTING_IN_PROGRESS - The volume
|
1551
|
+
# cannot be renamed until snapshot accounting has finished.
|
1552
|
+
# * Hpe3parSdk::HTTPForbidden
|
1553
|
+
# - INV_OPERATION_VV_ZERO_DETECT_TPVV - The zero_detect policy can be
|
1554
|
+
# used only on TPVVs.
|
1555
|
+
# * Hpe3parSdk::HTTPConflict
|
1556
|
+
# - INV_OPERATION_VV_CPG_ON_SNAPSHOT - CPG cannot be assigned to a
|
1557
|
+
# snapshot.
|
1558
|
+
def modify_volume(name, volume_mods)
|
1559
|
+
begin
|
1560
|
+
@volume.modify_volume(name, volume_mods)
|
1561
|
+
rescue => ex
|
1562
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1563
|
+
raise ex
|
1564
|
+
end
|
1565
|
+
end
|
1566
|
+
|
1567
|
+
# Grows an existing volume by 'amount' Mebibytes.
|
1568
|
+
#
|
1569
|
+
# ==== Attributes
|
1570
|
+
#
|
1571
|
+
# * name - the name of the volume
|
1572
|
+
# type name: String
|
1573
|
+
# * amount: the additional size in MiB to add, rounded up to the next chunklet size (e.g. 256 or 1000 MiB)
|
1574
|
+
# type amount: Integer
|
1575
|
+
#
|
1576
|
+
# ==== Raises:
|
1577
|
+
#
|
1578
|
+
# * Hpe3parSdk::HTTPForbidden
|
1579
|
+
# - VV_NOT_IN_SAME_DOMAIN - The volume is not in the same domain.
|
1580
|
+
# * Hpe3parSdk::HTTPNotFound
|
1581
|
+
# - NON_EXISTENT_VOL - The volume does not exist.
|
1582
|
+
# * Hpe3parSdk::HTTPForbidden
|
1583
|
+
# - INV_OPERATION_UNSUPPORTED_VV_TYPE - Invalid operation: Cannot
|
1584
|
+
# grow this type of volume.
|
1585
|
+
# * Hpe3parSdk::HTTPConflict
|
1586
|
+
# - INV_OPERATION_VV_TUNE_IN_PROGRESS - Invalid operation: Volume
|
1587
|
+
# tuning is in progress.
|
1588
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1589
|
+
# - INV_INPUT_EXCEEDS_LENGTH - Invalid input: String length exceeds
|
1590
|
+
# limit.
|
1591
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1592
|
+
# - INV_INPUT_VV_GROW_SIZE - Invalid grow size.
|
1593
|
+
# * Hpe3parSdk::HTTPForbidden
|
1594
|
+
# - VV_NEW_SIZE_EXCEEDS_CPG_LIMIT - New volume size exceeds CPG limit
|
1595
|
+
# * Hpe3parSdk::HTTPForbidden
|
1596
|
+
# - INV_OPERATION_VV_INTERNAL_VOLUME - This operation is not allowed
|
1597
|
+
# on an internal volume.
|
1598
|
+
# * Hpe3parSdk::HTTPConflict
|
1599
|
+
# - INV_OPERATION_VV_VOLUME_CONV_IN_PROGRESS - Invalid operation: VV
|
1600
|
+
# conversion is in progress.
|
1601
|
+
# * Hpe3parSdk::HTTPConflict
|
1602
|
+
# - INV_OPERATION_VV_VOLUME_COPY_IN_PROGRESS - Invalid operation:
|
1603
|
+
# online copy is in progress.
|
1604
|
+
# * Hpe3parSdk::HTTPForbidden
|
1605
|
+
# - INV_OPERATION_VV_CLEANUP_IN_PROGRESS - Internal volume cleanup is
|
1606
|
+
# in progress.
|
1607
|
+
# * Hpe3parSdk::HTTPForbidden
|
1608
|
+
# - VV_IS_BEING_REMOVED - The volume is being removed.
|
1609
|
+
# * Hpe3parSdk::HTTPForbidden
|
1610
|
+
# - VV_IN_INCONSISTENT_STATE - The volume has an internal consistency
|
1611
|
+
# error.
|
1612
|
+
# * Hpe3parSdk::HTTPForbidden
|
1613
|
+
# - VV_SIZE_CANNOT_REDUCE - New volume size is smaller than the
|
1614
|
+
# current size.
|
1615
|
+
# * Hpe3parSdk::HTTPForbidden
|
1616
|
+
# - VV_NEW_SIZE_EXCEEDS_LIMITS - New volume size exceeds the limit.
|
1617
|
+
# * Hpe3parSdk::HTTPConflict
|
1618
|
+
# - INV_OPERATION_VV_SA_SD_SPACE_REMOVED - Invalid operation: Volume
|
1619
|
+
# SA/SD space is being removed.
|
1620
|
+
# * Hpe3parSdk::HTTPConflict
|
1621
|
+
# - INV_OPERATION_VV_IS_BUSY - Invalid operation: Volume is currently
|
1622
|
+
# busy.
|
1623
|
+
# * Hpe3parSdk::HTTPForbidden
|
1624
|
+
# - VV_NOT_STARTED - Volume is not started.
|
1625
|
+
# * Hpe3parSdk::HTTPConflict
|
1626
|
+
# - INV_OPERATION_VV_IS_PCOPY - Invalid operation: Volume is a
|
1627
|
+
# physical copy.
|
1628
|
+
# * Hpe3parSdk::HTTPForbidden
|
1629
|
+
# - INV_OPERATION_VV_NOT_IN_NORMAL_STATE - Volume state is not normal
|
1630
|
+
# * Hpe3parSdk::HTTPConflict
|
1631
|
+
# - INV_OPERATION_VV_PROMOTE_IN_PROGRESS - Invalid operation: Volume
|
1632
|
+
# promotion is in progress.
|
1633
|
+
# * Hpe3parSdk::HTTPConflict
|
1634
|
+
# - INV_OPERATION_VV_PARENT_OF_PCOPY - Invalid operation: Volume is
|
1635
|
+
# the parent of physical copy.
|
1636
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1637
|
+
# - NO_SPACE - Insufficent space for requested operation.
|
1638
|
+
def grow_volume(name, amount)
|
1639
|
+
begin
|
1640
|
+
@volume.grow_volume(name, amount)
|
1641
|
+
rescue => ex
|
1642
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1643
|
+
raise ex
|
1644
|
+
end
|
1645
|
+
end
|
1646
|
+
|
1647
|
+
# Creates a physical copy of a VirtualVolume
|
1648
|
+
#
|
1649
|
+
# ==== Attributes
|
1650
|
+
#
|
1651
|
+
# * src_name - the source volume name
|
1652
|
+
# type src_name: String
|
1653
|
+
# * dest_name - the destination volume name
|
1654
|
+
# type dest_name: String
|
1655
|
+
# * dest_cpg - the destination CPG
|
1656
|
+
# type dest_cpg: String
|
1657
|
+
# * optional - Hash of optional parameters
|
1658
|
+
# type optional: Hash
|
1659
|
+
#
|
1660
|
+
# optional = {
|
1661
|
+
# 'online' => false, # should physical copy be
|
1662
|
+
# # performed online?
|
1663
|
+
# 'tpvv' => false, # use thin provisioned space
|
1664
|
+
# # for destination
|
1665
|
+
# # (online copy only)
|
1666
|
+
# 'snapCPG' => 'OpenStack_SnapCPG', # snapshot CPG for the
|
1667
|
+
# # destination
|
1668
|
+
# # (online copy only)
|
1669
|
+
# 'saveSnapshot' => false, # save the snapshot of the
|
1670
|
+
# # source volume
|
1671
|
+
# 'priority' => 1 # taskPriorityEnum (does not
|
1672
|
+
# # apply to online copy - Hpe3parSdk::TaskPriority)
|
1673
|
+
# }
|
1674
|
+
def create_physical_copy(src_name, dest_name, dest_cpg, optional = nil)
|
1675
|
+
if @current_version < @min_version_with_compression && !optional.nil?
|
1676
|
+
[:compression, :allowRemoteCopyParent, :skipZero].each { |key| optional.delete key }
|
1677
|
+
end
|
1678
|
+
begin
|
1679
|
+
@volume.create_physical_copy(src_name, dest_name, dest_cpg, optional)
|
1680
|
+
rescue => ex
|
1681
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1682
|
+
raise ex
|
1683
|
+
end
|
1684
|
+
end
|
1685
|
+
|
1686
|
+
# Deletes a physical copy
|
1687
|
+
#
|
1688
|
+
# ==== Attributes
|
1689
|
+
#
|
1690
|
+
# * name - the name of the clone volume
|
1691
|
+
# type name: String
|
1692
|
+
#
|
1693
|
+
# ==== Raises:
|
1694
|
+
# * Hpe3parSdk::HTTPNotFound
|
1695
|
+
# - NON_EXISTENT_VOL - The volume does not exist
|
1696
|
+
# * Hpe3parSdk::HTTPForbidden
|
1697
|
+
# - PERM_DENIED - Permission denied
|
1698
|
+
# * Hpe3parSdk::HTTPForbidden
|
1699
|
+
# - RETAINED - Volume retention time has not expired
|
1700
|
+
# * Hpe3parSdk::HTTPForbidden
|
1701
|
+
# - HAS_RO_CHILD - Volume has read-only child
|
1702
|
+
# * Hpe3parSdk::HTTPConflict
|
1703
|
+
# - HAS_CHILD - The volume has a child volume
|
1704
|
+
# * Hpe3parSdk::HTTPConflict
|
1705
|
+
# - IN_USE - The volume is in use by VV set, VLUN, etc
|
1706
|
+
def delete_physical_copy(name)
|
1707
|
+
begin
|
1708
|
+
@volume.delete_volume(name)
|
1709
|
+
rescue => ex
|
1710
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1711
|
+
raise ex
|
1712
|
+
end
|
1713
|
+
end
|
1714
|
+
|
1715
|
+
# Tunes a volume
|
1716
|
+
#
|
1717
|
+
# ==== Attributes
|
1718
|
+
#
|
1719
|
+
# * name - the volume name
|
1720
|
+
# type name: String
|
1721
|
+
# * tune_operation - Enum of tune operation - 1: Change User CPG, 2: Change snap CPG
|
1722
|
+
# type dest_name: Integer
|
1723
|
+
# * optional - hash of optional parameters
|
1724
|
+
# type optional: hash
|
1725
|
+
#
|
1726
|
+
# optional = {
|
1727
|
+
# 'userCPG' => 'user_cpg', # Specifies the new user
|
1728
|
+
# # CPG to which the volume
|
1729
|
+
# # will be tuned.
|
1730
|
+
# 'snapCPG' => 'snap_cpg', # Specifies the snap CPG to
|
1731
|
+
# # which the volume will be
|
1732
|
+
# # tuned.
|
1733
|
+
# 'conversionOperation' => 1, # conversion operation enum. Refer Hpe3parSdk::VolumeConversionOperation
|
1734
|
+
# 'keepVV' => 'new_volume', # Name of the new volume
|
1735
|
+
# # where the original logical disks are saved.
|
1736
|
+
# 'compression' => true # Enables (true) or disables (false) compression.
|
1737
|
+
# # You cannot compress a fully provisioned volume.
|
1738
|
+
# }
|
1739
|
+
def tune_volume(name, tune_operation, optional = nil)
|
1740
|
+
if @current_version < @min_version_with_compression && !optional.nil?
|
1741
|
+
optional.delete_if { |key, _value| key == :compression }
|
1742
|
+
end
|
1743
|
+
begin
|
1744
|
+
object_hash = @volume.tune_volume(name, tune_operation, optional)
|
1745
|
+
get_task(object_hash['taskid'])
|
1746
|
+
rescue => ex
|
1747
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1748
|
+
raise ex
|
1749
|
+
end
|
1750
|
+
end
|
1751
|
+
|
1752
|
+
# Returns an array of every VolumeSet the given volume is a part of.
|
1753
|
+
# The array can contain zero, one, or multiple items.
|
1754
|
+
#
|
1755
|
+
# ==== Attributes
|
1756
|
+
#
|
1757
|
+
# * name - the volume name
|
1758
|
+
# type name: String
|
1759
|
+
#
|
1760
|
+
# ==== Returns
|
1761
|
+
#
|
1762
|
+
# Array of VolumeSet
|
1763
|
+
#
|
1764
|
+
# ==== Raises
|
1765
|
+
#
|
1766
|
+
# * Hpe3parSdk::HTTPForbidden
|
1767
|
+
# - VV_IN_INCONSISTENT_STATE - Internal inconsistency error in vol
|
1768
|
+
# * Hpe3parSdk::HTTPForbidden
|
1769
|
+
# - VV_IS_BEING_REMOVED - The volume is being removed
|
1770
|
+
# * Hpe3parSdk::HTTPNotFound
|
1771
|
+
# - NON_EXISTENT_VOLUME - The volume does not exists
|
1772
|
+
# * Hpe3parSdk::HTTPForbidden
|
1773
|
+
# - INV_OPERATION_VV_SYS_VOLUME - Illegal op on system vol
|
1774
|
+
# * Hpe3parSdk::HTTPForbidden
|
1775
|
+
# - INV_OPERATION_VV_INTERNAL_VOLUME - Illegal op on internal vol
|
1776
|
+
def find_all_volume_sets(name)
|
1777
|
+
begin
|
1778
|
+
@volume_set.find_all_volume_sets(name)
|
1779
|
+
rescue => ex
|
1780
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1781
|
+
raise ex
|
1782
|
+
end
|
1783
|
+
end
|
1784
|
+
|
1785
|
+
# Gets the Volume Sets
|
1786
|
+
#
|
1787
|
+
# ==== Returns
|
1788
|
+
#
|
1789
|
+
# Array of VolumeSet
|
1790
|
+
def get_volume_sets
|
1791
|
+
begin
|
1792
|
+
@volume_set.get_volume_sets
|
1793
|
+
rescue => ex
|
1794
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1795
|
+
raise ex
|
1796
|
+
end
|
1797
|
+
end
|
1798
|
+
|
1799
|
+
# Gets the information about a Volume Set.
|
1800
|
+
#
|
1801
|
+
# ==== Attributes
|
1802
|
+
#
|
1803
|
+
# * name - The name of the CPG to find
|
1804
|
+
# type name: String
|
1805
|
+
#
|
1806
|
+
# ==== Returns
|
1807
|
+
#
|
1808
|
+
# VolumeSet
|
1809
|
+
#
|
1810
|
+
# ==== Raises
|
1811
|
+
#
|
1812
|
+
# * Hpe3parSdk::HPE3PARException
|
1813
|
+
# Error with code: 102 message: Set does not exist
|
1814
|
+
def get_volume_set(name)
|
1815
|
+
begin
|
1816
|
+
@volume_set.get_volume_set(name)
|
1817
|
+
rescue => ex
|
1818
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1819
|
+
raise ex
|
1820
|
+
end
|
1821
|
+
end
|
1822
|
+
|
1823
|
+
# Creates a new volume set
|
1824
|
+
#
|
1825
|
+
# ==== Attributes
|
1826
|
+
#
|
1827
|
+
# * name - the volume set to create
|
1828
|
+
# type name: String
|
1829
|
+
# * domain: the domain where the set lives
|
1830
|
+
# type domain: String
|
1831
|
+
# * comment: the comment for the vv set
|
1832
|
+
# type comment: String
|
1833
|
+
# * setmembers: the vv(s) to add to the set, the existence of the vv(s) will not be checked
|
1834
|
+
# type name: Array of String
|
1835
|
+
#
|
1836
|
+
# ==== Raises
|
1837
|
+
#
|
1838
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1839
|
+
# - INV_INPUT Invalid URI Syntax.
|
1840
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1841
|
+
# - NON_EXISTENT_DOMAIN - Domain doesn't exist.
|
1842
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1843
|
+
# - NO_SPACE - Not Enough space is available.
|
1844
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1845
|
+
# - BAD_CPG_PATTERN A Pattern in a CPG specifies illegal values.
|
1846
|
+
# * Hpe3parSdk::HTTPForbidden
|
1847
|
+
# - PERM_DENIED - Permission denied
|
1848
|
+
# * Hpe3parSdk::HTTPConflict
|
1849
|
+
# - EXISTENT_CPG - CPG Exists already
|
1850
|
+
def create_volume_set(name, domain = nil, comment = nil, setmembers = nil)
|
1851
|
+
begin
|
1852
|
+
@volume_set.create_volume_set(name, domain, comment, setmembers)
|
1853
|
+
rescue => ex
|
1854
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1855
|
+
raise ex
|
1856
|
+
end
|
1857
|
+
end
|
1858
|
+
|
1859
|
+
# Deletes the volume set. You must clear all QOS rules before a volume set can be deleted.
|
1860
|
+
#
|
1861
|
+
# ==== Attributes
|
1862
|
+
#
|
1863
|
+
# * name - The name of the VolumeSet
|
1864
|
+
# type name: String
|
1865
|
+
#
|
1866
|
+
# ==== Raises
|
1867
|
+
#
|
1868
|
+
# * Hpe3parSdk::HTTPNotFound
|
1869
|
+
# - NON_EXISTENT_SET - The set does not exists.
|
1870
|
+
# * Hpe3parSdk::HTTPConflict
|
1871
|
+
# - - EXPORTED_VLUN - The host set has exported VLUNs. The VV set was exported.
|
1872
|
+
# * Hpe3parSdk::HTTPConflict
|
1873
|
+
# - VVSET_QOS_TARGET - The object is already part of the set.
|
1874
|
+
def delete_volume_set(name)
|
1875
|
+
begin
|
1876
|
+
@volume_set.delete_volume_set(name)
|
1877
|
+
rescue => ex
|
1878
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1879
|
+
raise ex
|
1880
|
+
end
|
1881
|
+
end
|
1882
|
+
|
1883
|
+
# Modifies a volume set by adding or removing a volume from the volume
|
1884
|
+
# set. It's actions is based on the enums MEM_ADD or MEM_REMOVE.
|
1885
|
+
#
|
1886
|
+
# ==== Attributes
|
1887
|
+
#
|
1888
|
+
# * action: add or remove volume from the set
|
1889
|
+
# type name: Hpe3parSdk::SetCustomAction
|
1890
|
+
# * name: the volume set name
|
1891
|
+
# type name: String
|
1892
|
+
# * newName: new name of set
|
1893
|
+
# type newName: String
|
1894
|
+
# * comment: the comment for on the vv set
|
1895
|
+
# type comment: String
|
1896
|
+
# * flash_cache_policy: the flash-cache policy for the vv set
|
1897
|
+
# type flash_cache_policy: enum
|
1898
|
+
# * setmembers: the vv to add to the set, the existence of the vv will not be checked
|
1899
|
+
# type name: Array of String
|
1900
|
+
#
|
1901
|
+
# ==== Raises
|
1902
|
+
#
|
1903
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1904
|
+
# - EXISTENT_SET - The set already exits.
|
1905
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1906
|
+
# - EXISTENT_SET - The set already exits.
|
1907
|
+
# * Hpe3parSdk::HTTPNotFound
|
1908
|
+
# - NON_EXISTENT_SET - The set does not exists.
|
1909
|
+
# * Hpe3parSdk::HTTPConflict
|
1910
|
+
# - MEMBER_IN_DOMAINSET - The host is in a domain set.
|
1911
|
+
# * Hpe3parSdk::HTTPConflict
|
1912
|
+
# - MEMBER_IN_SET - The object is already part of the set.
|
1913
|
+
# * Hpe3parSdk::HTTPNotFound
|
1914
|
+
# - MEMBER_NOT_IN_SET - The object is not part of the set.
|
1915
|
+
# * Hpe3parSdk::HTTPConflict
|
1916
|
+
# - MEMBER_NOT_IN_SAME_DOMAIN - Objects must be in the same domain to
|
1917
|
+
# perform this operation.
|
1918
|
+
# * Hpe3parSdk::HTTPForbidden
|
1919
|
+
# - VV_IN_INCONSISTENT_STATE - The volume has an internal
|
1920
|
+
# inconsistency error.
|
1921
|
+
# * Hpe3parSdk::HTTPForbidden
|
1922
|
+
# - VV_IS_BEING_REMOVED - The volume is being removed.
|
1923
|
+
# * Hpe3parSdk::HTTPNotFound
|
1924
|
+
# - NON_EXISTENT_VOLUME - The volume does not exists.
|
1925
|
+
# * Hpe3parSdk::HTTPForbidden
|
1926
|
+
# - INV_OPERATION_VV_SYS_VOLUME - The operation is not allowed on a
|
1927
|
+
# system volume.
|
1928
|
+
# * Hpe3parSdk::HTTPForbidden
|
1929
|
+
# - INV_OPERATION_VV_INTERNAL_VOLUME - The operation is not allowed
|
1930
|
+
# on an internal volume.
|
1931
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1932
|
+
# - INV_INPUT_DUP_NAME - Invalid input (duplicate name).
|
1933
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1934
|
+
# - INV_INPUT_PARAM_CONFLICT - Invalid input (parameters cannot be
|
1935
|
+
# present at the same time).
|
1936
|
+
# * Hpe3parSdk::HTTPBadRequest
|
1937
|
+
# - INV_INPUT_ILLEGAL_CHAR - Invalid contains one or more illegal
|
1938
|
+
# characters.
|
1939
|
+
def modify_volume_set(name, action = nil, newName = nil, comment = nil, flash_cache_policy = nil, setmembers = nil)
|
1940
|
+
begin
|
1941
|
+
@volume_set.modify_volume_set(name, action, newName, comment, flash_cache_policy, setmembers)
|
1942
|
+
rescue => ex
|
1943
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1944
|
+
raise ex
|
1945
|
+
end
|
1946
|
+
end
|
1947
|
+
|
1948
|
+
|
1949
|
+
# Adds volume(s) to a volume set.
|
1950
|
+
#
|
1951
|
+
# ==== Attributes
|
1952
|
+
#
|
1953
|
+
# * set_name - the volume set name
|
1954
|
+
# type set_name: String
|
1955
|
+
# * setmembers - the volume(s) name to add
|
1956
|
+
# type setmembers: Array of String
|
1957
|
+
def add_volumes_to_volume_set(set_name, setmembers)
|
1958
|
+
begin
|
1959
|
+
@volume_set.add_volumes_to_volume_set(set_name, setmembers)
|
1960
|
+
rescue => ex
|
1961
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1962
|
+
raise ex
|
1963
|
+
end
|
1964
|
+
end
|
1965
|
+
|
1966
|
+
# Removes a volume from a volume set
|
1967
|
+
#
|
1968
|
+
# ==== Attributes
|
1969
|
+
#
|
1970
|
+
# * set_name - the volume set name
|
1971
|
+
# type set_name: String
|
1972
|
+
# * name - the volume name to remove
|
1973
|
+
# type name: String
|
1974
|
+
def remove_volumes_from_volume_set(set_name, setmembers)
|
1975
|
+
begin
|
1976
|
+
@volume_set.remove_volumes_from_volume_set(set_name, setmembers)
|
1977
|
+
rescue => ex
|
1978
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
1979
|
+
raise ex
|
1980
|
+
end
|
1981
|
+
end
|
1982
|
+
|
1983
|
+
# Creates a snapshot of an existing VolumeSet
|
1984
|
+
#
|
1985
|
+
# ==== Attributes
|
1986
|
+
#
|
1987
|
+
# * name: Name of the Snapshot. The vvname pattern is described in "VV Name Patterns" in the HPE 3PAR Command Line Interface Reference, which is available at the following website: http://www.hp.com/go/storage/docs
|
1988
|
+
# type name: String
|
1989
|
+
# * copy_of_name: the name of the parent volume
|
1990
|
+
# type copy_of_name: String
|
1991
|
+
# * comment: the comment on the vv set
|
1992
|
+
# type comment: String
|
1993
|
+
# * optional: Hash of optional params
|
1994
|
+
# type optional: Hash
|
1995
|
+
# optional = {
|
1996
|
+
# 'id' => 12, # Specifies ID of the volume set
|
1997
|
+
# # set, next by default
|
1998
|
+
# 'comment' => "some comment",
|
1999
|
+
# 'readOnly' => true, # Read Only
|
2000
|
+
# 'expirationHours' => 36, # time from now to expire
|
2001
|
+
# 'retentionHours' => 12 # time from now to expire
|
2002
|
+
# }
|
2003
|
+
#
|
2004
|
+
# ==== Raises
|
2005
|
+
#
|
2006
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2007
|
+
# - INVALID_INPUT_VV_PATTERN - Invalid volume pattern specified
|
2008
|
+
# * Hpe3parSdk::HTTPNotFound
|
2009
|
+
# - NON_EXISTENT_SET - The set does not exists.
|
2010
|
+
# * Hpe3parSdk::HTTPNotFound
|
2011
|
+
# - EMPTY_SET - The set is empty
|
2012
|
+
# * Hpe3parSdk::HTTPServiceUnavailable
|
2013
|
+
# - VV_LIMIT_REACHED - Maximum number of volumes reached
|
2014
|
+
# * Hpe3parSdk::HTTPNotFound
|
2015
|
+
# - NON_EXISTENT_VOL - The storage volume does not exist
|
2016
|
+
# * Hpe3parSdk::HTTPForbidden
|
2017
|
+
# - VV_IS_BEING_REMOVED - The volume is being removed
|
2018
|
+
# * Hpe3parSdk::HTTPForbidden
|
2019
|
+
# - INV_OPERATION_VV_READONLY_TO_READONLY_SNAP - Creating a read-only copy from a read-only volume is not permitted
|
2020
|
+
# * Hpe3parSdk::HTTPConflict
|
2021
|
+
# - NO_SNAP_CPG - No snapshot CPG has been configured for the volume
|
2022
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2023
|
+
# - INV_INPUT_DUP_NAME - Invalid input (duplicate name).
|
2024
|
+
# * Hpe3parSdk::HTTPForbidden
|
2025
|
+
# - INV_OPERATION_VV_SNAP_PARENT_SAME_BASE - Two parent snapshots share the same base volume
|
2026
|
+
# * Hpe3parSdk::HTTPConflict
|
2027
|
+
# - INV_OPERATION_VV_ONLINE_COPY_IN_PROGRESS - Invalid operation. Online copyis in progress
|
2028
|
+
# * Hpe3parSdk::HTTPServiceUnavailable
|
2029
|
+
# - VV_ID_LIMIT_REACHED - Max number of volumeIDs has been reached
|
2030
|
+
# * Hpe3parSdk::HTTPNotFound
|
2031
|
+
# - NON_EXISTENT_VOLUME - The volume does not exists
|
2032
|
+
# * Hpe3parSdk::HTTPForbidden
|
2033
|
+
# - VV_IN_STALE_STATE - The volume is in a stale state.
|
2034
|
+
# * Hpe3parSdk::HTTPForbidden
|
2035
|
+
# - VV_NOT_STARTED - Volume is not started
|
2036
|
+
# * Hpe3parSdk::HTTPForbidden
|
2037
|
+
# - VV_UNAVAILABLE - The volume is not accessible
|
2038
|
+
# * Hpe3parSdk::HTTPServiceUnavailable
|
2039
|
+
# - SNAPSHOT_LIMIT_REACHED - Max number of snapshots has been reached
|
2040
|
+
# * Hpe3parSdk::HTTPServiceUnavailable
|
2041
|
+
# - CPG_ALLOCATION_WARNING_REACHED - The CPG has reached the allocation warning
|
2042
|
+
# * Hpe3parSdk::HTTPConflict
|
2043
|
+
# - INV_OPERATION_VV_VOLUME_CONV_IN_PROGRESS - Invalid operation: VV conversion is in progress.
|
2044
|
+
# * Hpe3parSdk::HTTPForbidden
|
2045
|
+
# - INV_OPERATION_VV_CLEANUP_IN_PROGRESS - Internal volume cleanup is in progress.
|
2046
|
+
# * Hpe3parSdk::HTTPForbidden
|
2047
|
+
# - INV_OPERATION_VV_PEER_VOLUME - Cannot modify a peer volume.
|
2048
|
+
# * Hpe3parSdk::HTTPConflict
|
2049
|
+
# - INV_OPERATION_VV_VOLUME_CONV_IN_PROGRESS - INV_OPERATION_VV_ONLINE_COPY_IN_PROGRESS - The volume is the target of an online copy.
|
2050
|
+
# * Hpe3parSdk::HTTPForbidden
|
2051
|
+
# - INV_OPERATION_VV_INTERNAL_VOLUME - Illegal op on internal vol
|
2052
|
+
# * Hpe3parSdk::HTTPConflict
|
2053
|
+
# - EXISTENT_ID - An ID exists
|
2054
|
+
# * Hpe3parSdk::HTTPForbidden
|
2055
|
+
# - INV_OPERATION_VV_NOT_IN_NORMAL_STATE - Volume state is not normal
|
2056
|
+
# * Hpe3parSdk::HTTPForbidden
|
2057
|
+
# - VV_IN_INCONSISTENT_STATE - Internal inconsistency error in vol
|
2058
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2059
|
+
# - INVALID_INPUT_VV_PATTERN - - INV_INPUT_RETAIN_GT_EXPIRE - Retention time is greater than expiration time.
|
2060
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2061
|
+
# - INV_INPUT_TIME - Invalid time specified.
|
2062
|
+
# * Hpe3parSdk::HTTPForbidden
|
2063
|
+
# - INV_OPERATION_SNAPSHOT_NOT_SAME_TYPE - Some snapshots in the volume set are read-only, some are read-write
|
2064
|
+
def create_snapshot_of_volume_set(name, copy_of_name, optional = nil)
|
2065
|
+
begin
|
2066
|
+
@volume_set.create_snapshot_of_volume_set(name, copy_of_name, optional)
|
2067
|
+
rescue => ex
|
2068
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2069
|
+
raise ex
|
2070
|
+
end
|
2071
|
+
end
|
2072
|
+
|
2073
|
+
# Creates a snapshot of an existing Volume.
|
2074
|
+
#
|
2075
|
+
# ==== Attributes
|
2076
|
+
#
|
2077
|
+
# * name - the name of the Snapshot
|
2078
|
+
# type name: String
|
2079
|
+
# * copy_of_name - the name of the parent volume
|
2080
|
+
# type copy_of_name: String
|
2081
|
+
# * optional - Hash of other optional items
|
2082
|
+
# type optional: Hash
|
2083
|
+
#
|
2084
|
+
# optional = {
|
2085
|
+
# 'id' => 12, # Specifies the ID of the volume,
|
2086
|
+
# # next by default
|
2087
|
+
# 'comment' => "some comment",
|
2088
|
+
# 'readOnly' => true, # Read Only
|
2089
|
+
# 'expirationHours' => 36, # time from now to expire
|
2090
|
+
# 'retentionHours' => 12 # time from now to expire
|
2091
|
+
# }
|
2092
|
+
#
|
2093
|
+
# ==== Raises
|
2094
|
+
#
|
2095
|
+
# * Hpe3parSdk::HTTPNotFound
|
2096
|
+
# - INON_EXISTENT_VOL - The volume does not exist
|
2097
|
+
# * Hpe3parSdk::HTTPForbidden
|
2098
|
+
# - PERM_DENIED - Permission denied
|
2099
|
+
def create_snapshot(name, copy_of_name, optional = nil)
|
2100
|
+
if @current_version < @min_version_with_compression && !optional.nil?
|
2101
|
+
optional.delete_if { |key, _value| key == :allowRemoteCopyParent }
|
2102
|
+
end
|
2103
|
+
begin
|
2104
|
+
@volume.create_snapshot(name, copy_of_name, optional)
|
2105
|
+
rescue => ex
|
2106
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2107
|
+
raise ex
|
2108
|
+
end
|
2109
|
+
end
|
2110
|
+
|
2111
|
+
# Restores from a snapshot to a volume
|
2112
|
+
#
|
2113
|
+
# ==== Attributes
|
2114
|
+
#
|
2115
|
+
# * name - the name of the Snapshot
|
2116
|
+
# type name: String
|
2117
|
+
# * optional - hash of other optional items
|
2118
|
+
# type name: Hash
|
2119
|
+
#
|
2120
|
+
# optional = {
|
2121
|
+
# 'online' => false, # Enables (true) or disables
|
2122
|
+
# #(false) executing the promote
|
2123
|
+
# #operation on an online volume.
|
2124
|
+
# #The default setting is false
|
2125
|
+
#
|
2126
|
+
# 'priority' => 2 #Does not apply to online promote
|
2127
|
+
# #operation or to stop promote
|
2128
|
+
# #operation.
|
2129
|
+
#
|
2130
|
+
# 'allowRemoteCopyParent' => false #Allows the promote operation to
|
2131
|
+
# #proceed even if the RW parent
|
2132
|
+
# #volume is currently in a Remote
|
2133
|
+
# #Copy volume group, if that group
|
2134
|
+
# #has not been started. If the
|
2135
|
+
# #Remote Copy group has been
|
2136
|
+
# #started, this command fails.
|
2137
|
+
# #(WSAPI 1.6 and later.)
|
2138
|
+
# }
|
2139
|
+
#
|
2140
|
+
def restore_snapshot(name, optional = nil)
|
2141
|
+
if @current_version < @min_version_with_compression && !optional.nil?
|
2142
|
+
optional.delete_if { |key, _value| key == :allowRemoteCopyParent }
|
2143
|
+
end
|
2144
|
+
begin
|
2145
|
+
@volume.restore_snapshot(name, optional)
|
2146
|
+
rescue => ex
|
2147
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2148
|
+
raise ex
|
2149
|
+
end
|
2150
|
+
end
|
2151
|
+
|
2152
|
+
# Deletes a snapshot
|
2153
|
+
#
|
2154
|
+
# ==== Attributes
|
2155
|
+
#
|
2156
|
+
# * name - the name of the snapshot volume
|
2157
|
+
# type name: String
|
2158
|
+
#
|
2159
|
+
# ==== Raises:
|
2160
|
+
#
|
2161
|
+
# * Hpe3parSdk::HTTPNotFound
|
2162
|
+
# - NON_EXISTENT_VOL - The volume does not exist
|
2163
|
+
# * Hpe3parSdk::HTTPForbidden
|
2164
|
+
# - PERM_DENIED - Permission denied
|
2165
|
+
# * Hpe3parSdk::HTTPForbidden
|
2166
|
+
# - RETAINED - Volume retention time has not expired
|
2167
|
+
# * Hpe3parSdk::HTTPForbidden
|
2168
|
+
# - HAS_RO_CHILD - Volume has read-only child
|
2169
|
+
# * Hpe3parSdk::HTTPConflict
|
2170
|
+
# - HAS_CHILD - The volume has a child volume
|
2171
|
+
# * Hpe3parSdk::HTTPConflict
|
2172
|
+
# - IN_USE - The volume is in use by VV set, VLUN, etc
|
2173
|
+
def delete_snapshot(name)
|
2174
|
+
begin
|
2175
|
+
@volume.delete_volume(name)
|
2176
|
+
rescue => ex
|
2177
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2178
|
+
raise ex
|
2179
|
+
end
|
2180
|
+
end
|
2181
|
+
|
2182
|
+
# Gets the snapshots of a particular volume
|
2183
|
+
#
|
2184
|
+
# ==== Attributes
|
2185
|
+
#
|
2186
|
+
# * name - the name of the volume
|
2187
|
+
# type name: String
|
2188
|
+
#
|
2189
|
+
# ==== Returns
|
2190
|
+
#
|
2191
|
+
# Array of VirtualVolume
|
2192
|
+
def get_volume_snapshots(name)
|
2193
|
+
begin
|
2194
|
+
@volume.get_volume_snapshots(name)
|
2195
|
+
rescue => ex
|
2196
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2197
|
+
raise ex
|
2198
|
+
end
|
2199
|
+
end
|
2200
|
+
|
2201
|
+
# Gets an array of all ports on the 3PAR.
|
2202
|
+
#
|
2203
|
+
# ==== Returns
|
2204
|
+
#
|
2205
|
+
# Array of Port.
|
2206
|
+
def get_ports
|
2207
|
+
begin
|
2208
|
+
@port.get_ports
|
2209
|
+
rescue => ex
|
2210
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2211
|
+
raise ex
|
2212
|
+
end
|
2213
|
+
end
|
2214
|
+
|
2215
|
+
# Gets an array of Fibre Channel Ports.
|
2216
|
+
#
|
2217
|
+
# * state - Port link state.
|
2218
|
+
# type name: Integer. Refer Hpe3parSdk::PortLinkState for complete enumeration.
|
2219
|
+
#
|
2220
|
+
# ==== Returns
|
2221
|
+
#
|
2222
|
+
# Array of Fibre Channel Port.
|
2223
|
+
def get_fc_ports(state = nil)
|
2224
|
+
begin
|
2225
|
+
@port.get_fc_ports(state)
|
2226
|
+
rescue => ex
|
2227
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2228
|
+
raise ex
|
2229
|
+
end
|
2230
|
+
end
|
2231
|
+
|
2232
|
+
# Gets an array of iSCSI Ports.
|
2233
|
+
#
|
2234
|
+
# * state - Port link state.
|
2235
|
+
# type name: Integer. Refer Hpe3parSdk::PortLinkState for complete enumeration.
|
2236
|
+
#
|
2237
|
+
# ==== Returns
|
2238
|
+
#
|
2239
|
+
# Array of iSCSI Port.
|
2240
|
+
def get_iscsi_ports(state = nil)
|
2241
|
+
begin
|
2242
|
+
@port.get_iscsi_ports(state)
|
2243
|
+
rescue => ex
|
2244
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2245
|
+
raise ex
|
2246
|
+
end
|
2247
|
+
end
|
2248
|
+
|
2249
|
+
# Gets an array of IP Ports.
|
2250
|
+
#
|
2251
|
+
# ==== Attributes
|
2252
|
+
#
|
2253
|
+
# * state - Port link state.
|
2254
|
+
# type name: Integer. Refer Hpe3parSdk::PortLinkState for complete enumeration.
|
2255
|
+
#
|
2256
|
+
# ==== Returns
|
2257
|
+
#
|
2258
|
+
# Array of IP Port.
|
2259
|
+
def get_ip_ports(state = nil)
|
2260
|
+
begin
|
2261
|
+
@port.get_ip_ports(state)
|
2262
|
+
rescue => ex
|
2263
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2264
|
+
raise ex
|
2265
|
+
end
|
2266
|
+
end
|
2267
|
+
|
2268
|
+
# Gets entire list of CPGs.
|
2269
|
+
#
|
2270
|
+
# ==== Returns
|
2271
|
+
#
|
2272
|
+
# CPG array
|
2273
|
+
def get_cpgs
|
2274
|
+
begin
|
2275
|
+
@cpg.get_cpgs
|
2276
|
+
rescue => ex
|
2277
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2278
|
+
raise ex
|
2279
|
+
end
|
2280
|
+
end
|
2281
|
+
|
2282
|
+
# Gets information about a Cpg.
|
2283
|
+
#
|
2284
|
+
# ==== Attributes
|
2285
|
+
#
|
2286
|
+
# * name - The name of the cpg to find
|
2287
|
+
# type name: String
|
2288
|
+
#
|
2289
|
+
# ==== Returns
|
2290
|
+
#
|
2291
|
+
# CPG
|
2292
|
+
#
|
2293
|
+
# ==== Raises
|
2294
|
+
#
|
2295
|
+
# * Hpe3parSdk::HPE3PARException
|
2296
|
+
# Error with code: 15 message: cpg does not exist
|
2297
|
+
def get_cpg(name)
|
2298
|
+
begin
|
2299
|
+
@cpg.get_cpg(name)
|
2300
|
+
rescue => ex
|
2301
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2302
|
+
raise ex
|
2303
|
+
end
|
2304
|
+
end
|
2305
|
+
|
2306
|
+
|
2307
|
+
# Creates a new CPG.
|
2308
|
+
#
|
2309
|
+
# ==== Attributes
|
2310
|
+
#
|
2311
|
+
# * name - Name of the cpg
|
2312
|
+
# type name: String
|
2313
|
+
# * optional - Hash of other optional items
|
2314
|
+
# type optional: Hash
|
2315
|
+
#
|
2316
|
+
# optional = {
|
2317
|
+
# 'growthIncrementMiB' 100, # Growth increment in MiB for
|
2318
|
+
# # each auto-grown operation
|
2319
|
+
# 'growthLimitMiB': 1024, # Auto-grow operation is limited
|
2320
|
+
# # to specified storage amount
|
2321
|
+
# 'usedLDWarningAlertMiB': 200, # Threshold to trigger warning
|
2322
|
+
# # of used logical disk space
|
2323
|
+
# 'domain': 'MyDomain', # Name of the domain object
|
2324
|
+
# 'LDLayout': {
|
2325
|
+
# 'RAIDType': 1, # Disk Raid Type
|
2326
|
+
# 'setSize': 100, # Size in number of chunklets
|
2327
|
+
# 'HA': 0, # Layout supports failure of
|
2328
|
+
# # one port pair (1),
|
2329
|
+
# # one cage (2),
|
2330
|
+
# # or one magazine (3)
|
2331
|
+
# 'chunkletPosPref': 2, # Chunklet location perference
|
2332
|
+
# # characteristics.
|
2333
|
+
# # Lowest Number/Fastest transfer
|
2334
|
+
# # = 1
|
2335
|
+
# # Higher Number/Slower transfer
|
2336
|
+
# # = 2
|
2337
|
+
# 'diskPatterns': []} # Patterns for candidate disks
|
2338
|
+
# }
|
2339
|
+
#
|
2340
|
+
# ==== Raises
|
2341
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2342
|
+
# - INV_INPUT Invalid URI Syntax.
|
2343
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2344
|
+
# - NON_EXISTENT_DOMAIN - Domain doesn't exist.
|
2345
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2346
|
+
# - NO_SPACE - Not Enough space is available.
|
2347
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2348
|
+
# - BAD_CPG_PATTERN A Pattern in a CPG specifies illegal values.
|
2349
|
+
# * Hpe3parSdk::HTTPForbidden
|
2350
|
+
# - PERM_DENIED - Permission denied
|
2351
|
+
# * Hpe3parSdk::HTTPConflict
|
2352
|
+
# - EXISTENT_CPG - Cpg Exists already
|
2353
|
+
def create_cpg(name, optional = nil)
|
2354
|
+
begin
|
2355
|
+
@cpg.create_cpg(name, optional)
|
2356
|
+
rescue => ex
|
2357
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2358
|
+
raise ex
|
2359
|
+
end
|
2360
|
+
end
|
2361
|
+
|
2362
|
+
# Modifies a CPG.
|
2363
|
+
#
|
2364
|
+
# ==== Attributes
|
2365
|
+
#
|
2366
|
+
# * name - Name of the CPG
|
2367
|
+
# type name: String
|
2368
|
+
# * optional - hash of other optional items
|
2369
|
+
# type optional: Hash
|
2370
|
+
#
|
2371
|
+
# optional = {
|
2372
|
+
# 'newName'=> "newCPG:, # Specifies the name of the
|
2373
|
+
# # CPG to update.
|
2374
|
+
# 'disableAutoGrow'=>false, # Enables (false) or
|
2375
|
+
# # disables (true) CPG auto
|
2376
|
+
# # grow. Defaults to false.
|
2377
|
+
# 'rmGrowthLimit'=> false, # Enables (false) or
|
2378
|
+
# # disables (true) auto grow
|
2379
|
+
# # limit enforcement. Defaults
|
2380
|
+
# # to false.
|
2381
|
+
# 'rmWarningAlert'=> false, # Enables (false) or
|
2382
|
+
# # disables (true) warning
|
2383
|
+
# # limit enforcement. Defaults
|
2384
|
+
# # to false.
|
2385
|
+
# }
|
2386
|
+
#
|
2387
|
+
def modify_cpg(name, cpg_mods)
|
2388
|
+
begin
|
2389
|
+
@cpg.modify_cpg(name, cpg_mods)
|
2390
|
+
rescue => ex
|
2391
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2392
|
+
raise ex
|
2393
|
+
end
|
2394
|
+
end
|
2395
|
+
|
2396
|
+
# Gets available space information about a cpg.
|
2397
|
+
#
|
2398
|
+
# ==== Attributes
|
2399
|
+
#
|
2400
|
+
# * name - The name of the cpg to find
|
2401
|
+
# type name: String
|
2402
|
+
#
|
2403
|
+
# ==== Returns
|
2404
|
+
#
|
2405
|
+
# Available space details in form of LDLayoutCapacity object
|
2406
|
+
#
|
2407
|
+
# ==== Raises
|
2408
|
+
#
|
2409
|
+
# * Hpe3parSdk::HPE3PARException
|
2410
|
+
# Error with code: 15 message: cpg does not exist
|
2411
|
+
def get_cpg_available_space(name)
|
2412
|
+
begin
|
2413
|
+
@cpg.get_cpg_available_space(name)
|
2414
|
+
rescue => ex
|
2415
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2416
|
+
raise ex
|
2417
|
+
end
|
2418
|
+
end
|
2419
|
+
|
2420
|
+
# Deletes a CPG.
|
2421
|
+
#
|
2422
|
+
# ==== Attributes
|
2423
|
+
#
|
2424
|
+
# * name - The name of the CPG
|
2425
|
+
# type name: String
|
2426
|
+
#
|
2427
|
+
# ==== Raises
|
2428
|
+
#
|
2429
|
+
# * Hpe3parSdk::HPE3PARException
|
2430
|
+
# Error with code: 15 message: CPG does not exist
|
2431
|
+
# * Hpe3parSdk::HTTPForbidden
|
2432
|
+
# - IN_USE - The CPG Cannot be removed because it's in use.
|
2433
|
+
# * Hpe3parSdk::HTTPForbidden
|
2434
|
+
# - PERM_DENIED - Permission denied
|
2435
|
+
def delete_cpg(name)
|
2436
|
+
begin
|
2437
|
+
@cpg.delete_cpg(name)
|
2438
|
+
rescue => ex
|
2439
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2440
|
+
raise ex
|
2441
|
+
end
|
2442
|
+
end
|
2443
|
+
|
2444
|
+
# Gets the status of an online physical copy
|
2445
|
+
#
|
2446
|
+
# ==== Attributes
|
2447
|
+
#
|
2448
|
+
# * name - The name of the volume
|
2449
|
+
# type name: str
|
2450
|
+
#
|
2451
|
+
# ==== Returns
|
2452
|
+
#
|
2453
|
+
# Status of online copy (String)
|
2454
|
+
#
|
2455
|
+
# ==== Raises
|
2456
|
+
#
|
2457
|
+
# * Hpe3parSdk::HPE3PARException
|
2458
|
+
# Error: message: Volume not an online physical copy
|
2459
|
+
def get_online_physical_copy_status(name)
|
2460
|
+
begin
|
2461
|
+
@volume.get_online_physical_copy_status(name)
|
2462
|
+
rescue => ex
|
2463
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2464
|
+
raise ex
|
2465
|
+
end
|
2466
|
+
end
|
2467
|
+
|
2468
|
+
# Stops an offline physical copy operation
|
2469
|
+
#
|
2470
|
+
# ==== Attributes
|
2471
|
+
#
|
2472
|
+
# * name - The name of the volume
|
2473
|
+
# type name: String
|
2474
|
+
def stop_offline_physical_copy(name)
|
2475
|
+
begin
|
2476
|
+
@volume.stop_offline_physical_copy(name)
|
2477
|
+
rescue => ex
|
2478
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2479
|
+
raise ex
|
2480
|
+
end
|
2481
|
+
end
|
2482
|
+
|
2483
|
+
# Stops an online physical copy operation
|
2484
|
+
#
|
2485
|
+
# ==== Attributes
|
2486
|
+
#
|
2487
|
+
# * name - The name of the volume
|
2488
|
+
# type name: String
|
2489
|
+
def stop_online_physical_copy(name)
|
2490
|
+
begin
|
2491
|
+
@volume.stop_online_physical_copy(name)
|
2492
|
+
rescue => ex
|
2493
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2494
|
+
raise ex
|
2495
|
+
end
|
2496
|
+
end
|
2497
|
+
|
2498
|
+
# Resynchronizes a physical copy.
|
2499
|
+
#
|
2500
|
+
# ==== Attributes
|
2501
|
+
#
|
2502
|
+
# * name - The name of the volume
|
2503
|
+
# type name: String
|
2504
|
+
def resync_physical_copy(name)
|
2505
|
+
begin
|
2506
|
+
@volume.resync_physical_copy(name)
|
2507
|
+
rescue => ex
|
2508
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2509
|
+
raise ex
|
2510
|
+
end
|
2511
|
+
end
|
2512
|
+
|
2513
|
+
# Waits for a 3PAR task to end.
|
2514
|
+
#
|
2515
|
+
# ==== Attributes
|
2516
|
+
#
|
2517
|
+
# * task_id - The Id of the task to be waited upon.
|
2518
|
+
# type task_id: Integer
|
2519
|
+
# * poll_rate_secs - The polling interval in seconds.
|
2520
|
+
# type poll_rate_secs: Integer
|
2521
|
+
def wait_for_task_to_end(task_id, poll_rate_secs = 15)
|
2522
|
+
begin
|
2523
|
+
@task.wait_for_task_to_end(task_id, poll_rate_secs)
|
2524
|
+
rescue => ex
|
2525
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2526
|
+
raise ex
|
2527
|
+
end
|
2528
|
+
end
|
2529
|
+
|
2530
|
+
# Cancel a 3PAR task
|
2531
|
+
#
|
2532
|
+
# ==== Attributes
|
2533
|
+
#
|
2534
|
+
# * task_id - The Id of the task to be cancelled.
|
2535
|
+
# type task_id: Integer
|
2536
|
+
# ==== Raises
|
2537
|
+
#
|
2538
|
+
# * Hpe3parSdk::HTTPBadRequest
|
2539
|
+
# - NON_ACTIVE_TASK - The task is not active at this time.
|
2540
|
+
# * Hpe3parSdk::HTTPConflict
|
2541
|
+
# - INV_OPERATION_CANNOT_CANCEL_ TASK - Invalid operation: Task cannot be cancelled.
|
2542
|
+
def cancel_task(task_id)
|
2543
|
+
begin
|
2544
|
+
@task.cancel_task(task_id)
|
2545
|
+
rescue => ex
|
2546
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2547
|
+
raise ex
|
2548
|
+
end
|
2549
|
+
end
|
2550
|
+
|
2551
|
+
def flash_cache_exists?
|
2552
|
+
begin
|
2553
|
+
@flash_cache.flash_cache_exists?
|
2554
|
+
rescue => ex
|
2555
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2556
|
+
raise ex
|
2557
|
+
end
|
2558
|
+
end
|
2559
|
+
|
2560
|
+
def volume_exists?(name)
|
2561
|
+
begin
|
2562
|
+
@volume.volume_exists?(name)
|
2563
|
+
rescue => ex
|
2564
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2565
|
+
raise ex
|
2566
|
+
end
|
2567
|
+
end
|
2568
|
+
|
2569
|
+
def volume_set_exists?(name)
|
2570
|
+
begin
|
2571
|
+
@volume_set.volume_set_exists?(name)
|
2572
|
+
rescue => ex
|
2573
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2574
|
+
raise ex
|
2575
|
+
end
|
2576
|
+
end
|
2577
|
+
|
2578
|
+
def host_exists?(host_name)
|
2579
|
+
begin
|
2580
|
+
@host.host_exists?(host_name)
|
2581
|
+
rescue => ex
|
2582
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2583
|
+
raise ex
|
2584
|
+
end
|
2585
|
+
end
|
2586
|
+
|
2587
|
+
def host_set_exists?(host_name)
|
2588
|
+
begin
|
2589
|
+
@host_set.host_set_exists?(host_name)
|
2590
|
+
rescue => ex
|
2591
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2592
|
+
raise ex
|
2593
|
+
end
|
2594
|
+
end
|
2595
|
+
|
2596
|
+
def cpg_exists?(name)
|
2597
|
+
begin
|
2598
|
+
@cpg.cpg_exists?(name)
|
2599
|
+
rescue => ex
|
2600
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2601
|
+
raise ex
|
2602
|
+
end
|
2603
|
+
end
|
2604
|
+
|
2605
|
+
def flash_cache_exists?
|
2606
|
+
begin
|
2607
|
+
@flash_cache.flash_cache_exists?
|
2608
|
+
rescue => ex
|
2609
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2610
|
+
raise ex
|
2611
|
+
end
|
2612
|
+
end
|
2613
|
+
|
2614
|
+
def online_physical_copy_exists?(src_name, phy_copy_name)
|
2615
|
+
begin
|
2616
|
+
@volume.online_physical_copy_exists?(src_name, phy_copy_name)
|
2617
|
+
rescue => ex
|
2618
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2619
|
+
raise ex
|
2620
|
+
end
|
2621
|
+
end
|
2622
|
+
|
2623
|
+
def offline_physical_copy_exists?(src_name, phy_copy_name)
|
2624
|
+
begin
|
2625
|
+
@volume.offline_physical_copy_exists?(src_name, phy_copy_name)
|
2626
|
+
rescue => ex
|
2627
|
+
Util.log_exception(ex, caller_locations(1, 1)[0].label)
|
2628
|
+
raise ex
|
2629
|
+
end
|
2630
|
+
end
|
2631
|
+
|
2632
|
+
# Logout from the 3PAR Array
|
2633
|
+
def logout
|
2634
|
+
unless @log_file_path.nil?
|
2635
|
+
if Hpe3parSdk.logger != nil
|
2636
|
+
Hpe3parSdk.logger.close
|
2637
|
+
Hpe3parSdk.logger = nil
|
2638
|
+
end
|
2639
|
+
end
|
2640
|
+
begin
|
2641
|
+
@http.unauthenticate
|
2642
|
+
rescue Hpe3parSdk::HPE3PARException => ex
|
2643
|
+
#Do nothing
|
2644
|
+
end
|
2645
|
+
end
|
2646
|
+
end
|
2647
|
+
end
|