chef-provisioning-oneview 1.0.1
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/LICENSE +9 -0
- data/README.md +149 -0
- data/Rakefile +19 -0
- data/lib/chef/provisioning/driver_init/oneview.rb +3 -0
- data/lib/chef/provisioning/oneview/oneview_api.rb +467 -0
- data/lib/chef/provisioning/oneview/v1.20/api.rb +3 -0
- data/lib/chef/provisioning/oneview/v2.0/api.rb +3 -0
- data/lib/chef/provisioning/oneview/version.rb +5 -0
- data/lib/chef/provisioning/oneview_driver.rb +173 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/fake_icsp.rb +21 -0
- data/spec/support/fake_oneview.rb +21 -0
- data/spec/support/fixtures/icsp/v102/error_404.json +14 -0
- data/spec/support/fixtures/icsp/v102/login.json +5 -0
- data/spec/support/fixtures/icsp/v102/os-deployment-build-plans.json +99 -0
- data/spec/support/fixtures/icsp/v102/os-deployment-servers_managed.json +179 -0
- data/spec/support/fixtures/icsp/v102/server_by_sn.json +45 -0
- data/spec/support/fixtures/icsp/v102/version.json +4 -0
- data/spec/support/fixtures/oneview/v120/error_404.json +14 -0
- data/spec/support/fixtures/oneview/v120/login.json +5 -0
- data/spec/support/fixtures/oneview/v120/server-hardware.json +1476 -0
- data/spec/support/fixtures/oneview/v120/server-profiles.json +747 -0
- data/spec/support/fixtures/oneview/v120/server-profiles_specific.json +133 -0
- data/spec/support/fixtures/oneview/v120/version.json +4 -0
- data/spec/unit/oneview_driver_spec.rb +98 -0
- data/spec/unit/support/fake_action_handler.rb +6 -0
- metadata +159 -0
| @@ -0,0 +1,173 @@ | |
| 1 | 
            +
            require 'chef/json_compat'
         | 
| 2 | 
            +
            require 'chef/knife'
         | 
| 3 | 
            +
            require 'chef/provisioning/convergence_strategy/install_sh'
         | 
| 4 | 
            +
            require 'chef/provisioning/driver'
         | 
| 5 | 
            +
            require 'chef/provisioning/transport/ssh'
         | 
| 6 | 
            +
            require 'chef/provisioning/machine/unix_machine'
         | 
| 7 | 
            +
            require 'json'
         | 
| 8 | 
            +
            require 'ridley'
         | 
| 9 | 
            +
            require_relative 'driver_init/oneview'
         | 
| 10 | 
            +
            require_relative 'oneview/version'
         | 
| 11 | 
            +
            require_relative 'oneview/oneview_api'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module Chef::Provisioning
         | 
| 14 | 
            +
              class OneViewDriver < Chef::Provisioning::Driver
         | 
| 15 | 
            +
                include OneViewAPI
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def self.canonicalize_url(url, config)
         | 
| 18 | 
            +
                  _scheme, oneview_url = url.split(':', 2)
         | 
| 19 | 
            +
                  if oneview_url.nil? || oneview_url == ''
         | 
| 20 | 
            +
                    oneview_url = config[:knife][:oneview_url]
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  fail 'Must set the knife[:oneview_url] attribute!' if oneview_url.nil? || oneview_url.empty?
         | 
| 23 | 
            +
                  'oneview:' + oneview_url
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def self.from_url(oneview_url, config)
         | 
| 27 | 
            +
                  OneViewDriver.new(oneview_url, config)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def initialize(canonical_url, config)
         | 
| 31 | 
            +
                  super(canonical_url, config)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  @oneview_base_url    = config[:knife][:oneview_url]
         | 
| 34 | 
            +
                  fail 'Must set the knife[:oneview_url] attribute!' if @oneview_base_url.nil? || @oneview_base_url.empty?
         | 
| 35 | 
            +
                  @oneview_username    = config[:knife][:oneview_username]
         | 
| 36 | 
            +
                  fail 'Must set the knife[:oneview_username] attribute!' if @oneview_username.nil? || @oneview_username.empty?
         | 
| 37 | 
            +
                  @oneview_password    = config[:knife][:oneview_password]
         | 
| 38 | 
            +
                  fail 'Must set the knife[:oneview_password] attribute!' if @oneview_password.nil? || @oneview_password.empty?
         | 
| 39 | 
            +
                  @oneview_disable_ssl = config[:knife][:oneview_ignore_ssl]
         | 
| 40 | 
            +
                  @oneview_api_version = 120 # get_oneview_api_version
         | 
| 41 | 
            +
                  @oneview_key         = login_to_oneview
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  @icsp_base_url       = config[:knife][:icsp_url]
         | 
| 44 | 
            +
                  fail 'Must set the knife[:icsp_url] attribute!' if @icsp_base_url.nil? || @icsp_base_url.empty?
         | 
| 45 | 
            +
                  @icsp_username       = config[:knife][:icsp_username]
         | 
| 46 | 
            +
                  fail 'Must set the knife[:icsp_username] attribute!' if @icsp_username.nil? || @icsp_username.empty?
         | 
| 47 | 
            +
                  @icsp_password       = config[:knife][:icsp_password]
         | 
| 48 | 
            +
                  fail 'Must set the knife[:icsp_password] attribute!' if @icsp_password.nil? || @icsp_password.empty?
         | 
| 49 | 
            +
                  @icsp_disable_ssl    = config[:knife][:icsp_ignore_ssl]
         | 
| 50 | 
            +
                  @icsp_api_version    = 102 # get_icsp_api_version
         | 
| 51 | 
            +
                  @icsp_key            = login_to_icsp
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
             | 
| 55 | 
            +
                def allocate_machine(action_handler, machine_spec, machine_options)
         | 
| 56 | 
            +
                  host_name = machine_options[:driver_options][:host_name]
         | 
| 57 | 
            +
                  if machine_spec.reference
         | 
| 58 | 
            +
                    if get_oneview_profile_by_sn(machine_spec.reference['serial_number']).nil? # It doesn't really exist
         | 
| 59 | 
            +
                      action_handler.report_progress "Machine #{host_name} does not really exist.  Recreating ..."
         | 
| 60 | 
            +
                      machine_spec.reference = nil
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                  if !machine_spec.reference
         | 
| 64 | 
            +
                    action_handler.perform_action "Creating server #{machine_spec.name}" do
         | 
| 65 | 
            +
                      profile = create_machine(action_handler, machine_spec, machine_options)
         | 
| 66 | 
            +
                      machine_spec.reference = {
         | 
| 67 | 
            +
                        'driver_url' => driver_url,
         | 
| 68 | 
            +
                        'driver_version' => ONEVIEW_DRIVER_VERSION,
         | 
| 69 | 
            +
                        'serial_number' => profile['serialNumber']
         | 
| 70 | 
            +
                      }
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
             | 
| 76 | 
            +
                def allocate_machines(action_handler, specs_and_options, _parallelizer)
         | 
| 77 | 
            +
                  specs_and_options.each do |machine_spec, machine_options|
         | 
| 78 | 
            +
                    allocate_machine(action_handler, machine_spec, machine_options)
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
             | 
| 83 | 
            +
                def ready_machine(action_handler, machine_spec, machine_options)
         | 
| 84 | 
            +
                  profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
         | 
| 85 | 
            +
                  customize_machine(action_handler, machine_spec, machine_options, profile)
         | 
| 86 | 
            +
                  machine_for(machine_spec, machine_options) # Return the Machine object
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
             | 
| 90 | 
            +
                def machine_for(machine_spec, machine_options)
         | 
| 91 | 
            +
                  bootstrap_ip_address = machine_options[:driver_options][:ip_address]
         | 
| 92 | 
            +
                  username = machine_options[:transport_options][:user] || 'root' rescue 'root'
         | 
| 93 | 
            +
                  default_ssh_options = {
         | 
| 94 | 
            +
                    # auth_methods: ['publickey'],
         | 
| 95 | 
            +
                    # keys: ['/home/username/.vagrant.d/insecure_private_key'],
         | 
| 96 | 
            +
                    password: Chef::Config.knife[:node_root_password]
         | 
| 97 | 
            +
                  }
         | 
| 98 | 
            +
                  ssh_options = machine_options[:transport_options][:ssh_options] || default_ssh_options rescue default_ssh_options
         | 
| 99 | 
            +
                  default_options = {
         | 
| 100 | 
            +
                    prefix: 'sudo ',
         | 
| 101 | 
            +
                    ssh_pty_enable: true
         | 
| 102 | 
            +
                  }
         | 
| 103 | 
            +
                  options = machine_options[:transport_options][:options] || default_options rescue default_options
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  transport = Chef::Provisioning::Transport::SSH.new(bootstrap_ip_address, username, ssh_options, options, config)
         | 
| 106 | 
            +
                  convergence_strategy = Chef::Provisioning::ConvergenceStrategy::InstallSh.new(
         | 
| 107 | 
            +
                    machine_options[:convergence_options], {})
         | 
| 108 | 
            +
                  Chef::Provisioning::Machine::UnixMachine.new(machine_spec, transport, convergence_strategy)
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
             | 
| 112 | 
            +
                def stop_machine(action_handler, machine_spec, _machine_options)
         | 
| 113 | 
            +
                  power_off(action_handler, machine_spec) if machine_spec.reference
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
             | 
| 117 | 
            +
                def destroy_machine(action_handler, machine_spec, machine_options)
         | 
| 118 | 
            +
                  if machine_spec.reference
         | 
| 119 | 
            +
                    power_off(action_handler, machine_spec) # Power off server
         | 
| 120 | 
            +
                    destroy_icsp_server(action_handler, machine_spec) # Delete os deployment server from ICSP
         | 
| 121 | 
            +
                    destroy_oneview_profile(action_handler, machine_spec) # Delete server profile from OneView
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                    name = machine_spec.name # Save for next steps
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                    # Delete the node from the Chef server
         | 
| 126 | 
            +
                    action_handler.perform_action "Release machine #{machine_spec.reference['serial_number']}" do
         | 
| 127 | 
            +
                      machine_spec.reference = nil
         | 
| 128 | 
            +
                      machine_spec.delete(action_handler)
         | 
| 129 | 
            +
                    end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    # Delete client from the Chef server
         | 
| 132 | 
            +
                    action_handler.perform_action "Delete client '#{name}' from Chef server" do
         | 
| 133 | 
            +
                      begin
         | 
| 134 | 
            +
                        ridley = Ridley.new(
         | 
| 135 | 
            +
                          server_url:  machine_options[:convergence_options][:chef_server][:chef_server_url],
         | 
| 136 | 
            +
                          client_name: machine_options[:convergence_options][:chef_server][:options][:client_name],
         | 
| 137 | 
            +
                          client_key:  machine_options[:convergence_options][:chef_server][:options][:signing_key_filename]
         | 
| 138 | 
            +
                        )
         | 
| 139 | 
            +
                        ridley.client.delete(name)
         | 
| 140 | 
            +
                      rescue  Exception => e
         | 
| 141 | 
            +
                        action_handler.report_progress "WARN: Failed to delete client #{name} from server!"
         | 
| 142 | 
            +
                        puts "Error: #{e.message}"
         | 
| 143 | 
            +
                      end
         | 
| 144 | 
            +
                    end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                    # Remove entry from known_hosts file(s)
         | 
| 147 | 
            +
                    if machine_options[:driver_options][:ip_address]
         | 
| 148 | 
            +
                      action_handler.perform_action "Delete entry for '#{machine_options[:driver_options][:ip_address]}' from known_hosts file(s)" do
         | 
| 149 | 
            +
                        files = [File.expand_path('~/.ssh/known_hosts'), File.expand_path('/etc/ssh/known_hosts')]
         | 
| 150 | 
            +
                        files.each do |f|
         | 
| 151 | 
            +
                          next if !File.exist?(f)
         | 
| 152 | 
            +
                          begin
         | 
| 153 | 
            +
                            text = File.read(f)
         | 
| 154 | 
            +
                            text.gsub!(/#{machine_options[:driver_options][:ip_address]} ssh-rsa.*(\n|\r\n)/, '')
         | 
| 155 | 
            +
                            File.open(f, 'w') {|file| file.puts text } if text
         | 
| 156 | 
            +
                          rescue  Exception => e
         | 
| 157 | 
            +
                            action_handler.report_progress "WARN: Failed to delete entry for '#{machine_options[:driver_options][:ip_address]}' from known_hosts file: '#{f}'! "
         | 
| 158 | 
            +
                            puts "Error: #{e.message}"
         | 
| 159 | 
            +
                          end
         | 
| 160 | 
            +
                        end
         | 
| 161 | 
            +
                      end
         | 
| 162 | 
            +
                    end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  end # End if machine_spec.reference
         | 
| 165 | 
            +
                end # destroy_machine method end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
             | 
| 168 | 
            +
                def connect_to_machine(machine_spec, machine_options)
         | 
| 169 | 
            +
                  machine_for(machine_spec, machine_options)
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
             | 
| 172 | 
            +
              end # class end
         | 
| 173 | 
            +
            end # module end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require 'pry'
         | 
| 2 | 
            +
            require_relative './../lib/chef/provisioning/driver_init/oneview'
         | 
| 3 | 
            +
            require_relative 'support/fake_oneview'
         | 
| 4 | 
            +
            require_relative 'support/fake_icsp'
         | 
| 5 | 
            +
            require 'webmock/rspec'
         | 
| 6 | 
            +
            # WebMock.disable_net_connect!(allow_localhost: true)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            RSpec.configure do |config|
         | 
| 9 | 
            +
              config.before(:each) do
         | 
| 10 | 
            +
                allow_any_instance_of(Chef::Provisioning::OneViewDriver).to receive(:get_oneview_api_version).and_return(120)
         | 
| 11 | 
            +
                allow_any_instance_of(Chef::Provisioning::OneViewDriver).to receive(:get_icsp_api_version).and_return(102)
         | 
| 12 | 
            +
                allow_any_instance_of(Chef::Provisioning::OneViewDriver).to receive(:login_to_oneview).and_return('long_oneview_key')
         | 
| 13 | 
            +
                allow_any_instance_of(Chef::Provisioning::OneViewDriver).to receive(:login_to_icsp).and_return('long_icsp_key')
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                stub_request(:any, /my-oneview.my-domain.com/).to_rack(FakeOneView)
         | 
| 16 | 
            +
                stub_request(:any, /my-icsp.my-domain.com/).to_rack(FakeIcsp)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            # Chef::Log.level = :debug
         | 
| 21 | 
            +
            Chef::Config[:log_level] = :warn
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require 'sinatra/base'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class FakeIcsp < Sinatra::Base
         | 
| 4 | 
            +
              get '/rest/version' do
         | 
| 5 | 
            +
                version = request['X-API-Version'] # TODO
         | 
| 6 | 
            +
                json_response(200, 'version.json', version)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              post '/rest/login-sessions' do
         | 
| 10 | 
            +
                version = request['X-API-Version'] # TODO
         | 
| 11 | 
            +
                json_response(200, 'login.json', version)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              private
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def json_response(response_code, file_name, version = 102)
         | 
| 17 | 
            +
                content_type :json
         | 
| 18 | 
            +
                status response_code
         | 
| 19 | 
            +
                File.open(File.dirname(__FILE__) + "/fixtures/icsp/v#{version.gsub('.', '')}/" + file_name, 'rb').read
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require 'sinatra/base'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class FakeOneView < Sinatra::Base
         | 
| 4 | 
            +
              get '/rest/version' do
         | 
| 5 | 
            +
                version = request['X-API-Version'] # TODO
         | 
| 6 | 
            +
                json_response(200, 'version.json', version)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              post '/rest/login-sessions' do
         | 
| 10 | 
            +
                version = request['X-API-Version'] # TODO
         | 
| 11 | 
            +
                json_response(200, 'login.json', version)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              private
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def json_response(response_code, file_name, version = 120)
         | 
| 17 | 
            +
                content_type :json
         | 
| 18 | 
            +
                status response_code
         | 
| 19 | 
            +
                File.open(File.dirname(__FILE__) + "/fixtures/oneview/v#{version.gsub('.', '')}/" + file_name, 'rb').read
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "errorSource": null,
         | 
| 3 | 
            +
              "nestedErrors": [
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              ],
         | 
| 6 | 
            +
              "errorCode": "GENERIC_HTTP_404",
         | 
| 7 | 
            +
              "data": {
         | 
| 8 | 
            +
              },
         | 
| 9 | 
            +
              "recommendedActions": [
         | 
| 10 | 
            +
                "Check the request URI, then resend the request."
         | 
| 11 | 
            +
              ],
         | 
| 12 | 
            +
              "details": "The requested resource could not be found.",
         | 
| 13 | 
            +
              "message": "Not Found"
         | 
| 14 | 
            +
            }
         | 
| @@ -0,0 +1,99 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "type": "OsdPaginatedCollection",
         | 
| 3 | 
            +
              "members": [
         | 
| 4 | 
            +
                {
         | 
| 5 | 
            +
                  "modifiedBy": "applianceserviceaccount",
         | 
| 6 | 
            +
                  "createdBy": "applianceserviceaccount",
         | 
| 7 | 
            +
                  "buildPlanHistory": [],
         | 
| 8 | 
            +
                  "buildPlanStepType": null,
         | 
| 9 | 
            +
                  "isCustomerContent": true,
         | 
| 10 | 
            +
                  "buildPlanCustAttrs": [],
         | 
| 11 | 
            +
                  "buildPlanItems": [],
         | 
| 12 | 
            +
                  "os": "OS - Red Hat Enterprise Linux Server 6",
         | 
| 13 | 
            +
                  "arch": "x64",
         | 
| 14 | 
            +
                  "lifeCycle": "AVAILABLE",
         | 
| 15 | 
            +
                  "description": "Performs a scripted install of Red Hat Enterprise Linux 6.5 using a generic kickstart file.\n(c) Copyright 2014 Hewlett-Packard Development Company, L.P.\n\nRequirements:\n* HP ProLiant server with iLO\n* IC server provisioning Media Server must contain the OS distribution\n\nRequired Custom Attribute:  None\n\nOptional Custom Attributes:\n* encrypted_root_password (must be encrypted)\n* boot_disk\n* kernel_arguments",
         | 
| 16 | 
            +
                  "status": "",
         | 
| 17 | 
            +
                  "name": "CHEF-RHEL-6.5-x64",
         | 
| 18 | 
            +
                  "state": "",
         | 
| 19 | 
            +
                  "modified": "2015-07-14T03:51:30.000Z",
         | 
| 20 | 
            +
                  "eTag": "2015-07-14T03:51:30.000Z",
         | 
| 21 | 
            +
                  "created": "2015-05-19T19:05:37.000Z",
         | 
| 22 | 
            +
                  "category": "os-deployment-build-plans",
         | 
| 23 | 
            +
                  "uri": "/rest/os-deployment-build-plans/1280001"
         | 
| 24 | 
            +
                },
         | 
| 25 | 
            +
                {
         | 
| 26 | 
            +
                  "modifiedBy": "applianceserviceaccount",
         | 
| 27 | 
            +
                  "createdBy": "applianceserviceaccount",
         | 
| 28 | 
            +
                  "buildPlanHistory": [],
         | 
| 29 | 
            +
                  "buildPlanStepType": null,
         | 
| 30 | 
            +
                  "isCustomerContent": true,
         | 
| 31 | 
            +
                  "buildPlanCustAttrs": [],
         | 
| 32 | 
            +
                  "buildPlanItems": [],
         | 
| 33 | 
            +
                  "os": "Other",
         | 
| 34 | 
            +
                  "arch": "x64",
         | 
| 35 | 
            +
                  "lifeCycle": "AVAILABLE",
         | 
| 36 | 
            +
                  "description": "Reboots a target server in maintenance mode to the local disk. \n(c) Copyright 2013 Hewlett-Packard Development Company, L.P.\n\nRequirements:\n* HP ProLiant server with iLO\n\nCustom Attributes: None",
         | 
| 37 | 
            +
                  "status": "",
         | 
| 38 | 
            +
                  "name": "CHEF - RHEL 6.6 x64",
         | 
| 39 | 
            +
                  "state": "",
         | 
| 40 | 
            +
                  "modified": "2015-05-21T17:23:58.000Z",
         | 
| 41 | 
            +
                  "eTag": "2015-05-21T17:23:58.000Z",
         | 
| 42 | 
            +
                  "created": "2015-05-21T17:23:58.000Z",
         | 
| 43 | 
            +
                  "category": "os-deployment-build-plans",
         | 
| 44 | 
            +
                  "uri": "/rest/os-deployment-build-plans/1300001"
         | 
| 45 | 
            +
                },
         | 
| 46 | 
            +
                {
         | 
| 47 | 
            +
                  "modifiedBy": "applianceserviceaccount",
         | 
| 48 | 
            +
                  "createdBy": "applianceserviceaccount",
         | 
| 49 | 
            +
                  "buildPlanHistory": [],
         | 
| 50 | 
            +
                  "buildPlanStepType": null,
         | 
| 51 | 
            +
                  "isCustomerContent": true,
         | 
| 52 | 
            +
                  "buildPlanCustAttrs": [],
         | 
| 53 | 
            +
                  "buildPlanItems": [],
         | 
| 54 | 
            +
                  "os": "OS - Red Hat Enterprise Linux Server 7",
         | 
| 55 | 
            +
                  "arch": "x64",
         | 
| 56 | 
            +
                  "lifeCycle": "AVAILABLE",
         | 
| 57 | 
            +
                  "description": "Performs a scripted install of Red Hat Enterprise Linux 7.0 using a generic kickstart file.\n(c) Copyright 2014 Hewlett-Packard Development Company, L.P.\n\nRequirements:\n* HP ProLiant server with iLO\n* IC server provisioning Media Server must contain the OS distribution\n\nRequired Custom Attribute:  None\n\nOptional Custom Attributes:\n* encrypted_root_password (must be encrypted)\n* boot_disk\n* kernel_arguments",
         | 
| 58 | 
            +
                  "status": "",
         | 
| 59 | 
            +
                  "name": "CHEF - RHEL 7.0 x64",
         | 
| 60 | 
            +
                  "state": "",
         | 
| 61 | 
            +
                  "modified": "2015-07-24T09:32:52.000Z",
         | 
| 62 | 
            +
                  "eTag": "2015-07-24T09:32:52.000Z",
         | 
| 63 | 
            +
                  "created": "2015-07-15T17:46:32.000Z",
         | 
| 64 | 
            +
                  "category": "os-deployment-build-plans",
         | 
| 65 | 
            +
                  "uri": "/rest/os-deployment-build-plans/1340001"
         | 
| 66 | 
            +
                },
         | 
| 67 | 
            +
                {
         | 
| 68 | 
            +
                  "modifiedBy": "detuser",
         | 
| 69 | 
            +
                  "createdBy": "opsware",
         | 
| 70 | 
            +
                  "buildPlanHistory": [],
         | 
| 71 | 
            +
                  "buildPlanStepType": null,
         | 
| 72 | 
            +
                  "isCustomerContent": false,
         | 
| 73 | 
            +
                  "buildPlanCustAttrs": [],
         | 
| 74 | 
            +
                  "buildPlanItems": [],
         | 
| 75 | 
            +
                  "os": "OS - Windows Server 2008 R2",
         | 
| 76 | 
            +
                  "arch": "x64",
         | 
| 77 | 
            +
                  "lifeCycle": "AVAILABLE",
         | 
| 78 | 
            +
                  "description": "Performs a scripted install of Windows 2008 R2 SP1 Standard using a generic unattend file.\n(c) Copyright 2013, 2014 Hewlett-Packard Development Company, L.P.\n\nRequirements:\n* HP ProLiant server with iLO\n* IC server provisioning Media Server must contain the OS distribution\n\nRequired Custom Attribute:\n* ProductKey_Win2008R2-Std-x64 - Set using the Settings -> Product Key page.\n\nOptional Custom Attributes:\n* ComputerName\n* EncryptedAdminPassword (must be encrypted)\n* SystemDisk\n* SystemDiskNumber",
         | 
| 79 | 
            +
                  "status": "",
         | 
| 80 | 
            +
                  "name": "ProLiant OS - Windows 2008 R2 SP1 Standard x64 Scripted Install",
         | 
| 81 | 
            +
                  "state": "",
         | 
| 82 | 
            +
                  "modified": "2014-09-15T02:30:17.000Z",
         | 
| 83 | 
            +
                  "eTag": "2014-09-15T02:30:17.000Z",
         | 
| 84 | 
            +
                  "created": "2014-09-15T02:30:17.000Z",
         | 
| 85 | 
            +
                  "category": "os-deployment-build-plans",
         | 
| 86 | 
            +
                  "uri": "/rest/os-deployment-build-plans/1040001"
         | 
| 87 | 
            +
                }
         | 
| 88 | 
            +
              ],
         | 
| 89 | 
            +
              "start": 0,
         | 
| 90 | 
            +
              "prevPageUri": null,
         | 
| 91 | 
            +
              "nextPageUri": null,
         | 
| 92 | 
            +
              "total": 0,
         | 
| 93 | 
            +
              "count": 71,
         | 
| 94 | 
            +
              "modified": null,
         | 
| 95 | 
            +
              "eTag": null,
         | 
| 96 | 
            +
              "created": null,
         | 
| 97 | 
            +
              "category": null,
         | 
| 98 | 
            +
              "uri": null
         | 
| 99 | 
            +
            }
         | 
| @@ -0,0 +1,179 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "type": "OsdPaginatedCollection",
         | 
| 3 | 
            +
              "members": [
         | 
| 4 | 
            +
                {
         | 
| 5 | 
            +
                  "modified": "2015-08-10T16:45:57.019Z",
         | 
| 6 | 
            +
                  "deviceGroups": null,
         | 
| 7 | 
            +
                  "customAttributes": [],
         | 
| 8 | 
            +
                  "created": "2015-08-10T04:35:52.000Z",
         | 
| 9 | 
            +
                  "uuid": "2b4e5e6c-6154-7849-9807-c96a7e0d445b",
         | 
| 10 | 
            +
                  "cpus": [
         | 
| 11 | 
            +
                    {
         | 
| 12 | 
            +
                      "cacheSize": "15360",
         | 
| 13 | 
            +
                      "speed": "1200",
         | 
| 14 | 
            +
                      "stepping": "7",
         | 
| 15 | 
            +
                      "model": "Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz",
         | 
| 16 | 
            +
                      "family": "X64",
         | 
| 17 | 
            +
                      "status": "ON-LINE",
         | 
| 18 | 
            +
                      "slot": "0"
         | 
| 19 | 
            +
                    }
         | 
| 20 | 
            +
                  ],
         | 
| 21 | 
            +
                  "ilo": null,
         | 
| 22 | 
            +
                  "serverLocation": {
         | 
| 23 | 
            +
                    "rack": "DemoRack",
         | 
| 24 | 
            +
                    "enclosure": "dazzle",
         | 
| 25 | 
            +
                    "bay": "3"
         | 
| 26 | 
            +
                  },
         | 
| 27 | 
            +
                  "operatingSystemVersion": null,
         | 
| 28 | 
            +
                  "opswLifecycle": "MANAGED",
         | 
| 29 | 
            +
                  "osSPVersion": null,
         | 
| 30 | 
            +
                  "peerIP": "192.168.133.41",
         | 
| 31 | 
            +
                  "stage": "UNKNOWN",
         | 
| 32 | 
            +
                  "running": "false",
         | 
| 33 | 
            +
                  "reporting": true,
         | 
| 34 | 
            +
                  "storageDevices": [],
         | 
| 35 | 
            +
                  "ram": "16291780",
         | 
| 36 | 
            +
                  "swap": "8216568",
         | 
| 37 | 
            +
                  "architecture": null,
         | 
| 38 | 
            +
                  "defaultGateway": "16.125.32.1",
         | 
| 39 | 
            +
                  "discoveredDate": "2015-08-10T04:35:52.000Z",
         | 
| 40 | 
            +
                  "facility": "Appliance",
         | 
| 41 | 
            +
                  "hardwareModel": "PROLIANT BL460C GEN8",
         | 
| 42 | 
            +
                  "jobsHistory": null,
         | 
| 43 | 
            +
                  "lastScannedDate": null,
         | 
| 44 | 
            +
                  "loopbackIP": null,
         | 
| 45 | 
            +
                  "managementIP": "192.168.133.41",
         | 
| 46 | 
            +
                  "manufacturer": "HP",
         | 
| 47 | 
            +
                  "mid": "1680001",
         | 
| 48 | 
            +
                  "netBios": null,
         | 
| 49 | 
            +
                  "operatingSystem": null,
         | 
| 50 | 
            +
                  "osFlavor": null,
         | 
| 51 | 
            +
                  "serialNumber": "VCGE9KB042",
         | 
| 52 | 
            +
                  "locale": null,
         | 
| 53 | 
            +
                  "description": null,
         | 
| 54 | 
            +
                  "status": "OK",
         | 
| 55 | 
            +
                  "uri": "/rest/os-deployment-servers/1680001",
         | 
| 56 | 
            +
                  "name": "chef-web02.domain.com",
         | 
| 57 | 
            +
                  "interfaces": [
         | 
| 58 | 
            +
                    {
         | 
| 59 | 
            +
                      "speed": "10000",
         | 
| 60 | 
            +
                      "netmask": "255.255.254.0",
         | 
| 61 | 
            +
                      "duplex": "FULL",
         | 
| 62 | 
            +
                      "ipv6Addr": "",
         | 
| 63 | 
            +
                      "macAddr": "AE:B2:F8:20:01:17",
         | 
| 64 | 
            +
                      "dhcpEnabled": false,
         | 
| 65 | 
            +
                      "ipv4Addr": "16.125.32.39",
         | 
| 66 | 
            +
                      "type": "ETHERNET",
         | 
| 67 | 
            +
                      "slot": "eth1"
         | 
| 68 | 
            +
                    },
         | 
| 69 | 
            +
                    {
         | 
| 70 | 
            +
                      "speed": "10000",
         | 
| 71 | 
            +
                      "netmask": "255.255.255.0",
         | 
| 72 | 
            +
                      "duplex": "FULL",
         | 
| 73 | 
            +
                      "ipv6Addr": "",
         | 
| 74 | 
            +
                      "macAddr": "AE:B2:F8:20:01:16",
         | 
| 75 | 
            +
                      "dhcpEnabled": true,
         | 
| 76 | 
            +
                      "ipv4Addr": "192.168.133.41",
         | 
| 77 | 
            +
                      "type": "ETHERNET",
         | 
| 78 | 
            +
                      "slot": "eth0"
         | 
| 79 | 
            +
                    }
         | 
| 80 | 
            +
                  ],
         | 
| 81 | 
            +
                  "state": "OK",
         | 
| 82 | 
            +
                  "hostName": "chef-web02.domain.com",
         | 
| 83 | 
            +
                  "eTag": "2015-08-10T16:45:57.019Z",
         | 
| 84 | 
            +
                  "category": "os-deployment-servers"
         | 
| 85 | 
            +
                },
         | 
| 86 | 
            +
                {
         | 
| 87 | 
            +
                  "modified": "2015-08-10T04:55:27.017Z",
         | 
| 88 | 
            +
                  "deviceGroups": null,
         | 
| 89 | 
            +
                  "customAttributes": [],
         | 
| 90 | 
            +
                  "created": "2015-08-10T04:35:40.000Z",
         | 
| 91 | 
            +
                  "uuid": "7d805e1c-beac-e84e-868b-2fb0b6504474",
         | 
| 92 | 
            +
                  "cpus": [
         | 
| 93 | 
            +
                    {
         | 
| 94 | 
            +
                      "cacheSize": "15360",
         | 
| 95 | 
            +
                      "speed": "1200",
         | 
| 96 | 
            +
                      "stepping": "7",
         | 
| 97 | 
            +
                      "model": "Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz",
         | 
| 98 | 
            +
                      "family": "X64",
         | 
| 99 | 
            +
                      "status": "ON-LINE",
         | 
| 100 | 
            +
                      "slot": "0"
         | 
| 101 | 
            +
                    }
         | 
| 102 | 
            +
                  ],
         | 
| 103 | 
            +
                  "ilo": null,
         | 
| 104 | 
            +
                  "serverLocation": {
         | 
| 105 | 
            +
                    "rack": "DemoRack",
         | 
| 106 | 
            +
                    "enclosure": "dazzle",
         | 
| 107 | 
            +
                    "bay": "2"
         | 
| 108 | 
            +
                  },
         | 
| 109 | 
            +
                  "operatingSystemVersion": null,
         | 
| 110 | 
            +
                  "opswLifecycle": "MANAGED",
         | 
| 111 | 
            +
                  "osSPVersion": null,
         | 
| 112 | 
            +
                  "peerIP": "192.168.133.36",
         | 
| 113 | 
            +
                  "stage": "UNKNOWN",
         | 
| 114 | 
            +
                  "running": "false",
         | 
| 115 | 
            +
                  "reporting": true,
         | 
| 116 | 
            +
                  "storageDevices": [],
         | 
| 117 | 
            +
                  "ram": "16291780",
         | 
| 118 | 
            +
                  "swap": "8216568",
         | 
| 119 | 
            +
                  "architecture": null,
         | 
| 120 | 
            +
                  "defaultGateway": "16.125.32.1",
         | 
| 121 | 
            +
                  "discoveredDate": "2015-08-10T04:35:39.000Z",
         | 
| 122 | 
            +
                  "facility": "Appliance",
         | 
| 123 | 
            +
                  "hardwareModel": "PROLIANT BL460C GEN8",
         | 
| 124 | 
            +
                  "jobsHistory": null,
         | 
| 125 | 
            +
                  "lastScannedDate": null,
         | 
| 126 | 
            +
                  "loopbackIP": null,
         | 
| 127 | 
            +
                  "managementIP": "192.168.133.36",
         | 
| 128 | 
            +
                  "manufacturer": "HP",
         | 
| 129 | 
            +
                  "mid": "1670001",
         | 
| 130 | 
            +
                  "netBios": null,
         | 
| 131 | 
            +
                  "operatingSystem": null,
         | 
| 132 | 
            +
                  "osFlavor": null,
         | 
| 133 | 
            +
                  "serialNumber": "VCGE9KB041",
         | 
| 134 | 
            +
                  "locale": null,
         | 
| 135 | 
            +
                  "description": null,
         | 
| 136 | 
            +
                  "status": "OK",
         | 
| 137 | 
            +
                  "uri": "/rest/os-deployment-servers/1670001",
         | 
| 138 | 
            +
                  "name": "chef-web01.domain.com",
         | 
| 139 | 
            +
                  "interfaces": [
         | 
| 140 | 
            +
                    {
         | 
| 141 | 
            +
                      "speed": "10000",
         | 
| 142 | 
            +
                      "netmask": "255.255.254.0",
         | 
| 143 | 
            +
                      "duplex": "FULL",
         | 
| 144 | 
            +
                      "ipv6Addr": "",
         | 
| 145 | 
            +
                      "macAddr": "AE:B2:F8:20:01:15",
         | 
| 146 | 
            +
                      "dhcpEnabled": false,
         | 
| 147 | 
            +
                      "ipv4Addr": "16.125.32.38",
         | 
| 148 | 
            +
                      "type": "ETHERNET",
         | 
| 149 | 
            +
                      "slot": "eth1"
         | 
| 150 | 
            +
                    },
         | 
| 151 | 
            +
                    {
         | 
| 152 | 
            +
                      "speed": "10000",
         | 
| 153 | 
            +
                      "netmask": "255.255.255.0",
         | 
| 154 | 
            +
                      "duplex": "FULL",
         | 
| 155 | 
            +
                      "ipv6Addr": "",
         | 
| 156 | 
            +
                      "macAddr": "AE:B2:F8:20:01:14",
         | 
| 157 | 
            +
                      "dhcpEnabled": true,
         | 
| 158 | 
            +
                      "ipv4Addr": "192.168.133.36",
         | 
| 159 | 
            +
                      "type": "ETHERNET",
         | 
| 160 | 
            +
                      "slot": "eth0"
         | 
| 161 | 
            +
                    }
         | 
| 162 | 
            +
                  ],
         | 
| 163 | 
            +
                  "state": "OK",
         | 
| 164 | 
            +
                  "hostName": "chef-web01.domain.com",
         | 
| 165 | 
            +
                  "eTag": "2015-08-10T04:55:27.017Z",
         | 
| 166 | 
            +
                  "category": "os-deployment-servers"
         | 
| 167 | 
            +
                }
         | 
| 168 | 
            +
              ],
         | 
| 169 | 
            +
              "start": 0,
         | 
| 170 | 
            +
              "prevPageUri": null,
         | 
| 171 | 
            +
              "nextPageUri": null,
         | 
| 172 | 
            +
              "total": 2,
         | 
| 173 | 
            +
              "count": 2,
         | 
| 174 | 
            +
              "modified": null,
         | 
| 175 | 
            +
              "eTag": null,
         | 
| 176 | 
            +
              "created": null,
         | 
| 177 | 
            +
              "category": null,
         | 
| 178 | 
            +
              "uri": null
         | 
| 179 | 
            +
            }
         |