Implement config drive build/attach on spawn

Provides the config drive build and subsequent attach to the VM.

This is a non-optimized version in terms of grouping together VIOS
updates.  Optimization will occur within another changeset.

This does not yet handle the rollback capabilities.  That will be
handled in another change set.

Change-Id: Id885a696bc854a9f94f6d913aeda197f4d7cd1a2
This commit is contained in:
Drew Thorstensen 2015-01-21 11:40:22 -06:00
parent 05d2f314ec
commit 5a48a29b5c
8 changed files with 1002 additions and 5 deletions

View File

@ -0,0 +1,539 @@
# Copyright 2015 IBM Corp.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
####################################################
# THIS IS AN AUTOMATICALLY GENERATED FILE
# DO NOT EDIT. ANY EDITS WILL BE LOST ON NEXT UPDATE
#
# To update file, run: create_httpresp.py -refresh fake_volume_group.txt
#
####################################################
INFO{
{'comment': 'Used for testing test_volume_group.', 'status': 200, 'pw': 'Passw0rd', 'reason': 'OK', 'host': '9.1.2.3', 'user': 'hscroot', 'path': 'VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup'}
END OF SECTION}
HEADERS{
{'content-length': '2927', 'x-powered-by': 'Servlet/3.0', 'set-cookie': 'JSESSIONID=0000NDn35hM1wmiEggkwHYt86o5:375f7c5b-d5fc-4d80-91de-1d4d29170e01; Path=/; Secure; HttpOnly', 'x-hmc-schema-version': 'V1_1_0', 'expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'last-modified': 'Thu, 18 Sep 2014 07:04:42 GMT', 'x-transaction-id': 'XT10023645', 'etag': '249747277', 'cache-control': 'no-transform, must-revalidate, proxy-revalidate, no-cache=set-cookie', 'date': 'Thu, 18 Sep 2014 07:04:42 GMT', 'content-type': 'application/atom+xml'}
END OF SECTION}
BODY{
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:ns2="http://a9.com/-/spec/opensearch/1.1/" xmlns:ns3="http://www.w3.org/1999/xhtml">
<id>8070198f-b358-3b26-a144-1b268cf6f8d4</id>
<updated>2015-01-22T04:15:33.346Z</updated>
<link rel="SELF" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup"/>
<link rel="MANAGEMENT_CONSOLE" href="https://9.1.2.3:12443/rest/api/uom/ManagementConsole/6c1b9d4a-afc1-3cef-ae54-1977d908fda4"/>
<generator>IBM Power Systems Management Console</generator>
<entry>
<id>1e46bbfd-73b6-3c2a-aeab-a1d3f065e92f</id>
<title>VolumeGroup</title>
<published>2015-01-22T04:15:33.810Z</published>
<link rel="SELF" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/1e46bbfd-73b6-3c2a-aeab-a1d3f065e92f"/>
<author>
<name>IBM Power Systems Management Console</name>
</author>
<etag:etag xmlns:etag="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/">-762288609</etag:etag>
<content type="application/vnd.ibm.powervm.uom+xml; type=VolumeGroup">
<VolumeGroup:VolumeGroup xmlns:VolumeGroup="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns:ns2="http://www.w3.org/XML/1998/namespace/k2" schemaVersion="V1_2_0">
<Metadata>
<Atom>
<AtomID>1e46bbfd-73b6-3c2a-aeab-a1d3f065e92f</AtomID>
<AtomCreated>1421883668662</AtomCreated>
</Atom>
</Metadata>
<AvailableSize kb="ROR" kxe="false">1033</AvailableSize>
<FreeSpace kxe="false" kb="ROR">1033</FreeSpace>
<GroupCapacity kb="CUR" kxe="false">1064</GroupCapacity>
<GroupName kb="CUR" kxe="false">rootvg</GroupName>
<GroupSerialID kb="ROR" kxe="false">00f8d6de00004b000000014a53505d2f</GroupSerialID>
<MaximumLogicalVolumes kb="ROR" kxe="false">256</MaximumLogicalVolumes>
<PhysicalVolumes kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<PhysicalVolume schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<Description kb="CUD" kxe="false">SAS RAID 0 Disk Array</Description>
<LocationCode kb="ROR" kxe="false">U78C9.001.WZS0095-P1-C14-R1-L205D828300-L0</LocationCode>
<ReservePolicy kb="CUD" kxe="false">NoReserve</ReservePolicy>
<ReservePolicyAlgorithm kb="CUD" kxe="false">Failover</ReservePolicyAlgorithm>
<UniqueDeviceID kb="ROR" kxe="false">01MUlCTSAgICAgSVBSLTAgICA1RDgyODMwMDAwMDAwMDIw</UniqueDeviceID>
<AvailableForUsage kb="CUD" kxe="false">false</AvailableForUsage>
<VolumeCapacity kb="CUR" kxe="false">1089592</VolumeCapacity>
<VolumeName kb="CUR" kxe="false">hdisk0</VolumeName>
<VolumeState kb="ROR" kxe="false">active</VolumeState>
<VolumeUniqueID kb="ROR" kxe="false">391BIBMIPR-0 5D8283000000002010IPR-0 5D82830003IBMsas</VolumeUniqueID>
<IsFibreChannelBacked kb="ROR" kxe="false">false</IsFibreChannelBacked>
</PhysicalVolume>
</PhysicalVolumes>
<UniqueDeviceID kb="ROR" kxe="false">0400f8d6de00004b000000014a53505d2f</UniqueDeviceID>
<VirtualDisks kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
</VirtualDisks>
</VolumeGroup:VolumeGroup>
</content>
</entry>
<entry>
<id>b6bdbf1f-eddf-3c81-8801-9859eb6fedcb</id>
<title>VolumeGroup</title>
<published>2015-01-22T04:15:33.816Z</published>
<link rel="SELF" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb"/>
<author>
<name>IBM Power Systems Management Console</name>
</author>
<etag:etag xmlns:etag="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/">71932090</etag:etag>
<content type="application/vnd.ibm.powervm.uom+xml; type=VolumeGroup">
<VolumeGroup:VolumeGroup xmlns:VolumeGroup="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns="http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/" xmlns:ns2="http://www.w3.org/XML/1998/namespace/k2" schemaVersion="V1_2_0">
<Metadata>
<Atom>
<AtomID>b6bdbf1f-eddf-3c81-8801-9859eb6fedcb</AtomID>
<AtomCreated>1421883668662</AtomCreated>
</Atom>
</Metadata>
<AvailableSize kb="ROR" kxe="false">997</AvailableSize>
<FreeSpace kxe="false" kb="ROR">997</FreeSpace>
<GroupCapacity kb="CUR" kxe="false">1063</GroupCapacity>
<GroupName kb="CUR" kxe="false">image_pool</GroupName>
<GroupSerialID kb="ROR" kxe="false">00f8d6de00004b000000014a54555cd9</GroupSerialID>
<MaximumLogicalVolumes kb="ROR" kxe="false">1024</MaximumLogicalVolumes>
<MediaRepositories kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<VirtualMediaRepository schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<OpticalMedia kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">asdcv_3bc2b715_userID_config.iso</MediaName>
<MediaUDID kb="ROR" kxe="false">0easdcv_3bc2b715_userID_config.iso</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.000000</Size>
</VirtualOpticalMedia>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">asdf_c3f7b1e7_userID_config.iso</MediaName>
<MediaUDID kb="ROR" kxe="false">0easdf_c3f7b1e7_userID_config.iso</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.000000</Size>
</VirtualOpticalMedia>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">blank_media1</MediaName>
<MediaUDID kb="ROR" kxe="false">0eblank_media1</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.0977</Size>
</VirtualOpticalMedia>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">blank_media_2</MediaName>
<MediaUDID kb="ROR" kxe="false">0eblank_media_2</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.0488</Size>
</VirtualOpticalMedia>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">cirros_eea81ef4_userID_config.iso</MediaName>
<MediaUDID kb="ROR" kxe="false">0ecirros_eea81ef4_userID_config.iso</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.000000</Size>
</VirtualOpticalMedia>
<VirtualOpticalMedia schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<MediaName kb="CUR" kxe="false">test_aix_17cbd370_userID_config.iso</MediaName>
<MediaUDID kb="ROR" kxe="false">0etest_aix_17cbd370_userID_config.iso</MediaUDID>
<MountType kb="CUD" kxe="false">rw</MountType>
<Size kb="CUR" kxe="false">0.000000</Size>
</VirtualOpticalMedia>
</OpticalMedia>
<RepositoryName kb="CUR" kxe="false">VMLibrary</RepositoryName>
<RepositorySize kb="CUR" kxe="false">11</RepositorySize>
</VirtualMediaRepository>
</MediaRepositories>
<PhysicalVolumes kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<PhysicalVolume schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<Description kb="CUD" kxe="false">SAS RAID 0 Disk Array</Description>
<LocationCode kb="ROR" kxe="false">U78C9.001.WZS0095-P1-C14-R1-L405D828300-L0</LocationCode>
<ReservePolicy kb="CUD" kxe="false">NoReserve</ReservePolicy>
<ReservePolicyAlgorithm kb="CUD" kxe="false">Failover</ReservePolicyAlgorithm>
<UniqueDeviceID kb="ROR" kxe="false">01MUlCTSAgICAgSVBSLTAgICA1RDgyODMwMDAwMDAwMDQw</UniqueDeviceID>
<AvailableForUsage kb="CUD" kxe="false">false</AvailableForUsage>
<VolumeCapacity kb="CUR" kxe="false">1089592</VolumeCapacity>
<VolumeName kb="CUR" kxe="false">hdisk1</VolumeName>
<VolumeState kb="ROR" kxe="false">active</VolumeState>
<VolumeUniqueID kb="ROR" kxe="false">391BIBMIPR-0 5D8283000000004010IPR-0 5D82830003IBMsas</VolumeUniqueID>
<IsFibreChannelBacked kb="ROR" kxe="false">false</IsFibreChannelBacked>
</PhysicalVolume>
</PhysicalVolumes>
<UniqueDeviceID kb="ROR" kxe="false">0400f8d6de00004b000000014a54555cd9</UniqueDeviceID>
<VirtualDisks kb="CUD" kxe="false" schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_b853fd66</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.20</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_df4029a6</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.21</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_e0dd0297</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.22</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">5</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_17cbd370</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.23</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_d2d886e1</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.24</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_947a017f</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.25</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_810f7730</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.26</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_9f5befd2</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.27</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_9699a0f5</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.28</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_d50cd8e4</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.29</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_540240c8</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.30</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_16eea13e</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.31</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_37e3c8d3</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.32</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_f07b23e2</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.10</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_6ec6f2cd</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.33</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_9306783f</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.11</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">efried0.207216</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.12</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">asdf</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.1</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_925c5fa3</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.13</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_a919a184</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.3</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">10</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">aix_disk1</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.14</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">10</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">aix_disk2</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.15</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">2</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">asdf2</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.4</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_30a56789</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.5</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_26610873</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.16</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_42364069</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.6</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_c3f7b1e7</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.17</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_96654a43</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.7</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_1ecdfefc</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.18</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_b2460263</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.19</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_bef997cd</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.8</UniqueDeviceID>
</VirtualDisk>
<VirtualDisk schemaVersion="V1_2_0">
<Metadata>
<Atom/>
</Metadata>
<DiskCapacity kb="CUR" kxe="false">1</DiskCapacity>
<DiskLabel kb="CUR" kxe="false">None</DiskLabel>
<DiskName kb="CUR" kxe="false">boot_21e1de68</DiskName>
<VolumeGroup kb="ROR" kxe="false" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup/b6bdbf1f-eddf-3c81-8801-9859eb6fedcb" rel="related"/>
<UniqueDeviceID kb="ROR" kxe="false">0300f8d6de00004b000000014a54555cd9.9</UniqueDeviceID>
</VirtualDisk>
</VirtualDisks>
</VolumeGroup:VolumeGroup>
</content>
</entry>
</feed>
END OF SECTION}

View File

@ -0,0 +1,42 @@
# Copyright 2015 IBM Corp.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
####################################################
# THIS IS AN AUTOMATICALLY GENERATED FILE
# DO NOT EDIT. ANY EDITS WILL BE LOST ON NEXT UPDATE
#
# To update file, run: create_httpresp.py -refresh fake_volume_group.txt
#
####################################################
INFO{
{'comment': 'Used for testing test_volume_group.', 'status': 200, 'pw': 'Passw0rd', 'reason': 'OK', 'host': '9.1.2.3', 'user': 'hscroot', 'path': 'VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup'}
END OF SECTION}
HEADERS{
{'content-length': '2927', 'x-powered-by': 'Servlet/3.0', 'set-cookie': 'JSESSIONID=0000NDn35hM1wmiEggkwHYt86o5:375f7c5b-d5fc-4d80-91de-1d4d29170e01; Path=/; Secure; HttpOnly', 'x-hmc-schema-version': 'V1_1_0', 'expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'last-modified': 'Thu, 18 Sep 2014 07:04:42 GMT', 'x-transaction-id': 'XT10023645', 'etag': '249747277', 'cache-control': 'no-transform, must-revalidate, proxy-revalidate, no-cache=set-cookie', 'date': 'Thu, 18 Sep 2014 07:04:42 GMT', 'content-type': 'application/atom+xml'}
END OF SECTION}
BODY{
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:ns2="http://a9.com/-/spec/opensearch/1.1/" xmlns:ns3="http://www.w3.org/1999/xhtml">
<id>8070198f-b358-3b26-a144-1b268cf6f8d4</id>
<updated>2015-01-22T04:15:33.346Z</updated>
<link rel="SELF" href="https://9.1.2.3:12443/rest/api/uom/VirtualIOServer/14B854F7-42CE-4FF0-BD57-1D117054E701/VolumeGroup"/>
<link rel="MANAGEMENT_CONSOLE" href="https://9.1.2.3:12443/rest/api/uom/ManagementConsole/6c1b9d4a-afc1-3cef-ae54-1977d908fda4"/>
<generator>IBM Power Systems Management Console</generator>
</feed>
END OF SECTION}

View File

@ -123,13 +123,14 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova_powervm.virt.powervm.host.find_entry_by_mtm_serial')
@mock.patch('nova_powervm.virt.powervm.vm.crt_lpar')
@mock.patch('nova_powervm.virt.powervm.vm.UUIDCache')
@mock.patch('nova.virt.configdrive.required_by')
@mock.patch('nova.context.get_admin_context')
@mock.patch('nova.objects.flavor.Flavor.get_by_id')
@mock.patch('nova_powervm.virt.powervm.localdisk.LocalStorage')
@mock.patch('pypowervm.jobs.power.power_on')
def test_spawn_ops(self, mock_pwron, mock_disk, mock_get_flv, mock_get_ctx,
mock_uuidcache, mock_crt, mock_find, mock_apt,
mock_sess):
mock_cfg_drv, mock_uuidcache, mock_crt, mock_find,
mock_apt, mock_sess):
"""Validates the PowerVM driver operations."""
drv = driver.PowerVMDriver(fake.FakeVirtAPI())
@ -141,6 +142,51 @@ class TestPowerVMDriver(test.TestCase):
my_flavor = FakeFlavor()
mock_get_flv.return_value = my_flavor
mock_crt.return_value = mock.MagicMock()
mock_cfg_drv.return_value = False
# Invoke the method.
drv.spawn('context', inst, mock.Mock(),
'injected_files', 'admin_password')
# Create LPAR was called
mock_crt.assert_called_with(mock_apt, drv.host_uuid,
inst, my_flavor)
# Power on was called
self.assertTrue(mock_pwron.called)
@mock.patch('pypowervm.adapter.Session')
@mock.patch('pypowervm.adapter.Adapter')
@mock.patch('nova_powervm.virt.powervm.host.find_entry_by_mtm_serial')
@mock.patch('nova_powervm.virt.powervm.vm.crt_lpar')
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'create_cfg_drv_vopt')
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'_validate_vopt_vg')
@mock.patch('nova_powervm.virt.powervm.vios.add_vscsi_mapping')
@mock.patch('nova_powervm.virt.powervm.vm.UUIDCache')
@mock.patch('nova.virt.configdrive.required_by')
@mock.patch('nova.context.get_admin_context')
@mock.patch('nova.objects.flavor.Flavor.get_by_id')
@mock.patch('nova_powervm.virt.powervm.localdisk.LocalStorage')
@mock.patch('pypowervm.jobs.power.power_on')
def test_spawn_with_cfg(self, mock_pwron, mock_disk, mock_get_flv,
mock_get_ctx, mock_cfg_drv, mock_val_vopt,
mock_vios_vscsi, mock_uuidcache, mock_cfg_vopt,
mock_crt, mock_find, mock_apt, mock_sess):
"""Validates the PowerVM spawn w/ config drive operations."""
drv = driver.PowerVMDriver(fake.FakeVirtAPI())
drv.init_host('FakeHost')
drv.adapter = mock_apt
# Set up the mocks to the tasks.
inst = FakeInstance()
my_flavor = FakeFlavor()
mock_get_flv.return_value = my_flavor
mock_crt.return_value = mock.MagicMock()
mock_cfg_drv.return_value = True
mock_cfg_vopt.return_value = mock.MagicMock()
mock_val_vopt.return_value = mock.MagicMock()
# Invoke the method.
drv.spawn('context', inst, mock.Mock(),
@ -158,15 +204,16 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova_powervm.virt.powervm.vm.crt_lpar')
@mock.patch('nova_powervm.virt.powervm.vm.dlt_lpar')
@mock.patch('nova_powervm.virt.powervm.vm.UUIDCache')
@mock.patch('nova.virt.configdrive.required_by')
@mock.patch('nova.context.get_admin_context')
@mock.patch('nova.objects.flavor.Flavor.get_by_id')
@mock.patch('nova_powervm.virt.powervm.localdisk.LocalStorage')
@mock.patch('pypowervm.jobs.power.power_on')
@mock.patch('pypowervm.jobs.power.power_off')
def test_spawn_ops_rollback(self, mock_pwroff, mock_pwron, mock_disk,
mock_get_flv, mock_get_ctx, mock_uuidcache,
mock_dlt, mock_crt, mock_find, mock_apt,
mock_sess):
mock_get_flv, mock_get_ctx, mock_cfg_drv,
mock_uuidcache, mock_dlt, mock_crt, mock_find,
mock_apt, mock_sess):
"""Validates the PowerVM driver operations. Will do a rollback."""
drv = driver.PowerVMDriver(fake.FakeVirtAPI())
drv.init_host('FakeHost')
@ -177,6 +224,7 @@ class TestPowerVMDriver(test.TestCase):
my_flavor = FakeFlavor()
mock_get_flv.return_value = my_flavor
mock_crt.return_value = mock.MagicMock()
mock_cfg_drv.return_value = False
# Make sure power on fails.
mock_pwron.side_effect = exc.Forbidden()

View File

@ -0,0 +1,106 @@
# Copyright 2015 IBM Corp.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import mock
from nova import test
import os
from pypowervm.tests.wrappers.util import pvmhttp
from nova_powervm.virt.powervm import media as m
VOL_GRP_DATA = 'fake_volume_group.txt'
VOL_GRP_NOVG_DATA = 'fake_volume_group_no_vg.txt'
class TestConfigDrivePowerVM(test.TestCase):
"""Unit Tests for the ConfigDrivePowerVM class.
"""
def setUp(self):
super(TestConfigDrivePowerVM, self).setUp()
# Find directory for response file(s)
data_dir = os.path.dirname(os.path.abspath(__file__))
data_dir = os.path.join(data_dir, 'data')
def resp(file_name):
file_path = os.path.join(data_dir, file_name)
return pvmhttp.load_pvm_resp(file_path).get_response()
self.vol_grp_resp = resp(VOL_GRP_DATA)
self.vol_grp_novg_resp = resp(VOL_GRP_NOVG_DATA)
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'_validate_vopt_vg')
@mock.patch('pypowervm.adapter')
@mock.patch('nova.api.metadata.base.InstanceMetadata')
@mock.patch('nova.virt.configdrive.ConfigDriveBuilder.make_drive')
def test_crt_cfg_dr_iso(self, mock_mkdrv, mock_meta, mock_adpt,
mock_vopt_valid):
"""Validates that the image creation method works."""
cfg_dr_builder = m.ConfigDrivePowerVM(mock_adpt, 'fake_host',
'fake_vios')
mock_instance = mock.MagicMock()
mock_instance.name = 'fake-instance'
mock_files = mock.MagicMock()
mock_net = mock.MagicMock()
iso_path, file_name = cfg_dr_builder._create_cfg_dr_iso(mock_instance,
mock_files,
mock_net)
self.assertEqual('fake_instance_config.iso', file_name)
self.assertEqual('/tmp/cfgdrv/fake_instance_config.iso', iso_path)
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'_create_cfg_dr_iso')
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'_validate_vopt_vg')
@mock.patch('os.path.getsize')
@mock.patch('os.remove')
@mock.patch('nova_powervm.virt.powervm.media.ConfigDrivePowerVM.'
'_upload_lv')
@mock.patch('pypowervm.wrappers.virtual_io_server.crt_scsi_map_to_vopt')
@mock.patch('pypowervm.adapter')
def test_crt_cfg_drv_vopt(self, mock_adpt, mock_vio_w, mock_upld, mock_rm,
mock_size, mock_validate, mock_cfg_iso):
# Mock Returns
mock_cfg_iso.return_value = '/tmp/cfgdrv/fake.iso', 'fake.iso'
mock_size.return_value = 10000
# Run
cfg_dr_builder = m.ConfigDrivePowerVM(mock_adpt, 'fake_host',
'fake_vios')
resp = cfg_dr_builder.create_cfg_drv_vopt(mock.MagicMock(),
mock.MagicMock(),
mock.MagicMock(),
'fake_lpar')
self.assertIsNotNone(resp)
self.assertTrue(mock_upld.called)
@mock.patch('pypowervm.adapter.Adapter')
def test_validate_opt_vg(self, mock_adpt):
mock_adpt.read.return_value = self.vol_grp_resp
cfg_dr_builder = m.ConfigDrivePowerVM(mock_adpt, 'fake_host',
'fake_vios')
self.assertEqual('1e46bbfd-73b6-3c2a-aeab-a1d3f065e92f',
cfg_dr_builder._validate_vopt_vg())
@mock.patch('pypowervm.adapter.Adapter')
def test_validate_opt_vg_fail(self, mock_adpt):
mock_adpt.read.return_value = self.vol_grp_novg_resp
self.assertRaises(m.NoMediaRepoVolumeGroupFound,
m.ConfigDrivePowerVM, mock_adpt, 'fake_host',
'fake_vios')

View File

@ -27,6 +27,19 @@ pvm_opts = [
'Value should be between 1 and 255. Represents how '
'aggressively LPARs grab CPU when unused cycles are '
'available.'),
cfg.StrOpt('vopt_media_volume_group',
default='rootvg',
help='The volume group on the system that should be used '
'for the config drive metadata that will be attached '
'to VMs.'),
cfg.IntOpt('vopt_media_rep_size',
default=1,
help='The size of the media repository in GB for the metadata '
'for config drive.'),
cfg.StrOpt('image_meta_local_path',
default='/tmp/cfgdrv/',
help='The location where the config drive ISO files should be '
'built.'),
# TODO(kyleh) Re-evaluate these as the auth model evolves.
cfg.StrOpt('pvm_host_mtms',
default='',

View File

@ -20,6 +20,7 @@ from nova import exception
from nova.i18n import _LI
from nova.objects import flavor as flavor_obj
from nova.openstack.common import log as logging
from nova.virt import configdrive
from nova.virt import driver
from oslo.config import cfg
@ -178,6 +179,16 @@ class PowerVMDriver(driver.ComputeDriver):
# Connects up the volume to the LPAR
flow.add(tf_spawn.tf_connect_vol(self.block_dvr, context, instance))
# If the config drive is needed, add those steps.
if configdrive.required_by(instance):
flow.add(tf_spawn.tf_cfg_drive(self.adapter, self.host_uuid,
self.vios_uuid, instance,
injected_files, network_info,
admin_password))
flow.add(tf_spawn.tf_connect_cfg_drive(self.adapter, instance,
self.vios_uuid,
CONF.vios_name))
# Last step is to power on the system.
# Note: If moving to a Graph Flow, will need to change to depend on
# the prior step.

View File

@ -0,0 +1,174 @@
# Copyright 2015 IBM Corp.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import abc
from nova.api.metadata import base as instance_metadata
from nova.i18n import _LE
from nova.i18n import _LI
from nova.openstack.common import log as logging
from nova.virt import configdrive
import os
from oslo.config import cfg
from pypowervm.jobs import upload_lv
from pypowervm.wrappers import constants as pvmc
from pypowervm.wrappers import virtual_io_server as vios_w
from pypowervm.wrappers import volume_group as vg
import six
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
@six.add_metaclass(abc.ABCMeta)
class AbstractMediaException(Exception):
def __init__(self, **kwargs):
msg = self.msg_fmt % kwargs
super(AbstractMediaException, self).__init__(msg)
class NoMediaRepoVolumeGroupFound(AbstractMediaException):
msg_fmt = _LE('Unable to locate the volume group %(vol_grp)s to store the '
'virtual optical media within. Since it is not rootvg, the '
'volume group must be pre-created on the VIOS.')
class ConfigDrivePowerVM(object):
def __init__(self, adapter, host_uuid, vios_uuid):
"""Creates the config drive manager for PowerVM.
:param adapter: The pypowervm adapter to communicate with the system.
:param host_uuid: The UUID of the host system.
:param vios_uuid: The VIOS UUID that contains the media repo.
"""
self.adapter = adapter
self.host_uuid = host_uuid
self.vios_uuid = vios_uuid
self.vg_uuid = self._validate_vopt_vg()
def _create_cfg_dr_iso(self, instance, injected_files, network_info,
admin_pass=None):
"""Creates an ISO file that contains the injected files. Used for
config drive.
:param instance: The VM instance from OpenStack.
:param injected_files: A list of file paths that will be injected into
the ISO.
:param network_info: The network_info from the nova spawn method.
:param admin_password: Optional password to inject for the VM.
:return iso_path: The path to the ISO
:return file_name: The file name for the ISO
"""
LOG.info(_LI("Creating config drive for instance: %s") % instance.name)
extra_md = {}
if admin_pass is not None:
extra_md['admin_pass'] = admin_pass
inst_md = instance_metadata.InstanceMetadata(instance,
content=injected_files,
extra_md=extra_md,
network_info=network_info)
# Make sure the path exists.
if not os.path.exists(CONF.image_meta_local_path):
os.mkdir(CONF.image_meta_local_path)
file_name = '%s_config.iso' % instance.name.replace('-', '_')
iso_path = os.path.join(CONF.image_meta_local_path, file_name)
with configdrive.ConfigDriveBuilder(instance_md=inst_md) as cdb:
LOG.info(_LI("Config drive ISO being built for instance %(inst)s "
"building to path %(iso_path)s.") %
{'inst': instance.name, 'iso_path': iso_path})
cdb.make_drive(iso_path)
return iso_path, file_name
def create_cfg_drv_vopt(self, instance, injected_files, network_info,
lpar_uuid, admin_pass=None):
"""Creates the config drive virtual optical. Does not attach to VM.
:param instance: The VM instance from OpenStack.
:param injected_files: A list of file paths that will be injected into
the ISO.
:param network_info: The network_info from the nova spawn method.
:param lpar_uuid: The UUID of the client LPAR
:param admin_pass: Optional password to inject for the VM.
"""
iso_path, file_name = self._create_cfg_dr_iso(instance, injected_files,
network_info, admin_pass)
# Upload the media
file_size = os.path.getsize(iso_path)
self._upload_lv(iso_path, file_name, file_size)
# Delete the media
os.remove(iso_path)
# Now that it is uploaded, create the vSCSI mappings that link this to
# the VM. Don't run the upload as these are batched in a single call
# to the VIOS later.
elem = vios_w.crt_scsi_map_to_vopt(self.adapter, self.host_uuid,
lpar_uuid, file_name)
return vios_w.VirtualSCSIMapping(elem)
def _upload_lv(self, iso_path, file_name, file_size):
with open(iso_path, 'rb') as d_stream:
upload_lv.upload_vopt(self.adapter, self.vios_uuid, d_stream,
file_name, file_size)
def _validate_vopt_vg(self):
"""Will ensure that the virtual optical media repository exists.
This method will be expensive the first time it is run. Should be
quick on subsequent restarts. Should be called on startup.
:return vg_uuid: The Volume Group UUID holding the media repo.
"""
resp = self.adapter.read(pvmc.VIOS, self.vios_uuid, pvmc.VOL_GROUP)
found_vg = None
for vg_entry in resp.feed.entries:
vol_grp = vg.VolumeGroup(vg_entry)
if vol_grp.name == CONF.vopt_media_volume_group:
found_vg = vol_grp
break
if found_vg is None:
if CONF.vopt_media_volume_group == 'rootvg':
# If left at the default of rootvg, we should create it.
# TODO(IBM) Need to implement. Need implementation in
# pypowervm api.
raise NoMediaRepoVolumeGroupFound(
vol_grp=CONF.vopt_media_volume_group)
else:
raise NoMediaRepoVolumeGroupFound(
vol_grp=CONF.vopt_media_volume_group)
# Ensure that there is a virtual optical media repository within it.
vmedia_repos = found_vg.get_vmedia_repos()
if len(vmedia_repos) == 0:
vopt_repo = vg.crt_vmedia_repo('vopt',
str(CONF.vopt_media_rep_size))
vmedia_repos = [vg.VirtualMediaRepository(vopt_repo)]
# TODO(IBM) This fails because its appending at the end...
found_vg.set_vmedia_repos(vmedia_repos)
self.adapter.update(found_vg._entry.element, resp.headers['etag'],
pvmc.VIOS, self.vios_uuid, pvmc.VOL_GROUP,
found_vg.uuid)
return found_vg.uuid

View File

@ -22,6 +22,8 @@ from pypowervm.wrappers import logical_partition as pvm_lpar
from taskflow import task
from nova_powervm.virt.powervm import media
from nova_powervm.virt.powervm import vios
from nova_powervm.virt.powervm import vm
LOG = logging.getLogger(__name__)
@ -128,6 +130,68 @@ def tf_connect_vol(block_dvr, context, instance):
requires=['lpar_crt_resp', 'vol_dev_info'])
def tf_cfg_drive(adapter, host_uuid, vios_uuid, instance, injected_files,
network_info, admin_pass):
"""Create the Task that creates the config drive.
Requires the 'lpar_crt_resp'.
Provides the 'cfg_drv_vscsi_map' which is an element to later map
the vscsi drive.
:param adapter: The adapter for the pypowervm API
:param host_uuid: The host UUID of the system.
:param vios_uuid: The VIOS UUID the drive should be put on.
:param instance: The nova instance
:param injected_files: A list of file paths that will be injected into
the ISO.
:param network_info: The network_info from the nova spawn method.
:param admin_pass: Optional password to inject for the VM.
"""
def _task(adapter, host_uuid, vios_uuid, instance, injected_files,
network_info, admin_pass, lpar_crt_resp):
LOG.info(_LI('Creating Config Drive for instance: %s') % instance.name)
lpar = pvm_lpar.LogicalPartition(lpar_crt_resp.entry)
media_builder = media.ConfigDrivePowerVM(adapter, host_uuid, vios_uuid)
vscsi_map = media_builder.create_cfg_drv_vopt(instance, injected_files,
network_info, admin_pass,
lpar.uuid)
return vscsi_map
# TODO(IBM) Need a revert here.
return task.FunctorTask(
_task, name='cfg_drive',
inject={'adapter': adapter, 'host_uuid': host_uuid,
'vios_uuid': vios_uuid, 'instance': instance,
'injected_files': injected_files,
'network_info': network_info, 'admin_pass': admin_pass},
requires=['lpar_crt_resp'],
provides='cfg_drv_vscsi_map')
def tf_connect_cfg_drive(adapter, instance, vios_uuid, vios_name):
"""Create the Task that connects the cfg drive to the instance.
Requires the 'cfg_drv_vscsi_map'.
:param adapter: The adapter for the pypowervm API
:param instance: The nova instance
:param vios_uuid: The VIOS UUID the drive should be put on.
:param vios_name: The name of the VIOS that this will be put on.
"""
def _task(adapter, instance, vios_uuid, vios_name, cfg_drv_vscsi_map):
LOG.info(_LI('Attaching Config Drive to instance: %s') % instance.name)
vios.add_vscsi_mapping(adapter, vios_uuid, vios_name,
cfg_drv_vscsi_map)
# TODO(IBM) Need a revert here.
return task.FunctorTask(
_task, name='cfg_drive_scsi_connect',
inject={'adapter': adapter, 'instance': instance,
'vios_uuid': vios_uuid, 'vios_name': vios_name},
requires=['cfg_drv_vscsi_map'])
def tf_power_on(adapter, host_uuid, instance):
"""Create the Task for the power on of the LPAR.