Proper way to import vdsm types/constants when using its API?

Hi, I'm finding a bit confusing what is the correct way to import VDSM types/enums/contants when using the VDSM API. For example, vdsmapi tests and the hosted-engine-ha daemons seem to use a bunch of values defined in constants or hardcoded, not really doing an import for this. i.e.: ovirt_hosted_engine_ha/env/constants.py.in:66:STORAGE_TYPE_NFS = 1 I don't want to do this: getStorageDomains(storageType=1) If I want to avoid hard-coding constants on my program, what is the correct way to do it? Like this? import vdsm.storage.sd getStorageDomains(storageType=sd.NFS_DOMAIN) Problem is vdsm.storage.sd does not seem to be part of the public API, clients shouldn't be seeing all that. Hopefully there is an easy answer I am missing. I'm looking for something similar to ovirtsdk4.types. Thanks, Germano

On Mon, Jun 11, 2018 at 9:59 AM Germano Veit Michel <germano@redhat.com> wrote:
Hi,
I'm finding a bit confusing what is the correct way to import VDSM types/enums/contants when using the VDSM API.
For example, vdsmapi tests and the hosted-engine-ha daemons seem to use a bunch of values defined in constants or hardcoded, not really doing an import for this. i.e.: ovirt_hosted_engine_ha/env/constants.py.in:66:STORAGE_TYPE_NFS = 1
I don't want to do this: getStorageDomains(storageType=1)
If I want to avoid hard-coding constants on my program, what is the correct way to do it? Like this?
import vdsm.storage.sd getStorageDomains(storageType=sd.NFS_DOMAIN)
Problem is vdsm.storage.sd does not seem to be part of the public API, clients shouldn't be seeing all that.
Correct, the constants are not part of the API, because vdsm API is generally not a public supported API. So in your current scripts you need to hard code these values. Can you file a bug to add the missing constants to the api? I think all the values should be in the schema, and they should be accessible via the vdsmclient package. Nir
Hopefully there is an easy answer I am missing. I'm looking for something similar to ovirtsdk4.types.
Thanks, Germano
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives: https://lists.ovirt.org/archives/list/devel@ovirt.org/message/JGIW7MS6MPUM6Y...

On Mon, Jun 11, 2018 at 1:26 PM, Nir Soffer <nsoffer@redhat.com> wrote:
On Mon, Jun 11, 2018 at 9:59 AM Germano Veit Michel <germano@redhat.com> wrote:
Hi,
I'm finding a bit confusing what is the correct way to import VDSM types/enums/contants when using the VDSM API.
For example, vdsmapi tests and the hosted-engine-ha daemons seem to use a bunch of values defined in constants or hardcoded, not really doing an import for this. i.e.: ovirt_hosted_engine_ha/env/constants.py.in:66:STORAGE_TYPE_NFS = 1
I don't want to do this: getStorageDomains(storageType=1)
If I want to avoid hard-coding constants on my program, what is the correct way to do it? Like this?
import vdsm.storage.sd getStorageDomains(storageType=sd.NFS_DOMAIN)
Problem is vdsm.storage.sd does not seem to be part of the public API, clients shouldn't be seeing all that.
Correct, the constants are not part of the API, because vdsm API is generally not a public supported API.
... which brings up the question: why do you need to access it Germano?
So in your current scripts you need to hard code these values.
Can you file a bug to add the missing constants to the api?
I think all the values should be in the schema, and they should be accessible via the vdsmclient package.
Nir
Hopefully there is an easy answer I am missing. I'm looking for something similar to ovirtsdk4.types.
Thanks, Germano
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives: https://lists.ovirt.org/archives/list/devel@ovirt.org/message/JGIW7MS6MPUM6Y...
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives: https://lists.ovirt.org/archives/list/devel@ovirt.org/message/WXY2PKBB2XUKLC...

On Mon, Jun 11, 2018 at 10:47 PM, Dan Kenigsberg <danken@redhat.com> wrote:
On Mon, Jun 11, 2018 at 1:26 PM, Nir Soffer <nsoffer@redhat.com> wrote:
On Mon, Jun 11, 2018 at 9:59 AM Germano Veit Michel <germano@redhat.com> wrote:
Hi,
I'm finding a bit confusing what is the correct way to import VDSM types/enums/contants when using the VDSM API.
For example, vdsmapi tests and the hosted-engine-ha daemons seem to use
a
bunch of values defined in constants or hardcoded, not really doing an import for this. i.e.: ovirt_hosted_engine_ha/env/constants.py.in:66:STORAGE_TYPE_NFS = 1
I don't want to do this: getStorageDomains(storageType=1)
If I want to avoid hard-coding constants on my program, what is the correct way to do it? Like this?
import vdsm.storage.sd getStorageDomains(storageType=sd.NFS_DOMAIN)
Problem is vdsm.storage.sd does not seem to be part of the public API, clients shouldn't be seeing all that.
Correct, the constants are not part of the API, because vdsm API is generally not a public supported API.
... which brings up the question: why do you need to access it Germano?
Just sending a simple change to the sos plugin, and I need to pass a constant. https://gerrit.ovirt.org/#/c/92153/
So in your current scripts you need to hard code these values.
Can you file a bug to add the missing constants to the api?
I think all the values should be in the schema, and they should be accessible via the vdsmclient package.
Hi Nir, thanks for helping. Well, the value is part of the schema AFAICS. Maybe I'm doing something wrong, but this is what I get: 1. I want to set domainClass on a getStorageDomains() call. # vdsm-client Host getStorageDomains -h usage: vdsm-client Host getStorageDomains [-h] [arg=value [arg=value ...]] positional arguments: arg=value storageType: Limit to Domains of this StorageDomainType storagepoolID: Limit to Domains belonging to this Storage Pool remotePath: Limit to Domains having this remotePath. domainClass: Limit to Domains of this StorageDomainImageClass <--------------- JSON representation: { "storageType": { "StorageDomainType": "enum ['FCP', 'CIFS', 'UNKNOWN', 'ISCSI', 'GLUSTERFS', 'LOCALFS', 'NFS', 'SHAREDFS']" }, "storagepoolID": { "UUID": "UUID" }, "remotePath": "string", "domainClass": { "StorageDomainImageClass": "enum ['Iso', 'Data', 'Backup', 'Unknown']" } } This is its type: StorageDomainImageClass: &StorageDomainImageClass added: '3.1' description: An enumeration of Storage Domain classes. name: StorageDomainImageClass type: enum values: Backup: The Storage Domain is used for import and export of disk images Data: The Storage Domain is used for virtual machine disk images Iso: The Storage Domain is used for storing ISO images Unknown: The class is not known But if I do this (or in sos.py) # vdsm-client Host getStorageDomains domainClass=Data Then the "Data" parameter ends up a unicode 'Data' and the comparison to the actual integer constant (1=DATA_DOMAIN) returns False, giving me no storage domains at all: 2018-06-12 13:58:31,266+1000 INFO (jsonrpc/5) [vdsm.api] START getStorageDomainsList(spUUID=None, domainClass=u'Data', storageType=None, remotePath=None, options=None) from=::1,60192, task_id=be93ee8d-d4d4-42c2-a292-9aeadf88e3da (api:46) 2018-06-12 13:58:31,608+1000 INFO (jsonrpc/5) [vdsm.api] FINISH getStorageDomainsList return={'domlist': []} from=::1,60192, task_id=be93ee8d-d4d4-42c2-a292-9aeadf88e3da (api:52) That is why I'm trying to import the constant from the API. Am I missing something? Is there a special way to use these values defined by enums?
Nir
Hopefully there is an easy answer I am missing. I'm looking for
something
similar to ovirtsdk4.types.
Thanks, Germano
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives: https://lists.ovirt.org/archives/list/devel@ovirt.org/message/ JGIW7MS6MPUM6YLINPMJ3JLVBKPXQK7A/
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives: https://lists.ovirt.org/archives/list/devel@ovirt.org/message/ WXY2PKBB2XUKLCREUITVORP3WZD5VTPT/

On Tue, Jun 12, 2018 at 7:02 AM Germano Veit Michel <germano@redhat.com> wrote:
On Mon, Jun 11, 2018 at 10:47 PM, Dan Kenigsberg <danken@redhat.com> wrote:
On Mon, Jun 11, 2018 at 1:26 PM, Nir Soffer <nsoffer@redhat.com> wrote:
On Mon, Jun 11, 2018 at 9:59 AM Germano Veit Michel <germano@redhat.com
wrote:
Hi,
I'm finding a bit confusing what is the correct way to import VDSM types/enums/contants when using the VDSM API.
For example, vdsmapi tests and the hosted-engine-ha daemons seem to
use a
bunch of values defined in constants or hardcoded, not really doing an import for this. i.e.: ovirt_hosted_engine_ha/env/constants.py.in:66:STORAGE_TYPE_NFS = 1
I don't want to do this: getStorageDomains(storageType=1)
If I want to avoid hard-coding constants on my program, what is the correct way to do it? Like this?
import vdsm.storage.sd getStorageDomains(storageType=sd.NFS_DOMAIN)
Problem is vdsm.storage.sd does not seem to be part of the public API, clients shouldn't be seeing all that.
Correct, the constants are not part of the API, because vdsm API is generally not a public supported API.
... which brings up the question: why do you need to access it Germano?
Just sending a simple change to the sos plugin, and I need to pass a constant. https://gerrit.ovirt.org/#/c/92153/
So in your current scripts you need to hard code these values.
Can you file a bug to add the missing constants to the api?
I think all the values should be in the schema, and they should be accessible via the vdsmclient package.
Hi Nir, thanks for helping.
Well, the value is part of the schema AFAICS. Maybe I'm doing something wrong, but this is what I get:
1. I want to set domainClass on a getStorageDomains() call.
# vdsm-client Host getStorageDomains -h usage: vdsm-client Host getStorageDomains [-h] [arg=value [arg=value ...]]
positional arguments: arg=value storageType: Limit to Domains of this StorageDomainType storagepoolID: Limit to Domains belonging to this Storage Pool remotePath: Limit to Domains having this remotePath. domainClass: Limit to Domains of this StorageDomainImageClass <---------------
JSON representation: { "storageType": { "StorageDomainType": "enum ['FCP', 'CIFS', 'UNKNOWN', 'ISCSI', 'GLUSTERFS', 'LOCALFS', 'NFS', 'SHAREDFS']" }, "storagepoolID": { "UUID": "UUID" }, "remotePath": "string", "domainClass": { "StorageDomainImageClass": "enum ['Iso', 'Data', 'Backup', 'Unknown']" } }
This is its type:
StorageDomainImageClass: &StorageDomainImageClass added: '3.1' description: An enumeration of Storage Domain classes. name: StorageDomainImageClass type: enum values: Backup: The Storage Domain is used for import and export of disk images Data: The Storage Domain is used for virtual machine disk images Iso: The Storage Domain is used for storing ISO images Unknown: The class is not known
But if I do this (or in sos.py)
# vdsm-client Host getStorageDomains domainClass=Data
Then the "Data" parameter ends up a unicode 'Data' and the comparison to the actual integer constant (1=DATA_DOMAIN) returns False, giving me no storage domains at all:
2018-06-12 13:58:31,266+1000 INFO (jsonrpc/5) [vdsm.api] START getStorageDomainsList(spUUID=None, domainClass=u'Data', storageType=None, remotePath=None, options=None) from=::1,60192, task_id=be93ee8d-d4d4-42c2-a292-9aeadf88e3da (api:46) 2018-06-12 13:58:31,608+1000 INFO (jsonrpc/5) [vdsm.api] FINISH getStorageDomainsList return={'domlist': []} from=::1,60192, task_id=be93ee8d-d4d4-42c2-a292-9aeadf88e3da (api:52)
Yes, unfortunately, someone decided to optimize enums by sending the integer value, since the integer 1 is smaller than the string "Data". We know that the schema sometimes document the wrong thing about enums.
That is why I'm trying to import the constant from the API.
Am I missing something? Is there a special way to use these values defined by enums?
I don't know of such way, but importing internal modules like API.py is not a good way. I suggest to hard code the value 1 until we expose it properly in the vdsmclient package. Nir
Nir
Hopefully there is an easy answer I am missing. I'm looking for
something
similar to ovirtsdk4.types.
Thanks, Germano
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives:
https://lists.ovirt.org/archives/list/devel@ovirt.org/message/JGIW7MS6MPUM6Y...
_______________________________________________ Devel mailing list -- devel@ovirt.org To unsubscribe send an email to devel-leave@ovirt.org Privacy Statement: https://www.ovirt.org/site/privacy-policy/ oVirt Code of Conduct: https://www.ovirt.org/community/about/community-guidelines/ List Archives:
https://lists.ovirt.org/archives/list/devel@ovirt.org/message/WXY2PKBB2XUKLC...
participants (3)
-
Dan Kenigsberg
-
Germano Veit Michel
-
Nir Soffer