[ https://issues.apache.org/jira/browse/CLOUDSTACK-9438?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15530047#comment-15530047
]
ASF GitHub Bot commented on CLOUDSTACK-9438:
--------------------------------------------
Github user nvazquez commented on a diff in the pull request:
https://github.com/apache/cloudstack/pull/1615#discussion_r80951612
--- Diff: test/integration/smoke/test_ssvm.py ---
@@ -1197,3 +1205,148 @@ def test_10_destroy_cpvm(self):
# Call to verify cloud process is running
self.test_04_cpvm_internals()
return
+
+ @attr(
+ tags=[
+ "advanced",
+ "advancedns",
+ "smoke",
+ "basic",
+ "sg"],
+ required_hardware="true")
+ def test_11_ss_nfs_version_on_ssvm(self):
+ """Test NFS Version on Secondary Storage mounted properly on SSVM
+ """
+
+ # 1) List SSVM in zone
+ # 2) Get id and url from mounted nfs store
+ # 3) Update NFS version for previous image store
+ # 4) Stop SSVM
+ # 5) Check NFS version of mounted nfs store after SSVM starts
+
+ nfs_version = self.config.nfsVersion
+ if nfs_version == None:
+ self.skipTest('No NFS version provided in test data')
+
+ #List SSVM for zone id
+ list_ssvm_response = list_ssvms(
+ self.apiclient,
+ systemvmtype='secondarystoragevm',
+ state='Running',
+ zoneid=self.zone.id
+ )
+ self.assertEqual(
+ isinstance(list_ssvm_response, list),
+ True,
+ "Check list response returns a valid list"
+ )
+ self.assertEqual(
+ len(list_ssvm_response),
+ 1,
+ "Check list System VMs response"
+ )
+
+ ssvm = list_ssvm_response[0]
+ image_stores_response = ImageStore.list(self.apiclient,zoneid=self.zone.id)
+
+ if self.hypervisor.lower() in ('vmware', 'hyperv'):
+ # SSH into SSVMs is done via management server for Vmware and Hyper-V
+ result = get_process_status(
+ self.apiclient.connection.mgtSvr,
+ 22,
+ self.apiclient.connection.user,
+ self.apiclient.connection.passwd,
+ ssvm.privateip,
+ "mount | grep 'type nfs'",
+ hypervisor=self.hypervisor)
+
+ for res in result:
+ split_res = res.split(" on ")
+ mounted_img_store_url = split_res[0]
+ for img_store in image_stores_response:
+ img_store_url = str(img_store.url)
+ if img_store_url.startswith("nfs://"):
+ img_store_url = img_store_url[6:]
+ #Add colon after ip address to match output from mount command
+ first_slash = img_store_url.find('/')
+ img_store_url = img_store_url[0:first_slash] + ':' + img_store_url[first_slash:]
+ if img_store_url == mounted_img_store_url:
+ img_store_id = img_store.id
+ break
+
+ self.assertNotEqual(
+ img_store_id,
+ None,
+ "Check image store id mounted on SSVM"
+ )
+
+ #Update NFS version for image store mounted on SSVM
+ updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
+ updateConfigurationCmd.name = "secstorage.nfs.version"
+ updateConfigurationCmd.value = nfs_version
+ updateConfigurationCmd.imagestoreuuid = img_store_id
+
+ updateConfigurationResponse = self.apiclient.updateConfiguration(updateConfigurationCmd)
+ self.logger.debug("updated the parameter %s with value %s"%(updateConfigurationResponse.name,
updateConfigurationResponse.value))
+
+ #Stop SSVM
+ self.debug("Stopping SSVM: %s" % ssvm.id)
+ cmd = stopSystemVm.stopSystemVmCmd()
+ cmd.id = ssvm.id
+ self.apiclient.stopSystemVm(cmd)
+
+ timeout = self.services["timeout"]
+ while True:
+ list_ssvm_response = list_ssvms(
+ self.apiclient,
+ id=ssvm.id
+ )
+ if isinstance(list_ssvm_response, list):
+ if list_ssvm_response[0].state == 'Running':
+ break
+ if timeout == 0:
+ raise Exception("List SSVM call failed!")
+
+ time.sleep(self.services["sleep"])
+ timeout = timeout - 1
+
+ self.assertEqual(
+ isinstance(list_ssvm_response, list),
+ True,
+ "Check list response returns a valid list"
+ )
+ ssvm = list_ssvm_response[0]
+ self.debug("SSVM state after debug: %s" % ssvm.state)
+ self.assertEqual(
+ ssvm.state,
+ 'Running',
+ "Check whether SSVM is running or not"
+ )
+ # Wait for the agent to be up
+ self.waitForSystemVMAgent(ssvm.name)
+
+ #Check NFS version on mounted image store
+ result = get_process_status(
+ self.apiclient.connection.mgtSvr,
+ 22,
+ self.apiclient.connection.user,
+ self.apiclient.connection.passwd,
+ ssvm.privateip,
+ "mount | grep '%s'"%mounted_img_store_url,
+ hypervisor=self.hypervisor)
--- End diff --
Done, thanks
> Fix for CLOUDSTACK-9252 - Make NFS version changeable in UI
> -----------------------------------------------------------
>
> Key: CLOUDSTACK-9438
> URL: https://issues.apache.org/jira/browse/CLOUDSTACK-9438
> Project: CloudStack
> Issue Type: Improvement
> Security Level: Public(Anyone can view this level - this is the default.)
> Reporter: Nicolas Vazquez
> Assignee: Nicolas Vazquez
>
> h3. Introduction
> From [9252|https://issues.apache.org/jira/browse/CLOUDSTACK-9252] it was possible to
configure NFS version for secondary storage mount.
> However, changing NFS version requires inserting an new detail on {{image_store_details}}
table, with {{name = 'nfs.version'}} and {{value = X}} where X is desired NFS version, and
then restarting management server for changes to take effect.
> Our improvement aims to make NFS version changeable from UI, instead of previously described
workflow.
> h3. Proposed solution
> Basically, NFS version is defined as an image store ConfigKey, this implied:
> * Adding a new Config scope: *ImageStore*
> * Make {{ImageStoreDetailsDao}} class to extend {{ResourceDetailsDaoBase}} and {{ImageStoreDetailVO}}
implement {{ResourceDetail}}
> * Insert {{'display'}} column on {{image_store_details}} table
> * Extending {{ListCfgsCmd}} and {{UpdateCfgCmd}} to support *ImageStore* scope, which
implied:
> ** Injecting {{ImageStoreDetailsDao}} and {{ImageStoreDao}} on {{ConfigurationManagerImpl}}
class, on {{cloud-server}} module.
> h4. Important
> It is important to mention that {{ImageStoreDaoImpl}} and {{ImageStoreDetailsDaoImpl}}
classes were moved from {{cloud-engine-storage}} to {{cloud-engine-schema}} module in order
to Spring find those beans to inject on {{ConfigurationManagerImpl}} in {{cloud-server}} module.
> We had this maven dependencies between modules:
> * {{cloud-server --> cloud-engine-schema}}
> * {{cloud-engine-storage --> cloud-secondary-storage --> cloud-server}}
> As {{ImageStoreDaoImpl}} and {{ImageStoreDetailsDaoImpl}} were defined in {{cloud-engine-storage}},
and they needed in {{cloud-server}} module, to be injected on {{ConfigurationManagerImpl}},
if we added dependency from {{cloud-server}} to {{cloud-engine-storage}} we would introduce
a dependency cycle. To avoid this cycle, we moved those classes to {{cloud-engine-schema}}
module
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
|