Maor Lipchuk has posted comments on this change.

Change subject: core, restapi: Introducing support for attaching disk snapshot
......................................................................


Patch Set 27:

(25 comments)

Almost finished all the review,looks good for now, good job.

please separate the patch for Rest, engine and GUI to ease the review.

....................................................
File 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
Line 124:         return true;
Line 125:     }
Line 126: 
Line 127:     protected Disk loadDisk(Guid diskId) {
Line 128:         if (getParameters().getSnapshotId() == null) {
just to make it more clear, I would re-factor this condition to a method and 
call it isDiskSnapshot()
Line 129:             return getDiskDao().get(diskId);
Line 130:         } else {
Line 131:             return 
getDiskImageDao().getDiskSnapshotForVmSnapshot(diskId, 
getParameters().getSnapshotId());
Line 132:         }


Line 191:         return false;
Line 192:     }
Line 193: 
Line 194:     protected boolean isHotPlugOperationSupported() {
Line 195:         if (getParameters().getSnapshotId() == null) {
same here
Line 196:             return isHotPlugSupported();
Line 197:         }
Line 198: 
Line 199:         return isHotPlugDiskSnapshotSupported();


....................................................
File 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HotPlugDiskToVmCommand.java
Line 74:     protected void performDbLoads() {
Line 75:         oldVmDevice =
Line 76:                 getVmDeviceDao().get(new 
VmDeviceId(getParameters().getDiskId(), getVmId()));
Line 77:         if (oldVmDevice != null) {
Line 78:             if (oldVmDevice.getSnapshotId() != null) {
I would refactor this condition to a method called isDiskSnapshot()
Line 79:                 disk = 
getDiskImageDao().getDiskSnapshotForVmSnapshot(getParameters().getDiskId(), 
oldVmDevice.getSnapshotId());
Line 80:             } else {
Line 81:                 disk = getDiskDao().get(getParameters().getDiskId());
Line 82:             }


....................................................
File 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
Line 452:         }
Line 453:         return result;
Line 454:     }
Line 455: 
Line 456:     public static List<DiskImage> getPluggedDisksForVm(Guid vmId) {
Why changing images to disks, we are using only filtering for images here.
Line 457:         return 
filterImageDisks(DbFacade.getInstance().getDiskDao().getAllForVm(vmId, true), 
true, false, true);
Line 458:     }
Line 459: 
Line 460:     /**


Line 480:         }
Line 481:     }
Line 482: 
Line 483:     /**
Line 484:      * Filter image disks by attributes, disk snapshots are always 
filtered out.
Why disk snapshots are always filtered out, there is a boolean which decides it.
Line 485:      *
Line 486:      *
Line 487:      * @param listOfDisks
Line 488:      *            - The list of disks to be filtered.


Line 489:      * @param allowOnlyNotShareableDisks
Line 490:      *            - Indication whether to allow only disks that are 
not shareable
Line 491:      * @param allowOnlySnapableDisks
Line 492:      *            - Indication whether to allow only disks which are 
allowed to be snapshoted.
Line 493:      * @param allowOnlyActiveDisks
Please elaborate
Line 494:      * @return - List filtered of disk images according to the given 
filters excluding disk snapshots.
Line 495:      */
Line 496:     public static List<DiskImage> filterImageDisks(Collection<? 
extends Disk> listOfDisks,
Line 497:                                                    boolean 
allowOnlyNotShareableDisks,


Line 490:      *            - Indication whether to allow only disks that are 
not shareable
Line 491:      * @param allowOnlySnapableDisks
Line 492:      *            - Indication whether to allow only disks which are 
allowed to be snapshoted.
Line 493:      * @param allowOnlyActiveDisks
Line 494:      * @return - List filtered of disk images according to the given 
filters excluding disk snapshots.
why "excluding disk snaoshots"? it is dependent on the boolean.
Line 495:      */
Line 496:     public static List<DiskImage> filterImageDisks(Collection<? 
extends Disk> listOfDisks,
Line 497:                                                    boolean 
allowOnlyNotShareableDisks,
Line 498:                                                    boolean 
allowOnlySnapableDisks,


Line 495:      */
Line 496:     public static List<DiskImage> filterImageDisks(Collection<? 
extends Disk> listOfDisks,
Line 497:                                                    boolean 
allowOnlyNotShareableDisks,
Line 498:                                                    boolean 
allowOnlySnapableDisks,
Line 499:                                                    boolean 
allowOnlyActiveDisks) {
Is this indentation is by the formatter?
Line 500:         List<DiskImage> diskImages = new ArrayList<DiskImage>();
Line 501:         for (Disk disk : listOfDisks) {
Line 502:             if (disk.getDiskStorageType() == DiskStorageType.IMAGE &&
Line 503:                     (!allowOnlyNotShareableDisks || 
!disk.isShareable()) &&


Line 501:         for (Disk disk : listOfDisks) {
Line 502:             if (disk.getDiskStorageType() == DiskStorageType.IMAGE &&
Line 503:                     (!allowOnlyNotShareableDisks || 
!disk.isShareable()) &&
Line 504:                     (!allowOnlySnapableDisks || 
disk.isAllowSnapshot()) &&
Line 505:                     (!allowOnlyActiveDisks || 
Boolean.TRUE.equals(((DiskImage)disk).getActive()))) {
I would simply use ((DiskImage)disk).getActive()
instead of Boolean.TRUE.equals(((DiskImage)disk).getActive()), it much shorter 
and nicer IMO

Also getActive is already reflects a primitive boolean so there is no risk of 
null value.
Line 506:                 diskImages.add((DiskImage) disk);
Line 507:             }
Line 508:         }
Line 509:         return diskImages;


....................................................
File 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
Line 1506:     NetworkQosSupported(536),
Line 1507: 
Line 1508:     @TypeConverterAttribute(Boolean.class)
Line 1509:     @DefaultValueAttribute("false")
Line 1510:     HotPlugDiskSnapshotSupported(525),
crucial: The is here is already in use, please find another one
Line 1511: 
Line 1512:     Invalid(65535);
Line 1513: 
Line 1514:     private int intValue;


....................................................
File backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
Line 136: VM_NOT_FOUND=VM not found
Line 137: ACTION_TYPE_FAILED_MISSED_STORAGES_FOR_SOME_DISKS=Cannot ${action} 
${type}. One or more provided storage domains are in 
maintenance/non-operational status.
Line 138: ACTION_TYPE_FAILED_STOARGE_DOMAIN_IS_WRONG=Cannot ${action} ${type}. 
Provided wrong storage domain, which is not related to disk.
Line 139: ACTION_TYPE_FAILED_VM_IN_PREVIEW=Cannot ${action} ${type}. VM is 
previewing a Snapshot.
Line 140: ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM=Cannot 
${action} ${type}. The following VM disks snapshots are attached to another 
VMs: ${disksInfo}. Please detach them from those VMs and try again.
Please see comments in the other appErrors.properties file
Line 141: ACTION_TYPE_FAILED_VM_HAS_PLUGGED_DISK_SNAPSHOT=Cannot ${action} 
${type}. The following VM activated disks are disk snapshots: ${diskAliases}, 
please deactivate them and try again.
Line 142: ACTION_TYPE_FAILED_DISKS_LOCKED=Cannot ${action} ${type}: The 
following disks are locked: ${diskAliases}. Please try again in a few minutes.
Line 143: ACTION_TYPE_FAILED_DISKS_ILLEGAL=Cannot ${action} ${type}. The 
following attached disks are in ILLEGAL status: ${diskAliases} - please remove 
them and try again.
Line 144: ACTION_TYPE_FAILED_IMPORT_DISKS_ALREADY_EXIST=Cannot ${action} 
${type}. The following disks already exist: ${diskAliases}. Please import as a 
clone.


....................................................
File 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java
Line 249:         if (node.SelectSingleNode(OvfProperties.VMD_SNAPSHOT_PROP, 
_xmlNS) != null
Line 250:                 && 
StringUtils.isNotEmpty(node.SelectSingleNode(OvfProperties.VMD_SNAPSHOT_PROP, 
_xmlNS).InnerText)) {
Line 251:             vmDevice.setSnapshotId(new 
Guid(String.valueOf(node.SelectSingleNode(OvfProperties.VMD_CUSTOM_PROP, 
_xmlNS).InnerText)));
Line 252:         } else {
Line 253:             vmDevice.setSnapshotId(null);
Isn't the snapshotId will be null be default?
Line 254:         }
Line 255: 
Line 256:         if (isManaged) {
Line 257:             vmDevice.setIsManaged(true);


....................................................
File 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HotPlugDiskVDSCommand.java
Line 42: 
Line 43:         drive.put(VdsProperties.Type, VmDeviceType.DISK.getName());
Line 44:         addAddress(drive, getParameters().getVmDevice().getAddress());
Line 45:         drive.put(VdsProperties.INTERFACE, 
disk.getDiskInterface().getName());
Line 46:         drive.put(VdsProperties.Shareable,
It will be more elegant to use as so:
 property = disk.isShareable();
 if ((vmDevice.getSnapshotId() != null && ....) {
       property =  VdsProperties.Transient
 }
 drive.put(VdsProperties.Shareable, VdsProperties.Transient)
Line 47:                 (vmDevice.getSnapshotId() != null && 
FeatureSupported.hotPlugDiskSnapshot(getParameters().getVm()
Line 48:                         .getVdsGroupCompatibilityVersion())) ? 
VdsProperties.Transient
Line 49:                         : disk.isShareable());
Line 50:         drive.put(VdsProperties.Optional, Boolean.FALSE.toString());


....................................................
File 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
Line 239:     public static final String ImageId = "imageID";
Line 240:     public static final String VolumeId = "volumeID";
Line 241:     public static final String Format = "format";
Line 242:     public static final String Shareable = "shared";
Line 243:     public static final String None = "none";
None is too general, I would use something more specific for vm device
Line 244:     public static final String Exclusive = "exclusive";
Line 245:     public static final String Shared = "shared";
Line 246:     public static final String Transient = "transient";
Line 247:     public static final String SpecParams = "specParams";


Line 241:     public static final String Format = "format";
Line 242:     public static final String Shareable = "shared";
Line 243:     public static final String None = "none";
Line 244:     public static final String Exclusive = "exclusive";
Line 245:     public static final String Shared = "shared";
There is already Shareable property , why not using it?
Line 246:     public static final String Transient = "transient";
Line 247:     public static final String SpecParams = "specParams";
Line 248:     public static final String Address = "address";
Line 249:     public static final String Alias = "alias";


....................................................
File 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
Line 269
Line 270
Line 271
Line 272
Line 273
No need to change this


Line 301: 
Line 302:                 addBootOrder(vmDevice, struct);
Line 303:                 struct.put(VdsProperties.Shareable,
Line 304:                         (vmDevice.getSnapshotId() != null && 
FeatureSupported.hotPlugDiskSnapshot(vm.getVdsGroupCompatibilityVersion())) ? 
VdsProperties.Transient
Line 305:                                 : disk.isShareable());
I think it will be more elegant to use :
 if ( (vmDevice.getSnapshotId() != null &&...) {
   struct.put(VdsProperties.Shareable,VdsProperties.Transient)
else 
   struct.put(VdsProperties.Shareable,disk.isShareable())
Line 306:                 struct.put(VdsProperties.Optional, 
Boolean.FALSE.toString());
Line 307:                 struct.put(VdsProperties.ReadOnly, 
String.valueOf(vmDevice.getIsReadOnly()));
Line 308:                 struct.put(VdsProperties.SpecParams, 
vmDevice.getSpecParams());
Line 309:                 struct.put(VdsProperties.DeviceId, 
String.valueOf(vmDevice.getId().getDeviceId()));


....................................................
File 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
Line 345: 
Line 346:     @DefaultStringValue("Cannot ${action} ${type}. VM is previewing a 
Snapshot.")
Line 347:     String ACTION_TYPE_FAILED_VM_IN_PREVIEW();
Line 348: 
Line 349:     @DefaultStringValue("Cannot ${action} ${type}. The following VM 
disks snapshots are attached to another VMs: ${disksInfo}. Please detach them 
from those VMs and try again.")
See comments in appErrors.properties
Line 350:     String 
ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM();
Line 351: 
Line 352:     @DefaultStringValue("Cannot ${action} ${type}. The following VM 
activated disks are disk snapshots: ${diskAliases}, please deactivate them and 
try again.")
Line 353:     String ACTION_TYPE_FAILED_VM_HAS_PLUGGED_DISK_SNAPSHOT();


....................................................
File 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmDiskListModel.java
Line 408:             diskModel.setVm(getEntity());
Line 409: 
Line 410:             items.add(diskModel);
Line 411: 
Line 412:             // A shared disk can only be detached
I think the comment should be changed here.
Line 413:             if (disk.getNumberOfVms() > 1 &&
Line 414:                     
!(DiskStorageType.IMAGE.equals(disk.getDiskStorageType()) && 
((DiskImage)disk).isDiskSnapshot())) {
Line 415:                 model.getLatch().setIsChangable(false);
Line 416:             }


....................................................
File 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
Line 133: VMT_CANNOT_UPDATE_ILLEGAL_FIELD=Failed updating the properties of the 
VM template.
Line 134: DIRECTORY_GROUP_CANNOT_REMOVE_DIRECTORY_GROUP_ATTACHED_TO_VM=Cannot 
remove Directory Group. Detach Directory Group from VM first.
Line 135: VM_NOT_FOUND=VM not found
Line 136: ACTION_TYPE_FAILED_VM_IN_PREVIEW=Cannot ${action} ${type}. VM is 
previewing a Snapshot.
Line 137: ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM=Cannot 
${action} ${type}. The following VM disks snapshots are attached to another 
VMs: ${disksInfo}. Please detach them from those VMs and try again.
1. /s/attached to another VMs/already attached to other VMs

2. Use new line after $(disksInfo}.
Line 138: ACTION_TYPE_FAILED_VM_HAS_PLUGGED_DISK_SNAPSHOT=Cannot ${action} 
${type}. The following VM activated disks are disk snapshots: ${diskAliases}, 
please deactivate them and try again.
Line 139: ACTION_TYPE_FAILED_DISKS_LOCKED=Cannot ${action} ${type}: The 
following disks are locked: ${diskAliases}. Please try again in a few minutes.
Line 140: ACTION_TYPE_FAILED_DISKS_ILLEGAL=Cannot ${action} ${type}. The 
following attached disks are in ILLEGAL status: ${diskAliases} - please remove 
them and try again.
Line 141: ACTION_TYPE_FAILED_IMPORT_DISKS_ALREADY_EXIST=Cannot ${action} 
${type}. The following disks already exist: ${diskAliases}. Please import as a 
clone.


Line 134: DIRECTORY_GROUP_CANNOT_REMOVE_DIRECTORY_GROUP_ATTACHED_TO_VM=Cannot 
remove Directory Group. Detach Directory Group from VM first.
Line 135: VM_NOT_FOUND=VM not found
Line 136: ACTION_TYPE_FAILED_VM_IN_PREVIEW=Cannot ${action} ${type}. VM is 
previewing a Snapshot.
Line 137: ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM=Cannot 
${action} ${type}. The following VM disks snapshots are attached to another 
VMs: ${disksInfo}. Please detach them from those VMs and try again.
Line 138: ACTION_TYPE_FAILED_VM_HAS_PLUGGED_DISK_SNAPSHOT=Cannot ${action} 
${type}. The following VM activated disks are disk snapshots: ${diskAliases}, 
please deactivate them and try again.
/s/snapshots: ${diskAliases}, please/snapshots: ${diskAliases}. please (Use dot 
instead of comma)
Line 139: ACTION_TYPE_FAILED_DISKS_LOCKED=Cannot ${action} ${type}: The 
following disks are locked: ${diskAliases}. Please try again in a few minutes.
Line 140: ACTION_TYPE_FAILED_DISKS_ILLEGAL=Cannot ${action} ${type}. The 
following attached disks are in ILLEGAL status: ${diskAliases} - please remove 
them and try again.
Line 141: ACTION_TYPE_FAILED_IMPORT_DISKS_ALREADY_EXIST=Cannot ${action} 
${type}. The following disks already exist: ${diskAliases}. Please import as a 
clone.
Line 142: ACTION_TYPE_FAILED_VM_IS_LOCKED=Cannot ${action} ${type}: VM is 
locked. Please try again in a few minutes.


....................................................
File packaging/dbscripts/all_disks_sp.sql
Line 44:       RETURN QUERY SELECT all_disks_including_snapshots.*
Line 45:       FROM all_disks_including_snapshots
Line 46:       LEFT JOIN vm_device ON vm_device.device_id = 
all_disks_including_snapshots.image_group_id AND (NOT v_only_plugged OR 
is_plugged)
Line 47:       WHERE vm_device.vm_id = v_vm_guid
Line 48:       AND ((vm_device.snapshot_id IS NULL AND 
(all_disks_including_snapshots.active != FALSE OR 
all_disks_including_snapshots.active IS NULL))
1. please switch : all_disks_including_snapshots.active != FALSE OR all_
disks_including_snapshots.active IS NULL

to all_disks_including_snapshots.active IS NOT false

2. When active can be null?
Line 49:           OR vm_device.snapshot_id = 
all_disks_including_snapshots.vm_snapshot_id)
Line 50:       AND (NOT v_is_filtered OR EXISTS (SELECT 1
Line 51:                                         FROM   
user_disk_permissions_view
Line 52:                                         WHERE  user_id = v_user_id AND 
entity_id = all_disks_including_snapshots.disk_id));


....................................................
File packaging/dbscripts/create_views.sql
Line 250: CREATE OR REPLACE VIEW all_disks
Line 251: AS
Line 252: SELECT *
Line 253: FROM all_disks_including_snapshots
Line 254: WHERE active IS NULL OR active = TRUE;
Please use indentation here
Line 255: 
Line 256: 
Line 257: CREATE OR REPLACE VIEW storage_domains
Line 258: AS


....................................................
File packaging/dbscripts/disk_images_sp.sql
Line 112: LANGUAGE plpgsql;
Line 113: 
Line 114: 
Line 115: 
Line 116: Create or replace FUNCTION GetVmAttachedDiskSnapshots(v_vm_guid UUID, 
v_is_plugged BOOLEAN)
Suggestion: The name of the query is misleading, we don't get a VM, we should 
name it GetAttachedDiskSnapshotsToVM
Line 117: RETURNS SETOF images_storage_domain_view
Line 118:    AS $procedure$
Line 119: BEGIN
Line 120:       RETURN QUERY SELECT images_storage_domain_view.*


....................................................
File 
packaging/dbscripts/upgrade/03_03_0800_add_snapshot_id_column_to_vm_device.sql
Line 1: select fn_db_add_column('vm_device', 'snapshot_id', 'UUID REFERENCES 
SNAPSHOTS(snapshot_id) ON DELETE CASCADE DEFAULT NULL');
crucial: The sequential number is already in use, it should be updated, please 
don't forget to change it before merging


-- 
To view, visit http://gerrit.ovirt.org/17679
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I02579bf1a91cd294a5040acf432f1fdb87eb18c1
Gerrit-PatchSet: 27
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Ar <lara...@redhat.com>
Gerrit-Reviewer: Alissa Bonas <abo...@redhat.com>
Gerrit-Reviewer: Allon Mureinik <amure...@redhat.com>
Gerrit-Reviewer: Ayal Baron <aba...@redhat.com>
Gerrit-Reviewer: Daniel Erez <de...@redhat.com>
Gerrit-Reviewer: Federico Simoncelli <fsimo...@redhat.com>
Gerrit-Reviewer: Liron Ar <lara...@redhat.com>
Gerrit-Reviewer: Maor Lipchuk <mlipc...@redhat.com>
Gerrit-Reviewer: Tal Nisan <tni...@redhat.com>
Gerrit-Reviewer: oVirt Jenkins CI Server
Gerrit-HasComments: Yes
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to