Skip to content

Commit 1d00867

Browse files
committed
Refactor storage codeblock in launch flow
Signed-off-by: Manjunath-A-C <[email protected]>
1 parent 5871cef commit 1d00867

File tree

6 files changed

+141
-120
lines changed

6 files changed

+141
-120
lines changed

cli/cmd/launch.py

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -125,83 +125,89 @@ def _launch(config, cookies, sys_uuid, vios_uuids):
125125
logger.info("Installation ISOs attached to the partition")
126126

127127
logger.info("Setting up storage")
128-
# Re-run scenario: Check if physical disk or virtual disk is already attached to partition
128+
setup_storage(config, cookies, active_vios_servers, sys_uuid, partition_uuid)
129+
130+
lpar_state = activation.check_lpar_status(config, cookies, partition_uuid)
131+
if lpar_state != "running":
132+
logger.debug("Setting partition bootstring as 'cd/dvd-all'")
133+
partition_payload = partition.get_partition_details(
134+
config, cookies, sys_uuid, partition_uuid)
135+
partition.set_partition_boot_string(
136+
config, cookies, sys_uuid, partition_uuid, partition_payload, "cd/dvd-all")
137+
138+
logger.info("Activating the partition")
139+
activation.activate_partition(config, cookies, partition_uuid)
140+
logger.info("Partition activated")
141+
142+
logger.info("Monitoring boot process, this will take a while")
143+
monitor_util.monitor_bootstrap_boot(config)
144+
monitor_util.monitor_pim(config)
145+
except (AIAppError, AuthError, NetworkError, PartitionError, StorageError, VIOSError, paramiko.SSHException, Exception) as e:
146+
raise e
147+
148+
def setup_storage(config, cookies, active_vios, sys_uuid, lpar_id):
149+
try:
150+
# Re-run scenario: Check if physical disk/virtualdisk/SAN storage(VFC) is already attached to partition
129151
storage_attached = False
130-
for a_vios_uuid, a_vios in active_vios_servers.items():
152+
for a_vios_uuid, a_vios in active_vios.items():
131153
logger.debug(f"Checking for existing physical disk attachment in VIOS '{a_vios_uuid}'")
132154
physical_disk_found, _ = storage.check_if_storage_attached(
133-
a_vios, partition_uuid)
155+
a_vios, lpar_id)
134156
if physical_disk_found:
135157
logger.info(
136-
f"Physical disk is already attached to lpar '{partition_uuid}'")
158+
f"Physical disk is already attached to lpar '{lpar_id}'")
137159
storage_attached = True
138160
if not storage_attached:
139-
vdisk_found, vdisk_name = storage.check_if_vdisk_attached(a_vios, partition_uuid)
161+
vdisk_found, vdisk_name = vstorage.check_if_vdisk_attached(a_vios, lpar_id)
140162
if vdisk_found:
141-
logger.info(f"Virtual disk '{vdisk_name}' is already attached to lpar '{partition_uuid}'")
163+
logger.info(f"Virtual disk '{vdisk_name}' is already attached to lpar '{lpar_id}'")
142164
storage_attached = True
143165
if not storage_attached:
144166
vfc_disk_found, _ = storage.check_if_vfc_disk_attached(
145-
a_vios, partition_uuid)
167+
a_vios, lpar_id)
146168
if vfc_disk_found:
147169
logger.info(
148-
f"SAN storage(VFC) disk is already attached to lpar '{partition_uuid}'")
170+
f"SAN storage(VFC) disk is already attached to lpar '{lpar_id}'")
149171
storage_attached = True
150172

151173
vdisk_attached = False
152-
use_vdisk = util.use_virtual_disk(config)
153-
# Create and attach virtual disk to the partition
154-
if use_vdisk and not storage_attached:
155-
vios_storage_list = vios_operation.get_vios_with_physical_storage(
156-
config, active_vios_servers)
157-
if len(vios_storage_list) == 0:
158-
logger.error(
159-
"failed to find physical volume for the partition")
160-
raise StorageError(
161-
"failed to find physical volume for the partition")
162-
vios_storage_uuid = vios_storage_list[0][0]
163-
updated_vios_payload = vios_operation.get_vios_details(config, cookies, sys_uuid, vios_storage_uuid)
164-
use_existing_vd = util.use_existing_vd(config)
165-
if use_existing_vd:
166-
vstorage.attach_virtualdisk(updated_vios_payload, config, cookies, partition_uuid, sys_uuid, vios_storage_uuid)
167-
vdisk_attached = True
168-
else:
169-
# Create volume group, virtual disk and attach storage
170-
use_existing_vg = util.use_existing_vg(config)
171-
if not use_existing_vg:
172-
# Create volume group
173-
vg_id = vstorage.create_volumegroup(config, cookies, vios_storage_uuid)
174-
else:
175-
vg_id = vstorage.get_volume_group_id(config, cookies, vios_storage_uuid, util.get_volume_group_name(config))
176-
vstorage.create_virtualdisk(config, cookies, vios_storage_uuid, vg_id)
177-
updated_vios_payload = vios_operation.get_vios_details(config, cookies, sys_uuid, vios_storage_uuid)
178-
vstorage.attach_virtualdisk(updated_vios_payload, config, cookies, partition_uuid, sys_uuid, vios_storage_uuid)
179-
vdisk_attached = True
174+
if not util.use_physical_volume(config) and not storage_attached:
175+
handle_virtual_disk(config, cookies, active_vios, sys_uuid, lpar_id)
176+
vdisk_attached = True
180177

181178
if not storage_attached and not vdisk_attached:
182179
vios_storage_list = vios_operation.get_vios_with_physical_storage(
183-
config, active_vios_servers)
180+
config, active_vios)
184181
if len(vios_storage_list) == 0:
185182
logger.error(
186183
"failed to find physical volume for the partition")
187184
raise StorageError(
188185
"failed to find physical volume for the partition")
189186
storage.attach_physical_storage(
190-
config, cookies, sys_uuid, partition_uuid, vios_storage_list)
191-
192-
partition_payload = partition.get_partition_details(
193-
config, cookies, sys_uuid, partition_uuid)
194-
logger.debug("Setting partition bootstring as 'cd/dvd-all'")
195-
partition.set_partition_boot_string(
196-
config, cookies, sys_uuid, partition_uuid, partition_payload, "cd/dvd-all")
187+
config, cookies, sys_uuid, lpar_id, vios_storage_list)
188+
except (StorageError, VIOSError, Exception) as e:
189+
raise e
197190

198-
logger.info("Activating the partition")
199-
activation.activate_partition(config, cookies, partition_uuid)
200-
logger.info("Partition activated")
191+
def handle_virtual_disk(config, cookies, active_vios, sys_uuid, lpar_id):
192+
try:
193+
vios_storage_list = vios_operation.get_vios_with_physical_storage(
194+
config, active_vios)
195+
if len(vios_storage_list) == 0:
196+
logger.error("failed to find physical volume for the partition")
197+
raise StorageError("failed to find physical volume for the partition")
198+
vios_storage_uuid = vios_storage_list[0][0]
199+
updated_vios_payload = vios_operation.get_vios_details(config, cookies, sys_uuid, vios_storage_uuid)
200+
201+
# Check if virtual storage already exists under the given volumegroup
202+
vg_id = vstorage.get_volume_group_id(config, cookies, vios_storage_uuid, util.get_volume_group_name(config))
203+
found, _, _ = vstorage.check_if_vdisk_exists(config, cookies, vios_storage_uuid, vg_id, util.get_virtual_disk_name(config))
204+
# Create virtualdisk only if it doesn't exist under volumegroup
205+
if not found:
206+
vstorage.create_virtualdisk(config, cookies, vios_storage_uuid, vg_id)
207+
updated_vios_payload = vios_operation.get_vios_details(config, cookies, sys_uuid, vios_storage_uuid)
201208

202-
logger.info("Monitoring boot process, this will take a while")
203-
monitor_util.monitor_bootstrap_boot(config)
204-
monitor_util.monitor_pim(config)
205-
except (AIAppError, AuthError, NetworkError, PartitionError, StorageError, VIOSError, paramiko.SSHException, Exception) as e:
209+
vstorage.attach_virtualdisk(updated_vios_payload, config, cookies, lpar_id, sys_uuid, vios_storage_uuid)
210+
except (StorageError, VIOSError, Exception) as e:
206211
raise e
207-
212+
logger.info(f"virtualdisk is attached to parition '{lpar_id}' successfully")
213+
return

cli/storage/storage.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -67,34 +67,6 @@ def check_if_storage_attached(vios, partition_uuid):
6767
raise e
6868
return found, phys_disk
6969

70-
def check_if_vdisk_attached(vios, partition_uuid):
71-
found = False
72-
vdisk = ""
73-
if partition_uuid == "":
74-
return found, vdisk
75-
76-
try:
77-
soup = BeautifulSoup(vios, 'xml')
78-
scsi_mappings = soup.find_all('VirtualSCSIMapping')
79-
# Iterate over all SCSI mappings and look for Storage followed by VirtualDisk XML tags
80-
for scsi in scsi_mappings:
81-
lpar_link = scsi.find("AssociatedLogicalPartition")
82-
if lpar_link is not None and partition_uuid in lpar_link.attrs["href"]:
83-
storage = scsi.find("Storage")
84-
if storage is not None:
85-
logical_vol = storage.find("VirtualDisk")
86-
if logical_vol is not None:
87-
logger.debug(
88-
f"Found virtual disk SCSI mapping for partition '{partition_uuid}' in VIOS")
89-
found = True
90-
vdisk = logical_vol.find("DiskName").text
91-
break
92-
except Exception as e:
93-
logger.error(
94-
"failed to check if storage SCSI mapping is present in VIOS")
95-
raise e
96-
return found, vdisk
97-
9870
def check_if_vfc_disk_attached(vios, partition_uuid):
9971
found = False
10072
portname = ""

cli/storage/virtual_storage.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,64 @@ def get_volume_group_details(config, cookies, vios_uuid, vg_id):
130130
vol_group_details = str(soup.find("VolumeGroup"))
131131
return vol_group_details
132132

133+
def check_if_vdisk_attached(vios, partition_uuid):
134+
found = False
135+
vdisk = ""
136+
if partition_uuid == "":
137+
return found, vdisk
138+
139+
try:
140+
soup = BeautifulSoup(vios, 'xml')
141+
scsi_mappings = soup.find_all('VirtualSCSIMapping')
142+
# Iterate over all SCSI mappings and look for Storage followed by VirtualDisk XML tags
143+
for scsi in scsi_mappings:
144+
lpar_link = scsi.find("AssociatedLogicalPartition")
145+
if lpar_link is not None and partition_uuid in lpar_link.attrs["href"]:
146+
storage = scsi.find("Storage")
147+
if storage is not None:
148+
logical_vol = storage.find("VirtualDisk")
149+
if logical_vol is not None:
150+
logger.debug(
151+
f"Found virtual disk SCSI mapping for partition '{partition_uuid}' in VIOS")
152+
found = True
153+
vdisk = logical_vol.find("DiskName").text
154+
break
155+
except Exception as e:
156+
logger.error(
157+
"failed to check if storage SCSI mapping is present in VIOS")
158+
raise e
159+
return found, vdisk
160+
161+
# Checks if virtualdisk is created under a given volumegroup
162+
def check_if_vdisk_exists(config, cookies, vios_uuid, vg_id, vdisk):
163+
try:
164+
url = f"https://{util.get_host_address(config)}/rest/api/uom/VirtualIOServer/{vios_uuid}/VolumeGroup/{vg_id}"
165+
headers = {"x-api-key": util.get_session_key(
166+
config), "Content-Type": "application/vnd.ibm.powervm.uom+xml; type=VolumeGroup"}
167+
response = requests.get(url, headers=headers,
168+
cookies=cookies, verify=False)
169+
if response.status_code != 200:
170+
logger.error(
171+
f"failed to get volumegroup details, error: {response.text}")
172+
raise Exception(
173+
f"failed to get volumegroup details, error: {response.text}")
174+
soup = BeautifulSoup(response.text, 'xml')
175+
176+
# remove virtual disk
177+
volume_group = soup.find("VolumeGroup")
178+
vdisks = soup.find_all("VirtualDisk")
179+
present = False
180+
virt_disk_xml = None
181+
for disk in vdisks:
182+
disk_name = disk.find("DiskName")
183+
if disk_name is not None and disk_name.text == vdisk:
184+
present = True
185+
virt_disk_xml = disk
186+
break
187+
except Exception as e:
188+
raise e
189+
return present, virt_disk_xml, volume_group
190+
133191
def create_virtualdisk(config, cookies, vios_uuid, vg_id):
134192
# Get Volume group details
135193
vg_details = get_volume_group_details(config, cookies, vios_uuid, vg_id)

cli/utils/command_util.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
from bs4 import BeautifulSoup
44

55
import cli.auth.auth as auth
6+
import cli.storage.storage as storage
7+
import cli.storage.virtual_storage as vstorage
68
import cli.utils.common as common
79
import cli.utils.validator as validator
810
import cli.utils.string_util as util
911
import cli.utils.iso_util as iso_util
1012
import cli.vios.vios as vios_operation
11-
import cli.storage.storage as storage
13+
1214

1315
logger = common.get_logger("command-util")
1416

@@ -79,27 +81,16 @@ def remove_vopt_device(config, cookies, vios, vopt_name):
7981

8082
def remove_virtual_disk(config, cookies, vios_uuid, vg_id, vdisk):
8183
try:
82-
url = f"https://{util.get_host_address(config)}/rest/api/uom/VirtualIOServer/{vios_uuid}/VolumeGroup/{vg_id}"
83-
headers = {"x-api-key": util.get_session_key(
84-
config), "Content-Type": "application/vnd.ibm.powervm.uom+xml; type=VolumeGroup"}
85-
response = requests.get(url, headers=headers,
86-
cookies=cookies, verify=False)
87-
if response.status_code != 200:
88-
logger.error(
89-
f"failed to get volumegroup details, error: {response.text}")
90-
raise Exception(
91-
f"failed to get volumegroup details, error: {response.text}")
92-
soup = BeautifulSoup(response.text, 'xml')
93-
94-
# remove virtual disk
95-
vdisks = soup.find_all("VirtualDisk")
96-
for disk in vdisks:
97-
disk_name = disk.find("DiskName")
98-
if disk_name is not None and disk_name.text == vdisk:
99-
disk.decompose()
100-
101-
# Get VolumeGroup XML payload after dropping virtualdisk
102-
vg = soup.find("VolumeGroup")
84+
found, vdisk, vg = vstorage.check_if_vdisk_exists(config, cookies, vios_uuid, vdisk)
85+
if not found:
86+
logger.debug(f"No virtualdisk '{vdisk}' is found under volumegroup")
87+
return
88+
# drop virtualdisk xml block
89+
vdisk.decompose()
90+
91+
uri = f"/rest/api/uom/VirtualIOServer/{vios_uuid}/VolumeGroup/{vg_id}"
92+
hmc_host = util.get_host_address(config)
93+
url = "https://" + hmc_host + uri
10394
headers = {"x-api-key": util.get_session_key(
10495
config), "Content-Type": "application/vnd.ibm.powervm.uom+xml; type=VolumeGroup"}
10596
response = requests.post(url, data=str(vg),

cli/utils/string_util.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,22 +113,16 @@ def get_ssh_pub_key(config):
113113

114114
# storage related Getters
115115
def get_volume_group_name(config):
116-
return config["partition"]["storage"]["vg_name"]
116+
return config["virtual-disk"]["vg_name"]
117117

118118
def get_virtual_disk_name(config):
119-
return config["partition"]["storage"]["vdisk_name"]
119+
return config["virtual-disk"]["vdisk_name"]
120120

121-
def use_virtual_disk(config):
122-
return config["partition"]["storage"].as_bool("use_virtual_disk")
123-
124-
def use_existing_vd(config):
125-
return config["partition"]["storage"].as_bool("use_existing_vd")
126-
127-
def use_existing_vg(config):
128-
return config["partition"]["storage"].as_bool("use_existing_vg")
121+
def use_physical_volume(config):
122+
return config["partition"]["storage"].as_bool("use_physical_volume")
129123

130124
def get_virtual_disk_size(config):
131-
return config["partition"]["storage"]["vdisk_size"]
125+
return config["virtual-disk"]["vdisk_size"]
132126

133127
def get_required_disk_size(config):
134128
return config["partition"]["storage"]["size"]

config.ini

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,8 @@
5757
nameserver = ""
5858
[[storage]]
5959
size = "120"
60-
use_virtual_disk = False
61-
# Populate below parameters if virtual disk needs to be attached to PIM partition
62-
vdisk_name = ""
63-
vdisk_size = ""
64-
use_existing_vd = False
65-
use_existing_vg = True
66-
vg_name = ""
60+
# set below attribute to 'false' if virtual disk needs to be created and attached to PIM partition
61+
use_physical_volume = true
6762

6863
# Advanced configs
6964
[custom-flavor]
@@ -86,6 +81,11 @@
8681
max-memory = 32
8782
desired-memory = 32
8883
min-memory = 10
84+
[virtual-disk]
85+
# Populate below parameters if virtual disk needs to be attached to PIM partition
86+
vdisk_name = ""
87+
vdisk_size = ""
88+
vg_name = ""
8989
[ssh]
9090
user-name = "pim"
9191
pub-key-file = ""

0 commit comments

Comments
 (0)