opsmgr-cgfrost 0.35.9

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LEGAL.txt +13 -0
  3. data/README.md +123 -0
  4. data/lib/opsmgr.rb +12 -0
  5. data/lib/opsmgr/api/client.rb +116 -0
  6. data/lib/opsmgr/api/http_client.rb +399 -0
  7. data/lib/opsmgr/api/results.rb +280 -0
  8. data/lib/opsmgr/api/version20/endpoints.rb +121 -0
  9. data/lib/opsmgr/bosh_command_runner.rb +84 -0
  10. data/lib/opsmgr/cmd/bosh_command.rb +189 -0
  11. data/lib/opsmgr/cmd/ops_manager.rb +142 -0
  12. data/lib/opsmgr/environments.rb +106 -0
  13. data/lib/opsmgr/errand_runner.rb +62 -0
  14. data/lib/opsmgr/log.rb +70 -0
  15. data/lib/opsmgr/product_upload_wrapper.rb +71 -0
  16. data/lib/opsmgr/renderer.rb +23 -0
  17. data/lib/opsmgr/renderer/aws.rb +148 -0
  18. data/lib/opsmgr/renderer/noop.rb +21 -0
  19. data/lib/opsmgr/settings/microbosh/installation_settings.rb +84 -0
  20. data/lib/opsmgr/settings/microbosh/job.rb +56 -0
  21. data/lib/opsmgr/settings/microbosh/job_list.rb +27 -0
  22. data/lib/opsmgr/settings/microbosh/network.rb +21 -0
  23. data/lib/opsmgr/settings/microbosh/product.rb +90 -0
  24. data/lib/opsmgr/settings/microbosh/product_list.rb +27 -0
  25. data/lib/opsmgr/settings/microbosh/property.rb +33 -0
  26. data/lib/opsmgr/settings/microbosh/property_list.rb +27 -0
  27. data/lib/opsmgr/tasks.rb +16 -0
  28. data/lib/opsmgr/tasks/bosh.rake +104 -0
  29. data/lib/opsmgr/tasks/destroy.rake +42 -0
  30. data/lib/opsmgr/tasks/info.rake +19 -0
  31. data/lib/opsmgr/tasks/opsmgr.rake +205 -0
  32. data/lib/opsmgr/tasks/product.rake +82 -0
  33. data/lib/opsmgr/ui_helpers/add_first_user_spec.rb +25 -0
  34. data/lib/opsmgr/ui_helpers/config_helper.rb +38 -0
  35. data/lib/opsmgr/ui_helpers/delete_installation_spec.rb +41 -0
  36. data/lib/opsmgr/ui_helpers/delete_product_if_present_spec.rb +37 -0
  37. data/lib/opsmgr/ui_helpers/delete_product_spec.rb +39 -0
  38. data/lib/opsmgr/ui_helpers/export_installation_spec.rb +31 -0
  39. data/lib/opsmgr/ui_helpers/get_latest_install_log_spec.rb +29 -0
  40. data/lib/opsmgr/ui_helpers/import_stemcell_spec.rb +30 -0
  41. data/lib/opsmgr/ui_helpers/microbosh/configure_microbosh_spec.rb +32 -0
  42. data/lib/opsmgr/ui_helpers/post_import_configuration_spec.rb +31 -0
  43. data/lib/opsmgr/ui_helpers/revert_staged_changes_spec.rb +39 -0
  44. data/lib/opsmgr/ui_helpers/settings_helper.rb +132 -0
  45. data/lib/opsmgr/ui_helpers/trigger_install_spec.rb +35 -0
  46. data/lib/opsmgr/ui_helpers/ui_spec_runner.rb +122 -0
  47. data/lib/opsmgr/ui_helpers/uncheck_errands_spec.rb +29 -0
  48. data/lib/opsmgr/ui_helpers/upload_and_add_product_spec.rb +27 -0
  49. data/lib/opsmgr/ui_helpers/upload_and_upgrade_product_spec.rb +36 -0
  50. data/lib/opsmgr/version.rb +11 -0
  51. data/sample_env_files/aws.yml +95 -0
  52. data/sample_env_files/vsphere.yml +87 -0
  53. metadata +392 -0
data/lib/opsmgr/log.rb ADDED
@@ -0,0 +1,70 @@
1
+ require 'logger'
2
+
3
+ module Opsmgr
4
+ class << self
5
+ def log
6
+ Log.instance
7
+ end
8
+
9
+ def logger_for(progname)
10
+ LoggerWithProgName.new(progname)
11
+ end
12
+ end
13
+
14
+ module Loggable
15
+ def log
16
+ @logger ||= LoggerWithProgName.new(self.class.name)
17
+ end
18
+
19
+ def self.included(other_module)
20
+ def other_module.log
21
+ @logger ||= LoggerWithProgName.new(name)
22
+ end
23
+ end
24
+ end
25
+
26
+ class Log
27
+ class << self
28
+ def instance
29
+ @instance || fail('Logging attempted without being configured first!')
30
+ end
31
+
32
+ def test_mode!
33
+ log_path = '/tmp/opsmgr_test.log'
34
+ File.open(log_path, 'w') {} # empty out the file in a cross-platform-safe way
35
+ @instance = ::Logger.new(log_path, File::WRONLY | File::APPEND)
36
+ instance.sev_threshold = ::Logger::DEBUG
37
+ end
38
+
39
+ def stdout_mode!
40
+ STDOUT.sync = true
41
+ @instance = ::Logger.new(STDOUT)
42
+ instance.sev_threshold = ::Logger.const_get(ENV.fetch('LOG_LEVEL', 'INFO'))
43
+ end
44
+ end
45
+ end
46
+
47
+ class LoggerWithProgName
48
+ def initialize(progname)
49
+ @progname = progname
50
+ end
51
+
52
+ %w(debug info warn error fatal).map(&:to_sym).each do |level|
53
+ define_method(level) do |message|
54
+ Log.instance.public_send(level, progname) { message }
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ attr_reader :progname
61
+ end
62
+ end
63
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
64
+ # All rights reserved.
65
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
66
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
67
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
68
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
70
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,71 @@
1
+ require 'opsmgr/ui_helpers/ui_spec_runner'
2
+ require 'opsmgr/environments'
3
+ require 'opsmgr/cmd/ops_manager'
4
+ require 'opsmgr/api/client'
5
+
6
+ class ProductUploadWrapper
7
+ def self.wrap_add(environment:, product_path:, product_name:, om_version:)
8
+ wrap_operation(environment, product_path, product_name, 'add', om_version)
9
+ end
10
+
11
+ def self.wrap_upgrade(environment:, product_path:, product_name:, om_version:)
12
+ wrap_operation(environment, product_path, product_name, 'upgrade', om_version)
13
+ end
14
+
15
+ def self.wrap_upload(environment:, product_path:, product_name:, om_version:)
16
+ wrap_operation(environment, product_path, product_name, 'upload', om_version)
17
+ end
18
+
19
+ def self.wrap_operation(environment, product_path, product_name, operation, om_version)
20
+ unless %w(add upgrade upload).include?(operation)
21
+ fail "Operation '#{operation}' is not available"
22
+ end
23
+
24
+ environment_object = Opsmgr::Environments.for(environment)
25
+ client = Opsmgr::Api::Client.new(environment_object, om_version)
26
+ opsmgr_cmd = Opsmgr::Cmd::OpsManager.new(environment_object)
27
+ opsmgr_cmd.upload_product(client, product_path)
28
+
29
+ products_list = opsmgr_cmd.list_products(client)
30
+
31
+ stored_version = find_latest_version(product_name, products_list)
32
+
33
+ fail "#{product_name} is not available" if stored_version.nil?
34
+
35
+ return if operation == 'upload'
36
+
37
+ if operation == 'add'
38
+ opsmgr_cmd.add_product(client, product_name, stored_version)
39
+ else
40
+ installed_products = opsmgr_cmd.installed_products(client)
41
+ product_guid = installed_products.guid_for(product_name)
42
+ opsmgr_cmd.upgrade_product(client, product_guid, stored_version)
43
+ end
44
+ end
45
+
46
+ def self.find_latest_version(product_name, products_list)
47
+ stored_version = nil
48
+
49
+ products_list.products.each do |p|
50
+ if p['name'] != product_name
51
+ next
52
+ end
53
+
54
+ if stored_version.nil?
55
+ stored_version = p['product_version']
56
+ elsif Gem::Version.new(p['product_version']) > Gem::Version.new(stored_version)
57
+ stored_version = p['product_version']
58
+ end
59
+ end
60
+
61
+ stored_version
62
+ end
63
+ end
64
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
65
+ # All rights reserved.
66
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
67
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
68
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
69
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
70
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
71
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ require 'opsmgr/renderer/aws'
2
+ require 'opsmgr/renderer/noop'
3
+
4
+ module Opsmgr
5
+ module Renderer
6
+ def self.for(settings_file_contents)
7
+ case YAML.load(settings_file_contents)['iaas_type']
8
+ when 'aws'
9
+ AWS.new(settings_file_contents)
10
+ else
11
+ Noop.new(settings_file_contents)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
17
+ # All rights reserved.
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
19
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
20
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,148 @@
1
+ require 'aws-sdk-v1'
2
+ require 'mustache'
3
+ require 'active_support'
4
+ require 'active_support/core_ext'
5
+
6
+ module Opsmgr
7
+ module Renderer
8
+ class AWS < Mustache
9
+ BASE_RENDERER_FIELDS = {
10
+ vpc: 'PcfVpc',
11
+ iam_aws_access_key_id: 'PcfIamUserAccessKey',
12
+ iam_aws_secret_access_key: 'PcfIamUserSecretAccessKey',
13
+ ssh_key_pair_name: 'PcfKeyPairName',
14
+ public_subnet_id: 'PcfPublicSubnetId',
15
+ private_subnet_id: 'PcfPrivateSubnetId',
16
+ ops_manager_security_group_id: 'PcfOpsManagerSecurityGroupId',
17
+ vms_security_group_id: 'PcfVmsSecurityGroupId',
18
+ private_subnet_availability_zone: 'PcfPrivateSubnetAvailabilityZone',
19
+ public_subnet_availability_zone: 'PcfPublicSubnetAvailabilityZone',
20
+ s3_bucket_name: 'PcfOpsManagerS3Bucket',
21
+ ert_s3_bucket_name: 'PcfElasticRuntimeS3Bucket',
22
+ ert_s3_buildpacks_bucket_name: 'PcfElasticRuntimeS3BuildpacksBucket',
23
+ ert_s3_droplets_bucket_name: 'PcfElasticRuntimeS3DropletsBucket',
24
+ ert_s3_packages_bucket_name: 'PcfElasticRuntimeS3PackagesBucket',
25
+ ert_s3_resources_bucket_name: 'PcfElasticRuntimeS3ResourcesBucket',
26
+ rds_address: 'PcfRdsAddress',
27
+ rds_port: 'PcfRdsPort',
28
+ rds_username: 'PcfRdsUsername',
29
+ rds_password: 'PcfRdsPassword',
30
+ rds_ops_manager_dbname: 'PcfRdsDBName',
31
+ ert_elb_dns_name: 'PcfElbDnsName',
32
+ ert_ssh_elb_dns_name: 'PcfElbSshDnsName',
33
+ ert_tcp_elb_dns_name: 'PcfElbTcpDnsName'
34
+ }.freeze
35
+
36
+ BASE_RENDERER_FIELDS.each do |method_sym, output_key|
37
+ define_method(method_sym) do
38
+ output(output_key)
39
+ end
40
+ end
41
+
42
+ attr_reader :stack_name, :region
43
+ def initialize(settings_file_contents)
44
+ @settings_file_contents = settings_file_contents
45
+ settings = YAML.load(@settings_file_contents)
46
+ @vm_configs = settings.fetch('vm_shepherd').fetch('vm_configs')
47
+ @stack_name = settings.fetch('vm_shepherd').fetch('env_config').fetch('stack_name')
48
+ @region = settings.fetch('vm_shepherd').fetch('env_config').fetch('region')
49
+
50
+ ::AWS.config(
51
+ access_key_id: settings.fetch('vm_shepherd').fetch('env_config').fetch('aws_access_key'),
52
+ secret_access_key: settings.fetch('vm_shepherd').fetch('env_config').fetch('aws_secret_key'),
53
+ region: region,
54
+ )
55
+ @cloud_formation = ::AWS::CloudFormation.new
56
+ @ec2 = ::AWS::EC2.new
57
+
58
+ @custom_renderer_fields = settings.fetch('custom_renderer_fields', [])
59
+ setup_custom_renderer_field_methods! unless @custom_renderer_fields.empty?
60
+ end
61
+
62
+ def setup_custom_renderer_field_methods!
63
+ @custom_renderer_fields.each do |property|
64
+ method_body = proc do
65
+ # convert my_custom_key to MyCustomKey to match AWS format
66
+ output(property.camelize)
67
+ end
68
+
69
+ self.class.send(:define_method, property.to_sym, &method_body)
70
+ end
71
+ end
72
+
73
+ def rendered_settings
74
+ render(@settings_file_contents)
75
+ end
76
+
77
+ def vms_security_group_name
78
+ security_group = @ec2.security_groups.find { |g| g.id == vms_security_group_id }
79
+ security_group ? security_group.name : ''
80
+ end
81
+
82
+ def s3_endpoint
83
+ {
84
+ 'us-east-1' => 'https://s3.amazonaws.com',
85
+ 'us-west-1' => 'https://s3-us-west-1.amazonaws.com',
86
+ }[region]
87
+ end
88
+
89
+ def release_candidate_public_ip
90
+ ops_manager_elastic_ip ? ops_manager_elastic_ip.public_ip : nil
91
+ end
92
+
93
+ def previous_version_public_ip
94
+ previous_version_elastic_ip ? previous_version_elastic_ip.public_ip : nil
95
+ end
96
+
97
+ private
98
+
99
+ def output(key)
100
+ output = outputs.detect { |o| o.key == key }
101
+ return output.value unless output.nil?
102
+ ''
103
+ rescue ::AWS::CloudFormation::Errors::ValidationError
104
+ ''
105
+ end
106
+
107
+ def outputs
108
+ @outputs ||= @cloud_formation.stacks[@stack_name].outputs
109
+ rescue ::AWS::CloudFormation::Errors::ValidationError
110
+ @outputs = {}
111
+ end
112
+
113
+ def ops_manager_elastic_ip
114
+ @ops_manager_elastic_ip ||= ops_manager_instance ? ops_manager_instance.elastic_ip : nil
115
+ end
116
+
117
+ def ops_manager_instance
118
+ @ops_manager_instance ||= find_vm_instance('RELEASE-CANDIATE')
119
+ end
120
+
121
+ def previous_version_elastic_ip
122
+ @previous_version_elastic_ip ||= previous_version_instance ? previous_version_instance.elastic_ip : nil
123
+ end
124
+
125
+ def previous_version_instance
126
+ @previous_version_instance ||= find_vm_instance('PREVIOUS-VERSION')
127
+ end
128
+
129
+ def find_vm_instance(vm_name_token)
130
+ @ec2.instances.find do |instance|
131
+ instance.tags.to_h['Name'] == find_vm_name(vm_name_token) && instance.status == :running
132
+ end
133
+ end
134
+
135
+ def find_vm_name(vm_name_token)
136
+ @vm_configs.find { |config| config.fetch('vm_name').match(vm_name_token) }.fetch('vm_name')
137
+ end
138
+ end
139
+ end
140
+ end
141
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
142
+ # All rights reserved.
143
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
144
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
145
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
146
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
147
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
148
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,21 @@
1
+ module Opsmgr
2
+ module Renderer
3
+ class Noop
4
+ def initialize(settings_file_contents)
5
+ @settings_file_contents = settings_file_contents
6
+ end
7
+
8
+ def rendered_settings
9
+ @settings_file_contents
10
+ end
11
+ end
12
+ end
13
+ end
14
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
15
+ # All rights reserved.
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
17
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
18
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,84 @@
1
+ require 'yaml'
2
+ require 'opsmgr/settings/microbosh/product'
3
+ require 'opsmgr/log'
4
+
5
+ module Opsmgr
6
+ module Settings
7
+ module Microbosh
8
+ class InstallationSettings
9
+ include Loggable
10
+
11
+ def self.from_api_result(result)
12
+ new(result.as_hash)
13
+ end
14
+
15
+ def initialize(installation_hash)
16
+ @installation_hash = installation_hash
17
+ end
18
+
19
+ def product(product_name)
20
+ products.find { |p| p.name == product_name }
21
+ end
22
+
23
+ def network_guid(network_name)
24
+ networks = installation_hash.fetch('infrastructure', {}).fetch('networks', [])
25
+ matching_network = networks.find { |network| network['name'] == network_name }
26
+
27
+ if matching_network.nil?
28
+ available_network_names = networks.map { |network| network['name'] }
29
+ log.warn("No network matching name #{network_name}. Available names: #{available_network_names.join(', ')}")
30
+ return nil
31
+ end
32
+
33
+ matching_network.fetch('guid')
34
+ end
35
+
36
+ def default_availability_zone_guid
37
+ first_zone = installation_hash.fetch('infrastructure', {}).fetch('availability_zones', []).first
38
+ first_zone['guid'] if first_zone
39
+ end
40
+
41
+ def availability_zone_guid(zone_name)
42
+ zones = installation_hash.fetch('infrastructure', {}).fetch('availability_zones', [])
43
+ matching_zone = zones.find do |zone|
44
+ zone['name'] == zone_name
45
+ end
46
+
47
+ if matching_zone.nil?
48
+ available_zone_names = zones.map { |network| network['name'] }
49
+ log.warn("No availability zone matching name #{zone_name}. Available names: #{available_zone_names.join(', ')}")
50
+ return nil
51
+ end
52
+
53
+ matching_zone.fetch('guid')
54
+ end
55
+
56
+ def to_yaml
57
+ YAML.dump(installation_hash)
58
+ end
59
+
60
+ private
61
+
62
+ attr_reader :installation_hash
63
+
64
+ def products
65
+ if installation_hash.key?('components')
66
+ installation_hash.fetch('components').map { |h| Opsmgr::Settings::Microbosh::Product.new(h) }
67
+ elsif installation_hash.key?('products')
68
+ installation_hash.fetch('products').map { |h| Opsmgr::Settings::Microbosh::Product.new(h) }
69
+ else
70
+ fail 'Unknown Ops Manager installation schema. Please check Ops Manager version.'
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
78
+ # All rights reserved.
79
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
80
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
81
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
82
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
83
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
84
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ require 'opsmgr/settings/microbosh/property'
2
+
3
+ module Opsmgr
4
+ module Settings
5
+ module Microbosh
6
+ class Job
7
+ def initialize(job_hash)
8
+ @job_hash = job_hash
9
+ end
10
+
11
+ def name
12
+ job_hash.fetch('identifier')
13
+ rescue
14
+ job_hash.fetch('type')
15
+ end
16
+
17
+ def property(property_name)
18
+ properties('properties').find { |property| property.name == property_name }
19
+ end
20
+
21
+ def resource(resource_name)
22
+ properties('resources').find { |resource| resource.name == resource_name }
23
+ end
24
+
25
+ def networks=(networks)
26
+ job_hash['network_references'] = networks
27
+ end
28
+
29
+ def elb_name=(name)
30
+ job_hash['elb_name'] = name
31
+ end
32
+
33
+ def instances=(instance_count)
34
+ job_hash['instances'].first['value'] = instance_count
35
+ job_hash.delete('partitions')
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :job_hash
41
+
42
+ def properties(key)
43
+ job_hash[key].map { |property| Opsmgr::Settings::Microbosh::Property.new(property) }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
50
+ # All rights reserved.
51
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
52
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
53
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
54
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
55
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
56
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.