Skip to content

CLOUDSTACK-9827: Storage tags stored in multiple places - #1994

Merged
asfgit merged 1 commit into
apache:masterfrom
nvazquez:CLOUDSTACK-9827
Mar 28, 2017
Merged

CLOUDSTACK-9827: Storage tags stored in multiple places#1994
asfgit merged 1 commit into
apache:masterfrom
nvazquez:CLOUDSTACK-9827

Conversation

@nvazquez

@nvazqueznvazquez commented Mar 8, 2017

Copy link
Copy Markdown
Contributor

Issue description: https://issues.apache.org/jira/browse/CLOUDSTACK-9827

Fixes

  • Create Primary Storage: Persist tags into storage_pool_tags instead of storage_pool_details
  • List Storage Tags: Queries storage_pool_tags table instead of storage_tag_view
  • Find Storage Pools by Tags using proper DAO
  • Remove storage tags after deleting Primary Storage
  • Remove unused StorageTagDao, StorageTagDaoImpl, StorageTagVO and storage_tag_view

@serg38

Copy link
Copy Markdown

@mike-tutkowski@karuturi@koushik-das@rafaelweingartner Please review the fix for 4.10 blocker

@serg38

Copy link
Copy Markdown

@nvazquez Should we simply replace storage_tag_view instead of switching queries over to another view?

@borisstoyanov

Copy link
Copy Markdown
Contributor

@blueorangutan package

@blueorangutan

Copy link
Copy Markdown

@borisstoyanov a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

@blueorangutan

Copy link
Copy Markdown

Packaging result: ✔centos6 ✔centos7 ✔debian. JID-578

@borisstoyanov

Copy link
Copy Markdown
Contributor

@blueorangutan test

@blueorangutan

Copy link
Copy Markdown

@borisstoyanov a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

@blueorangutan

Copy link
Copy Markdown

Trillian test result (tid-940)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 28984 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr1994-t940-kvm-centos7.zip
Intermitten failure detected: /marvin/tests/smoke/test_privategw_acl.py
Intermitten failure detected: /marvin/tests/smoke/test_snapshots.py
Test completed. 47 look ok, 2 have error(s)

TestResultTime (s)Test File
test_04_rvpc_privategw_static_routesFailure366.22test_privategw_acl.py
test_02_list_snapshots_with_removed_data_storeError0.04test_snapshots.py
test_01_vpc_site2site_vpnSuccess161.27test_vpc_vpn.py
test_01_vpc_remote_access_vpnSuccess71.26test_vpc_vpn.py
test_01_redundant_vpc_site2site_vpnSuccess266.14test_vpc_vpn.py
test_02_VPC_default_routesSuccess272.29test_vpc_router_nics.py
test_01_VPC_nics_after_destroySuccess573.38test_vpc_router_nics.py
test_05_rvpc_multi_tiersSuccess524.87test_vpc_redundant.py
test_04_rvpc_network_garbage_collector_nicsSuccess1296.05test_vpc_redundant.py
test_03_create_redundant_VPC_1tier_2VMs_2IPs_2PF_ACL_reboot_routersSuccess558.76test_vpc_redundant.py
test_02_redundant_VPC_default_routesSuccess761.27test_vpc_redundant.py
test_01_create_redundant_VPC_2tiers_4VMs_4IPs_4PF_ACLSuccess1310.90test_vpc_redundant.py
test_09_delete_detached_volumeSuccess156.60test_volumes.py
test_08_resize_volumeSuccess156.91test_volumes.py
test_07_resize_failSuccess161.50test_volumes.py
test_06_download_detached_volumeSuccess156.34test_volumes.py
test_05_detach_volumeSuccess155.76test_volumes.py
test_04_delete_attached_volumeSuccess151.23test_volumes.py
test_03_download_attached_volumeSuccess156.46test_volumes.py
test_02_attach_volumeSuccess124.66test_volumes.py
test_01_create_volumeSuccess713.58test_volumes.py
test_03_delete_vm_snapshotsSuccess275.17test_vm_snapshots.py
test_02_revert_vm_snapshotsSuccess95.75test_vm_snapshots.py
test_01_create_vm_snapshotsSuccess163.78test_vm_snapshots.py
test_deploy_vm_multipleSuccess272.95test_vm_life_cycle.py
test_deploy_vmSuccess0.03test_vm_life_cycle.py
test_advZoneVirtualRouterSuccess0.03test_vm_life_cycle.py
test_10_attachAndDetach_isoSuccess26.88test_vm_life_cycle.py
test_09_expunge_vmSuccess125.25test_vm_life_cycle.py
test_08_migrate_vmSuccess30.90test_vm_life_cycle.py
test_07_restore_vmSuccess0.13test_vm_life_cycle.py
test_06_destroy_vmSuccess130.98test_vm_life_cycle.py
test_03_reboot_vmSuccess125.88test_vm_life_cycle.py
test_02_start_vmSuccess10.17test_vm_life_cycle.py
test_01_stop_vmSuccess40.33test_vm_life_cycle.py
test_CreateTemplateWithDuplicateNameSuccess50.75test_templates.py
test_08_list_system_templatesSuccess0.03test_templates.py
test_07_list_public_templatesSuccess0.04test_templates.py
test_05_template_permissionsSuccess0.06test_templates.py
test_04_extract_templateSuccess5.13test_templates.py
test_03_delete_templateSuccess5.11test_templates.py
test_02_edit_templateSuccess90.21test_templates.py
test_01_create_templateSuccess40.46test_templates.py
test_10_destroy_cpvmSuccess166.67test_ssvm.py
test_09_destroy_ssvmSuccess164.14test_ssvm.py
test_08_reboot_cpvmSuccess131.56test_ssvm.py
test_07_reboot_ssvmSuccess133.64test_ssvm.py
test_06_stop_cpvmSuccess131.75test_ssvm.py
test_05_stop_ssvmSuccess133.76test_ssvm.py
test_04_cpvm_internalsSuccess1.22test_ssvm.py
test_03_ssvm_internalsSuccess3.37test_ssvm.py
test_02_list_cpvm_vmSuccess0.13test_ssvm.py
test_01_list_sec_storage_vmSuccess0.17test_ssvm.py
test_01_snapshot_root_diskSuccess11.11test_snapshots.py
test_04_change_offering_smallSuccess240.71test_service_offerings.py
test_03_delete_service_offeringSuccess0.04test_service_offerings.py
test_02_edit_service_offeringSuccess0.05test_service_offerings.py
test_01_create_service_offeringSuccess0.11test_service_offerings.py
test_02_sys_template_readySuccess0.13test_secondary_storage.py
test_01_sys_vm_startSuccess0.20test_secondary_storage.py
test_09_reboot_routerSuccess35.32test_routers.py
test_08_start_routerSuccess30.32test_routers.py
test_07_stop_routerSuccess10.16test_routers.py
test_06_router_advancedSuccess0.06test_routers.py
test_05_router_basicSuccess0.04test_routers.py
test_04_restart_network_wo_cleanupSuccess5.70test_routers.py
test_03_restart_network_cleanupSuccess55.51test_routers.py
test_02_router_internal_advSuccess1.04test_routers.py
test_01_router_internal_basicSuccess0.56test_routers.py
test_router_dns_guestipquerySuccess76.84test_router_dns.py
test_router_dns_externalipquerySuccess0.07test_router_dns.py
test_router_dhcphostsSuccess277.56test_router_dhcphosts.py
test_router_dhcp_optsSuccess21.76test_router_dhcphosts.py
test_01_updatevolumedetailSuccess0.08test_resource_detail.py
test_01_reset_vm_on_rebootSuccess151.35test_reset_vm_on_reboot.py
test_createRegionSuccess0.04test_regions.py
test_create_pvlan_networkSuccess5.22test_pvlan.py
test_dedicatePublicIpRangeSuccess0.45test_public_ip_range.py
test_03_vpc_privategw_restart_vpc_cleanupSuccess515.64test_privategw_acl.py
test_02_vpc_privategw_static_routesSuccess350.69test_privategw_acl.py
test_01_vpc_privategw_aclSuccess92.58test_privategw_acl.py
test_01_primary_storage_nfsSuccess35.81test_primary_storage.py
test_createPortablePublicIPRangeSuccess15.19test_portable_publicip.py
test_createPortablePublicIPAcquireSuccess15.44test_portable_publicip.py
test_isolate_network_password_serverSuccess89.64test_password_server.py
test_UpdateStorageOverProvisioningFactorSuccess0.14test_over_provisioning.py
test_oobm_zchange_passwordSuccess30.64test_outofbandmanagement.py
test_oobm_multiple_mgmt_server_ownershipSuccess16.34test_outofbandmanagement.py
test_oobm_issue_power_statusSuccess10.24test_outofbandmanagement.py
test_oobm_issue_power_softSuccess15.31test_outofbandmanagement.py
test_oobm_issue_power_resetSuccess10.30test_outofbandmanagement.py
test_oobm_issue_power_onSuccess15.34test_outofbandmanagement.py
test_oobm_issue_power_offSuccess15.35test_outofbandmanagement.py
test_oobm_issue_power_cycleSuccess15.38test_outofbandmanagement.py
test_oobm_enabledisable_across_clusterzonesSuccess92.65test_outofbandmanagement.py
test_oobm_enable_feature_validSuccess5.16test_outofbandmanagement.py
test_oobm_enable_feature_invalidSuccess0.10test_outofbandmanagement.py
test_oobm_disable_feature_validSuccess5.18test_outofbandmanagement.py
test_oobm_disable_feature_invalidSuccess0.10test_outofbandmanagement.py
test_oobm_configure_invalid_driverSuccess0.08test_outofbandmanagement.py
test_oobm_configure_default_driverSuccess0.08test_outofbandmanagement.py
test_oobm_background_powerstate_syncSuccess23.42test_outofbandmanagement.py
test_extendPhysicalNetworkVlanSuccess15.31test_non_contigiousvlan.py
test_01_nicSuccess439.52test_nic.py
test_releaseIPSuccess278.19test_network.py
test_reboot_routerSuccess408.54test_network.py
test_public_ip_user_accountSuccess10.26test_network.py
test_public_ip_admin_accountSuccess40.28test_network.py
test_network_rules_acquired_public_ip_3_Load_Balancer_RuleSuccess66.96test_network.py
test_network_rules_acquired_public_ip_2_nat_ruleSuccess61.76test_network.py
test_network_rules_acquired_public_ip_1_static_nat_ruleSuccess123.89test_network.py
test_delete_accountSuccess272.80test_network.py
test_02_port_fwd_on_non_src_natSuccess55.66test_network.py
test_01_port_fwd_on_src_natSuccess112.21test_network.py
test_nic_secondaryip_add_removeSuccess202.54test_multipleips_per_nic.py
login_test_saml_userSuccess19.28test_login.py
test_assign_and_removal_lbSuccess133.66test_loadbalance.py
test_02_create_lb_rule_non_natSuccess187.32test_loadbalance.py
test_01_create_lb_rule_src_natSuccess218.55test_loadbalance.py
test_03_list_snapshotsSuccess0.08test_list_ids_parameter.py
test_02_list_templatesSuccess0.04test_list_ids_parameter.py
test_01_list_volumesSuccess0.03test_list_ids_parameter.py
test_07_list_default_isoSuccess0.06test_iso.py
test_05_iso_permissionsSuccess0.06test_iso.py
test_04_extract_IsoSuccess5.17test_iso.py
test_03_delete_isoSuccess95.17test_iso.py
test_02_edit_isoSuccess0.06test_iso.py
test_01_create_isoSuccess21.02test_iso.py
test_04_rvpc_internallb_haproxy_stats_on_all_interfacesSuccess214.50test_internal_lb.py
test_03_vpc_internallb_haproxy_stats_on_all_interfacesSuccess153.01test_internal_lb.py
test_02_internallb_roundrobin_1RVPC_3VM_HTTP_port80Success501.17test_internal_lb.py
test_01_internallb_roundrobin_1VPC_3VM_HTTP_port80Success431.06test_internal_lb.py
test_dedicateGuestVlanRangeSuccess10.41test_guest_vlan_range.py
test_UpdateConfigParamWithScopeSuccess0.15test_global_settings.py
test_rolepermission_lifecycle_updateSuccess6.34test_dynamicroles.py
test_rolepermission_lifecycle_listSuccess6.01test_dynamicroles.py
test_rolepermission_lifecycle_deleteSuccess5.85test_dynamicroles.py
test_rolepermission_lifecycle_createSuccess5.87test_dynamicroles.py
test_rolepermission_lifecycle_concurrent_updatesSuccess6.00test_dynamicroles.py
test_role_lifecycle_update_role_inuseSuccess5.92test_dynamicroles.py
test_role_lifecycle_updateSuccess10.98test_dynamicroles.py
test_role_lifecycle_listSuccess5.90test_dynamicroles.py
test_role_lifecycle_deleteSuccess11.50test_dynamicroles.py
test_role_lifecycle_createSuccess6.21test_dynamicroles.py
test_role_inuse_deletionSuccess5.90test_dynamicroles.py
test_role_account_acls_multiple_mgmt_serversSuccess8.06test_dynamicroles.py
test_role_account_aclsSuccess8.57test_dynamicroles.py
test_default_role_deletionSuccess5.97test_dynamicroles.py
test_04_create_fat_type_disk_offeringSuccess0.07test_disk_offerings.py
test_03_delete_disk_offeringSuccess0.04test_disk_offerings.py
test_02_edit_disk_offeringSuccess0.05test_disk_offerings.py
test_02_create_sparse_type_disk_offeringSuccess0.07test_disk_offerings.py
test_01_create_disk_offeringSuccess0.11test_disk_offerings.py
test_deployvm_userdispersingSuccess55.83test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_userconcentratedSuccess20.71test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_firstfitSuccess60.72test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_userdata_postSuccess10.38test_deploy_vm_with_userdata.py
test_deployvm_userdataSuccess50.69test_deploy_vm_with_userdata.py
test_02_deploy_vm_root_resizeSuccess5.97test_deploy_vm_root_resize.py
test_01_deploy_vm_root_resizeSuccess5.98test_deploy_vm_root_resize.py
test_00_deploy_vm_root_resizeSuccess207.44test_deploy_vm_root_resize.py
test_deploy_vm_from_isoSuccess212.50test_deploy_vm_iso.py
test_DeployVmAntiAffinityGroupSuccess70.95test_affinity_groups.py
test_change_service_offering_for_vm_with_snapshotsSkipped0.00test_vm_snapshots.py
test_01_test_vm_volume_snapshotSkipped0.00test_vm_snapshots.py
test_06_copy_templateSkipped0.00test_templates.py
test_static_role_account_aclsSkipped0.02test_staticroles.py
test_11_ss_nfs_version_on_ssvmSkipped0.02test_ssvm.py
test_01_scale_vmSkipped0.00test_scale_vm.py
test_01_primary_storage_iscsiSkipped0.04test_primary_storage.py
test_nested_virtualization_vmwareSkipped0.00test_nested_virtualization.py
test_06_copy_isoSkipped0.00test_iso.py
test_deploy_vgpu_enabled_vmSkipped0.03test_deploy_vgpu_enabled_vm.py
test_3d_gpu_supportSkipped0.04test_deploy_vgpu_enabled_vm.py

@rafaelweingartner

Copy link
Copy Markdown
Member

@nvazquez I am assuming the change needed to fix the bug is line 135 at PrimaryDataStoreHelper.java?
The other changes are regarding code conformity

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

Hi @rafaelweingartner, you're right, it was basically that fix.
I've pushed another commit due to issue reported by @mike-tutkowski in mailing list:

I have an NFS SR as primary storage under CloudStack with a storage tag of NFS-A. I have a compute offering with a matching storage tag. I can’t seem to get a VM to spin up, however: It says insufficient capacity. The CPU, MHz, and memory are all low (and what I typically use), so I think the problem is with matching the storage tag.

@serg38

Copy link
Copy Markdown

@nvazquez Is storage_tag_view still in use after this change that reference old way of retrieving the tags? If not should we remove it? E.g. host tags don't have a separate view.

@nvazquez

nvazquez commented Mar 10, 2017

Copy link
Copy Markdown
ContributorAuthor

@serg38 actually is not being used anymore, I'll add removal of the view on last commit

@nvazquez
nvazquezforce-pushed the CLOUDSTACK-9827 branch 2 times, most recently from bd1ba78 to e618253CompareMarch 10, 2017 01:35
@nvazquez

nvazquez commented Mar 10, 2017

Copy link
Copy Markdown
ContributorAuthor

Added these items to description:

  • Find Storage Pools by Tags using proper DAO
  • Remove storage tags after deleting Primary Storage
  • Remove unused StorageTagDao, StorageTagDaoImpl, StorageTagVO and storage_tag_view

@serg38

Copy link
Copy Markdown

@rhtyd @borisstoyanov Can you kick off new tests for this release blocker?

@borisstoyanov

Copy link
Copy Markdown
Contributor

@blueorangutan package

@blueorangutan

Copy link
Copy Markdown

@borisstoyanov a Jenkins job has been kicked to build packages. I'll keep you posted as I make progress.

@blueorangutan

Copy link
Copy Markdown

Packaging result: ✔centos6 ✔centos7 ✔debian. JID-585

@borisstoyanov

Copy link
Copy Markdown
Contributor

@blueorangutan test

@blueorangutan

Copy link
Copy Markdown

@borisstoyanov a Trillian-Jenkins test job (centos7 mgmt + kvm-centos7) has been kicked to run smoke tests

@blueorangutan

Copy link
Copy Markdown

Trillian test result (tid-946)
Environment: kvm-centos7 (x2), Advanced Networking with Mgmt server 7
Total time taken: 28653 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr1994-t946-kvm-centos7.zip
Intermitten failure detected: /marvin/tests/smoke/test_privategw_acl.py
Intermitten failure detected: /marvin/tests/smoke/test_snapshots.py
Test completed. 47 look ok, 2 have error(s)

TestResultTime (s)Test File
test_04_rvpc_privategw_static_routesFailure350.78test_privategw_acl.py
test_02_list_snapshots_with_removed_data_storeError0.04test_snapshots.py
test_01_vpc_site2site_vpnSuccess155.07test_vpc_vpn.py
test_01_vpc_remote_access_vpnSuccess61.14test_vpc_vpn.py
test_01_redundant_vpc_site2site_vpnSuccess251.03test_vpc_vpn.py
test_02_VPC_default_routesSuccess290.08test_vpc_router_nics.py
test_01_VPC_nics_after_destroySuccess525.27test_vpc_router_nics.py
test_05_rvpc_multi_tiersSuccess527.95test_vpc_redundant.py
test_04_rvpc_network_garbage_collector_nicsSuccess1442.83test_vpc_redundant.py
test_03_create_redundant_VPC_1tier_2VMs_2IPs_2PF_ACL_reboot_routersSuccess569.18test_vpc_redundant.py
test_02_redundant_VPC_default_routesSuccess760.64test_vpc_redundant.py
test_01_create_redundant_VPC_2tiers_4VMs_4IPs_4PF_ACLSuccess1312.03test_vpc_redundant.py
test_09_delete_detached_volumeSuccess156.64test_volumes.py
test_08_resize_volumeSuccess156.42test_volumes.py
test_07_resize_failSuccess156.51test_volumes.py
test_06_download_detached_volumeSuccess156.40test_volumes.py
test_05_detach_volumeSuccess155.84test_volumes.py
test_04_delete_attached_volumeSuccess151.29test_volumes.py
test_03_download_attached_volumeSuccess151.28test_volumes.py
test_02_attach_volumeSuccess94.89test_volumes.py
test_01_create_volumeSuccess711.29test_volumes.py
test_03_delete_vm_snapshotsSuccess275.21test_vm_snapshots.py
test_02_revert_vm_snapshotsSuccess100.74test_vm_snapshots.py
test_01_create_vm_snapshotsSuccess163.86test_vm_snapshots.py
test_deploy_vm_multipleSuccess262.94test_vm_life_cycle.py
test_deploy_vmSuccess0.03test_vm_life_cycle.py
test_advZoneVirtualRouterSuccess0.03test_vm_life_cycle.py
test_10_attachAndDetach_isoSuccess26.70test_vm_life_cycle.py
test_09_expunge_vmSuccess125.18test_vm_life_cycle.py
test_08_migrate_vmSuccess30.98test_vm_life_cycle.py
test_07_restore_vmSuccess0.13test_vm_life_cycle.py
test_06_destroy_vmSuccess125.83test_vm_life_cycle.py
test_03_reboot_vmSuccess125.88test_vm_life_cycle.py
test_02_start_vmSuccess10.17test_vm_life_cycle.py
test_01_stop_vmSuccess40.33test_vm_life_cycle.py
test_CreateTemplateWithDuplicateNameSuccess40.50test_templates.py
test_08_list_system_templatesSuccess0.03test_templates.py
test_07_list_public_templatesSuccess0.04test_templates.py
test_05_template_permissionsSuccess0.14test_templates.py
test_04_extract_templateSuccess5.16test_templates.py
test_03_delete_templateSuccess5.11test_templates.py
test_02_edit_templateSuccess90.17test_templates.py
test_01_create_templateSuccess40.43test_templates.py
test_10_destroy_cpvmSuccess161.69test_ssvm.py
test_09_destroy_ssvmSuccess168.76test_ssvm.py
test_08_reboot_cpvmSuccess131.64test_ssvm.py
test_07_reboot_ssvmSuccess103.62test_ssvm.py
test_06_stop_cpvmSuccess131.88test_ssvm.py
test_05_stop_ssvmSuccess163.87test_ssvm.py
test_04_cpvm_internalsSuccess1.24test_ssvm.py
test_03_ssvm_internalsSuccess3.48test_ssvm.py
test_02_list_cpvm_vmSuccess0.15test_ssvm.py
test_01_list_sec_storage_vmSuccess0.14test_ssvm.py
test_01_snapshot_root_diskSuccess11.18test_snapshots.py
test_04_change_offering_smallSuccess239.97test_service_offerings.py
test_03_delete_service_offeringSuccess0.04test_service_offerings.py
test_02_edit_service_offeringSuccess0.06test_service_offerings.py
test_01_create_service_offeringSuccess0.11test_service_offerings.py
test_02_sys_template_readySuccess0.14test_secondary_storage.py
test_01_sys_vm_startSuccess0.19test_secondary_storage.py
test_09_reboot_routerSuccess35.34test_routers.py
test_08_start_routerSuccess30.28test_routers.py
test_07_stop_routerSuccess10.20test_routers.py
test_06_router_advancedSuccess0.08test_routers.py
test_05_router_basicSuccess0.08test_routers.py
test_04_restart_network_wo_cleanupSuccess5.73test_routers.py
test_03_restart_network_cleanupSuccess55.52test_routers.py
test_02_router_internal_advSuccess1.03test_routers.py
test_01_router_internal_basicSuccess0.59test_routers.py
test_router_dns_guestipquerySuccess76.72test_router_dns.py
test_router_dns_externalipquerySuccess0.08test_router_dns.py
test_router_dhcphostsSuccess276.92test_router_dhcphosts.py
test_router_dhcp_optsSuccess21.83test_router_dhcphosts.py
test_01_updatevolumedetailSuccess0.08test_resource_detail.py
test_01_reset_vm_on_rebootSuccess130.94test_reset_vm_on_reboot.py
test_createRegionSuccess0.04test_regions.py
test_create_pvlan_networkSuccess5.21test_pvlan.py
test_dedicatePublicIpRangeSuccess0.48test_public_ip_range.py
test_03_vpc_privategw_restart_vpc_cleanupSuccess490.19test_privategw_acl.py
test_02_vpc_privategw_static_routesSuccess365.31test_privategw_acl.py
test_01_vpc_privategw_aclSuccess92.29test_privategw_acl.py
test_01_primary_storage_nfsSuccess35.86test_primary_storage.py
test_createPortablePublicIPRangeSuccess15.28test_portable_publicip.py
test_createPortablePublicIPAcquireSuccess15.44test_portable_publicip.py
test_isolate_network_password_serverSuccess91.18test_password_server.py
test_UpdateStorageOverProvisioningFactorSuccess0.14test_over_provisioning.py
test_oobm_zchange_passwordSuccess30.70test_outofbandmanagement.py
test_oobm_multiple_mgmt_server_ownershipSuccess11.34test_outofbandmanagement.py
test_oobm_issue_power_statusSuccess10.24test_outofbandmanagement.py
test_oobm_issue_power_softSuccess15.36test_outofbandmanagement.py
test_oobm_issue_power_resetSuccess10.32test_outofbandmanagement.py
test_oobm_issue_power_onSuccess15.42test_outofbandmanagement.py
test_oobm_issue_power_offSuccess15.32test_outofbandmanagement.py
test_oobm_issue_power_cycleSuccess15.37test_outofbandmanagement.py
test_oobm_enabledisable_across_clusterzonesSuccess92.79test_outofbandmanagement.py
test_oobm_enable_feature_validSuccess5.18test_outofbandmanagement.py
test_oobm_enable_feature_invalidSuccess0.10test_outofbandmanagement.py
test_oobm_disable_feature_validSuccess5.19test_outofbandmanagement.py
test_oobm_disable_feature_invalidSuccess0.10test_outofbandmanagement.py
test_oobm_configure_invalid_driverSuccess0.08test_outofbandmanagement.py
test_oobm_configure_default_driverSuccess0.08test_outofbandmanagement.py
test_oobm_background_powerstate_syncSuccess23.45test_outofbandmanagement.py
test_extendPhysicalNetworkVlanSuccess15.33test_non_contigiousvlan.py
test_01_nicSuccess429.27test_nic.py
test_releaseIPSuccess258.04test_network.py
test_reboot_routerSuccess408.55test_network.py
test_public_ip_user_accountSuccess10.27test_network.py
test_public_ip_admin_accountSuccess40.49test_network.py
test_network_rules_acquired_public_ip_3_Load_Balancer_RuleSuccess67.00test_network.py
test_network_rules_acquired_public_ip_2_nat_ruleSuccess61.77test_network.py
test_network_rules_acquired_public_ip_1_static_nat_ruleSuccess124.15test_network.py
test_delete_accountSuccess288.94test_network.py
test_02_port_fwd_on_non_src_natSuccess55.79test_network.py
test_01_port_fwd_on_src_natSuccess111.78test_network.py
test_nic_secondaryip_add_removeSuccess222.91test_multipleips_per_nic.py
login_test_saml_userSuccess19.16test_login.py
test_assign_and_removal_lbSuccess133.66test_loadbalance.py
test_02_create_lb_rule_non_natSuccess187.51test_loadbalance.py
test_01_create_lb_rule_src_natSuccess219.39test_loadbalance.py
test_03_list_snapshotsSuccess0.06test_list_ids_parameter.py
test_02_list_templatesSuccess0.04test_list_ids_parameter.py
test_01_list_volumesSuccess0.03test_list_ids_parameter.py
test_07_list_default_isoSuccess0.07test_iso.py
test_05_iso_permissionsSuccess0.07test_iso.py
test_04_extract_IsoSuccess5.17test_iso.py
test_03_delete_isoSuccess95.22test_iso.py
test_02_edit_isoSuccess0.06test_iso.py
test_01_create_isoSuccess21.05test_iso.py
test_04_rvpc_internallb_haproxy_stats_on_all_interfacesSuccess203.93test_internal_lb.py
test_03_vpc_internallb_haproxy_stats_on_all_interfacesSuccess153.24test_internal_lb.py
test_02_internallb_roundrobin_1RVPC_3VM_HTTP_port80Success528.45test_internal_lb.py
test_01_internallb_roundrobin_1VPC_3VM_HTTP_port80Success450.65test_internal_lb.py
test_dedicateGuestVlanRangeSuccess10.31test_guest_vlan_range.py
test_UpdateConfigParamWithScopeSuccess0.16test_global_settings.py
test_rolepermission_lifecycle_updateSuccess6.24test_dynamicroles.py
test_rolepermission_lifecycle_listSuccess6.03test_dynamicroles.py
test_rolepermission_lifecycle_deleteSuccess5.87test_dynamicroles.py
test_rolepermission_lifecycle_createSuccess5.91test_dynamicroles.py
test_rolepermission_lifecycle_concurrent_updatesSuccess6.05test_dynamicroles.py
test_role_lifecycle_update_role_inuseSuccess5.94test_dynamicroles.py
test_role_lifecycle_updateSuccess11.04test_dynamicroles.py
test_role_lifecycle_listSuccess5.95test_dynamicroles.py
test_role_lifecycle_deleteSuccess11.21test_dynamicroles.py
test_role_lifecycle_createSuccess5.94test_dynamicroles.py
test_role_inuse_deletionSuccess6.05test_dynamicroles.py
test_role_account_acls_multiple_mgmt_serversSuccess8.61test_dynamicroles.py
test_role_account_aclsSuccess9.39test_dynamicroles.py
test_default_role_deletionSuccess6.52test_dynamicroles.py
test_04_create_fat_type_disk_offeringSuccess0.10test_disk_offerings.py
test_03_delete_disk_offeringSuccess0.05test_disk_offerings.py
test_02_edit_disk_offeringSuccess0.07test_disk_offerings.py
test_02_create_sparse_type_disk_offeringSuccess0.08test_disk_offerings.py
test_01_create_disk_offeringSuccess0.15test_disk_offerings.py
test_deployvm_userdispersingSuccess20.63test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_userconcentratedSuccess20.65test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_firstfitSuccess70.82test_deploy_vms_with_varied_deploymentplanners.py
test_deployvm_userdata_postSuccess10.48test_deploy_vm_with_userdata.py
test_deployvm_userdataSuccess70.96test_deploy_vm_with_userdata.py
test_02_deploy_vm_root_resizeSuccess6.22test_deploy_vm_root_resize.py
test_01_deploy_vm_root_resizeSuccess6.01test_deploy_vm_root_resize.py
test_00_deploy_vm_root_resizeSuccess222.75test_deploy_vm_root_resize.py
test_deploy_vm_from_isoSuccess212.81test_deploy_vm_iso.py
test_DeployVmAntiAffinityGroupSuccess66.12test_affinity_groups.py
test_change_service_offering_for_vm_with_snapshotsSkipped0.00test_vm_snapshots.py
test_01_test_vm_volume_snapshotSkipped0.00test_vm_snapshots.py
test_06_copy_templateSkipped0.00test_templates.py
test_static_role_account_aclsSkipped0.03test_staticroles.py
test_11_ss_nfs_version_on_ssvmSkipped0.02test_ssvm.py
test_01_scale_vmSkipped0.00test_scale_vm.py
test_01_primary_storage_iscsiSkipped0.04test_primary_storage.py
test_nested_virtualization_vmwareSkipped0.00test_nested_virtualization.py
test_06_copy_isoSkipped0.00test_iso.py
test_deploy_vgpu_enabled_vmSkipped0.04test_deploy_vgpu_enabled_vm.py
test_3d_gpu_supportSkipped0.04test_deploy_vgpu_enabled_vm.py

@serg38

Copy link
Copy Markdown

@mike-tutkowski Can you test this fix in your environment?

@mike-tutkowski

mike-tutkowski commented Mar 10, 2017 via email

Copy link
Copy Markdown
Member

@rafaelweingartnerrafaelweingartner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez I have checked the code, and I had a few suggestions to improve the code quality. I know it is a blocker, and we are in RC. So, I will not be picky with the code. If it is not possible to make those changes, I am ok (at least for now).


@Override
public List<StoragePoolTagVO> searchByIds(Long... stIds) {
String batchCfg = _configDao.getValue("detail.batch.query.size");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez what about extracting lines 95-97 to a method?
Then, we can have test cases and some doc for it. Especially for that 2000 magic number there.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, thanks!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

About number 2000, I assumed it was a default value for that configuration

ids[k] = stIds[j];
}

SearchCriteria<StoragePoolTagVO> sc = StoragePoolIdsSearch.create();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez lines 105-119 are the same as 128-142.
What about extracting them for a method?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, created method searchForStoragePoolIdsInternal

Map<String, String> details = tagsToDetails(tags);

StringBuilder sql = new StringBuilder(ZoneWideDetailsSqlPrefix);
StringBuilder sql = new StringBuilder(ZoneWideTagsSqlPrefix);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez what about extracting lines 463-469 to a method? Then, we can create doc and most of all test cases. This is a pretty tricky bit of code (Especially line 468).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out, I had missed it out. Created methods getSqlPreparedStatement and searchStoragePoolsPreparedStatement which are called from many methods and allow storage pool retrieval

@mike-tutkowski

Copy link
Copy Markdown
Member

I have run the following use cases successfully:

PS = Primary Storage
ST = Storage Tag
CO = Compute Offering
DO = Disk Offering
V = Volume

Create PS_1 with ST NFS-A

Create CO_1 with ST NFS-A
Create CO_2 with ST NFS-B

Create VM_1 with CO_1 (VM starts)
Create VM_2 with CO_2 (VM fails to find storage)

Edit ST of PS_1 from NFS-A to NFS-B

Create VM_2 with CO_1 (VM fails to find storage)
Create VM_2 with CO_2 (VM starts)

Create DO_1 with ST NFS-A
Create DO_2 with ST NFS-B

Create V_1 with DO_1 and attach to VM_1 (fails to find storage)
Create V_2 with DO_2 and attach to VM_1

Edit ST of PS_1 from NFS-B to NFS-A

Create V_1 with DO_1 and attach to VM_1

Create PS_2 with no ST

Edit ST of PS_2 to NFS-B

Create V_3 with DO_1 and attach to VM_2 (lands on expected PS)
Create V_4 with DO_2 and attach to VM_2 (lands on expected PS)

Create PS_3 with ST NFS-B

Migrate V_4 from PS_2 to PS_3 (PS_1 is not an option)
Migrate V_4 from PS_3 to PS_2 (PS_1 is not an option)

Migrate V_3 from PS_1 to PS_2 (Neither PS_2 nor PS_3 is an option)

Migrate root V of VM_1 from PS_1 to PS_2 (Neither PS_2 nor PS_3 is an option)

Migrate root V of VM_2 from PS_1 to PS_3 (PS_2 and PS_3 are options)

listStorageTags API returned expected results (I ran this at several points along the way)

@karuturi

Copy link
Copy Markdown
Member

@nvazquez I think any of the existing marvin tests didnt catch this bug. Is it possible to add a marvin test for it?

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

@mike-tutkowski awesome, thanks for testing this PR!

@rafaelweingartner thanks for reviewing, I'll work on changes proposed

@karuturi sure, I'll work on it, thanks!

@rafaelweingartnerrafaelweingartner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez I have been thinking a while about this conditional. what do you think about my comment?

List<StoragePoolTagVO> uvList = new ArrayList<StoragePoolTagVO>();
int curr_index = 0;

if (stIds.length > detailsBatchSize) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct me if I am wrong, but this if is not needed.
Let's assume the configuration:

batchSize=2000
current_index=0
lengthOfStIds=100

curr_index + detailsBatchSize = 0 + 2000, which is not less than the size of the array (100). Therefore, the while is not executed. Then, the pools will be loaded at lines 100-112

@nvazqueznvazquezMar 14, 2017

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that if is needed, we need it to control the max query size. I agree with the example you provided, but let's say for example that lengthOfStIds is greater that batchSize. If we remove that if, we will load pools on lines 100-112 but with a query size greater that batchSize (defined in line 111)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mistyped the lines in my last sentence, it should have been 110-112.
Will it be loaded with a bigger batch size? From my reading, even without the if at line 103, if stIds.length is smaller than the batch size, the while is not executed (not even once). Then, the flow proceeds the same as if the if had been executed. Then, at line 111 the batch_size is calculated using stIds.length - curr_index.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @rafaelweingartner, I assumed that you meant deleting the whole if block (lines 103-108), is it correct or you mean just deleting line 103 (and 108)?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, no this is not what I meant.
I meant only removing the if and letting the while directly there.
Just deleting line 103

@nvazqueznvazquezMar 15, 2017

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, I agree with you that the line can be removed. Sorry for the confusion, I'll try adding some unit tests for this change. Thanks!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem ;)

It is awesome the changes you have done here. The code became cleaner, with good documentation and on top of that, we now have unit tests to guarantee that the methods are workings as expected.

Great job @nvazquez, well done!

PS: Sorry if I have been too picky with the code changes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done! Thanks a lot @rafaelweingartner!

@rafaelweingartnerrafaelweingartner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other static variable that was left behind in the test case

private static PrimaryDataStoreDaoImpl primaryDataStoreDao = new PrimaryDataStoreDaoImpl();

@Mock
static StoragePoolVO storagePoolVO;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here you have other static variable in a test case that does not need to be static.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I removed it

@karuturi

Copy link
Copy Markdown
Member

@nvazquez any update?

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

Hi @karuturi, I've been working on marvin tests, I hope posting them today

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

@karuturi I added marvin tests to simulate tests performed by @mike-tutkowski.

This are results in our env:

[root@ussarlabcsmgt41 cloudstack]# cat /tmp//MarvinLogs//011CTF/results.txt
Test primary storage pools - XEN. Not Supported for kvm,hyperv,vmware ... SKIP: iscsi primary storage not supported on kvm, VMWare, Hyper-V, or LXC
Test primary storage pools - XEN, KVM, VMWare. Not Supported for hyperv ... === TestName: test_01_primary_storage_nfs | Status : SUCCESS ===
ok
Test Deploy VMS using different Service Offerings with Storage Tags ... === TestName: test_01_deploy_vms_storage_tags | Status : SUCCESS ===
ok
Test edit Storage Tags ... === TestName: test_02_edit_primary_storage_tags | Status : SUCCESS ===
ok
Test Volume migration options for Storage Pools with different Storage Tags ... SKIP: Skipping test as it is not running on simulator
----------------------------------------------------------------------
Ran 5 tests in 295.996s
OK (SKIP=2)

@rafaelweingartner@mike-tutkowski@karuturi can you please review marvin tests added?

@karuturi

Copy link
Copy Markdown
Member

Thanks @nvazquez Waiting for LGTMs

@serg38

Copy link
Copy Markdown

@nvazquez Looks like Travis cant SSH into management server during the test .

2017-03-17 19:26:58,672 - DEBUG - mount -t nfs nfs:/export/automation/1/testprimary /mnt/marvin-1b4190cb-b9f5-4441-9bdc-bd89e9b7567b
2017-03-17 19:27:13,468 - CRITICAL - EXCEPTION: test_03_migration_options_storage_tags: ['Traceback (most recent call last):\n', ' File "/opt/python/2.7.12/lib/python2.7/unittest/case.py", line 329, in run\n testMethod()\n', ' File "/home/travis/.local/lib/python2.7/site-packages/marvin/lib/decoratorGenerators.py", line 30, in test_wrapper\n return test(self, *args, **kwargs)\n', ' File "/home/travis/build/apache/cloudstack/test/integration/smoke/test_primary_storage.py", line 559, in test_03_migration_options_storage_tags\n log_lvl=logging.INFO\n', ' File "/home/travis/.local/lib/python2.7/site-packages/marvin/sshClient.py", line 81, in init\n raise internalError("SSH Connection Failed")\n', 'internalError: SSH Connection Failed\n']

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

Thanks @serg38, we are using mgtSvr details provided in .cfg file, should we use these for Marvin too?

@karuturi

Copy link
Copy Markdown
Member

@mike-tutkowski can you do a final review please?

@mike-tutkowski

Copy link
Copy Markdown
Member

I should have a chance to look through this later tonight. In the meanwhile, perhaps we can re-push the code to kick off Travis again (since its most recent run has a failure). Thanks!

@mike-tutkowski

Copy link
Copy Markdown
Member

OK, this LGTM (as long as Travis shows green before we merge). Thanks!

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

Thanks @mike-tutkowski! I pushed force to kick off Travis again

@nvazquez
nvazquezforce-pushed the CLOUDSTACK-9827 branch 2 times, most recently from b6f0d76 to 84ce38fCompareMarch 23, 2017 18:26
@nvazquez

Copy link
Copy Markdown
ContributorAuthor

@karuturi I refactored last marvin test which was failing on Travis. These are results in our env:

[root@ussarlabcsmgt41 cloudstack]# cat /tmp//MarvinLogs//4GSNSY/results.txt
Test primary storage pools - XEN. Not Supported for kvm,hyperv,vmware ... SKIP: iscsi primary storage not supported on kvm, VMWare, Hyper-V, or LXC
Test primary storage pools - XEN, KVM, VMWare. Not Supported for hyperv ... === TestName: test_01_primary_storage_nfs | Status : SUCCESS ===
ok
Test Deploy VMS using different Service Offerings with Storage Tags ... === TestName: test_01_deploy_vms_storage_tags | Status : SUCCESS ===
ok
Test Edit Storage Tags ... === TestName: test_02_edit_primary_storage_tags | Status : SUCCESS ===
ok
Test Volume migration options for Storage Pools with different Storage Tags ... === TestName: test_03_migration_options_storage_tags | Status : SUCCESS ===
ok
----------------------------------------------------------------------
Ran 5 tests in 442.216s
OK (SKIP=1)

@rhtyd @borisstoyanov@jburwell on test_primary_storage.py we are creating 2 primary storages, using urls in "nfs" and "nfs2" test data templates. As PR #1961 uses "nfs2" template on test_snapshots.py, should it be a problem for BlueOrangutan?

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

@karuturi Travis is now failing as it doesn't find key "nfs2"

2017-03-24 17:33:45,621 - CRITICAL - EXCEPTION: test_03_migration_options_storage_tags: ['Traceback (most recent call last):\n', ' File "/opt/python/2.7.12/lib/python2.7/unittest/case.py", line 329, in run\n testMethod()\n', ' File "/home/travis/.local/lib/python2.7/site-packages/marvin/lib/decoratorGenerators.py", line 30, in test_wrapper\n return test(self, *args, **kwargs)\n', ' File "/home/travis/build/apache/cloudstack/test/integration/smoke/test_primary_storage.py", line 520, in test_03_migration_options_storage_tags\n self.services["nfs2"],\n', "KeyError: 'nfs2'\n"]

It is introduced in PR #1961, can these two PRs be merged together?

@karuturi

Copy link
Copy Markdown
Member

Thank you all. I will merge #1961 and #1994 now

@asfgit
asfgit merged commit edf0e2b into apache:masterMar 28, 2017
asfgit pushed a commit that referenced this pull request Mar 28, 2017
CLOUDSTACK-9827: Storage tags stored in multiple placesIssue description: https://issues.apache.org/jira/browse/CLOUDSTACK-9827
### Fixes
- Create Primary Storage: Persist tags into `storage_pool_tags` instead of `storage_pool_details`
- List Storage Tags: Queries `storage_pool_tags` table instead of `storage_tag_view`
- Find Storage Pools by Tags using proper DAO
- Remove storage tags after deleting Primary Storage
- Remove unused `StorageTagDao`, `StorageTagDaoImpl`, `StorageTagVO` and `storage_tag_view`
* pr/1994:
CLOUDSTACK-9827: Storage tags stored in multiple places
Signed-off-by: Rajani Karuturi <rajani.karuturi@accelerite.com>
verify(primaryDataStoreDao).getSqlPreparedStatement(
primaryDataStoreDao.TagsSqlPrefix, primaryDataStoreDao.TagsSqlSuffix, SQL_VALUES, CLUSTER_ID);
String expectedSql = primaryDataStoreDao.TagsSqlPrefix + SQL_VALUES + primaryDataStoreDao.TagsSqlSuffix;
verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_TAGS_ARRAY.length);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvazquez With these types of test we are kind of forcing the SQL statement to use in implementation. Do you think this is correct thing to test? What if somebody wants to rewrite in different way altogether to achieve the same result?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @anshul1886,
I understand your point of view and I think it is valid. However, from my point of view these unit tests are covering internal methods used in the implementation. For example, for method String getSqlValuesFromStorageTags(String[] tags) tests provided cover cases when parameter is null, empty or not null. As this method returns a string, it is the goal of unit tests to check if the string returned by the method is the one we expect for each of those cases, and in my opinion, it is being tested properly. I mention this particular method as string returned is a SQL statement.
The last two tests in this file are testing findPoolsByDetailsOrTagsInternal, comparing returned list with the one expected and also verifying that internal methods are invoked with expected parameters, but these parametes are strings (SQL statements). From my point of view, we are not forcing SQL statement to use, we are checking that internal methods are being invoked properly.
In this way, if method is refactored but achieves the same result, we have to modify/remove lines which verifies if internal methods are invoked for the ones that belong to new implementation.
Please let me know if I didn't explain myself, what do you think? I don't mean to be stubborn with this, it was my point of view, and of course I might be wrong. What do you think it has to be refactored in these tests?

@anshul1886

Copy link
Copy Markdown

@nvazquez I have this PR #1835 which is making changes in that SQL. Now the the tests written by you are not allowing those changes. How should we go about it?

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

Hi @anshul1886, you can modify verify lines on tests testFindPoolsByDetailsOrTagsInternalStorageTagsType and testFindPoolsByDetailsOrTagsInternalDetailsType for the ones that methods will expect, or if you want you can delete them to not be tied to SQL implementation

@anshul1886

Copy link
Copy Markdown

@nvazquez Is it ok for you to remove those tests?

@nvazquez

Copy link
Copy Markdown
ContributorAuthor

@anshul1886 I would prefer that you delete verify lines on those tests, but if you want to remove tests it is ok for me.

@nvazquez
nvazquez deleted the CLOUDSTACK-9827 branch April 6, 2020 14:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@nvazquez@serg38@borisstoyanov@blueorangutan@rafaelweingartner@mike-tutkowski@karuturi@anshul1886@asfgit