397
397
type="na:DatasetMemberParameter"/>
399
399
</xsd:complexType>
400
<xsd:complexType name="ArrayOfDfmMetadataField">
402
<xsd:element maxOccurs="unbounded" name="DfmMetadataField"
403
type="na:DfmMetadataField"/>
400
406
<xsd:complexType name="ArrayOfDpJobProgressEventInfo">
402
408
<xsd:element maxOccurs="unbounded" name="DpJobProgressEventInfo"
438
444
<xsd:complexType name="DatasetInfo">
440
446
<xsd:element name="DatasetId" type="na:ObjId"/>
447
<xsd:element name="DatasetName" type="na:ObjName"/>
448
<xsd:element name="DatasetMetadata" type="na:ArrayOfDfmMetadataField"/>
442
450
</xsd:complexType>
443
451
<xsd:complexType name="DatasetLunMappingInfo">
456
464
<xsd:element name="ObjectNameOrId" type="na:ObjNameOrId"/>
458
466
</xsd:complexType>
467
<xsd:complexType name="DfmMetadataField">
469
<xsd:element name="FieldName" type="xsd:string"/>
470
<xsd:element name="FieldValue" type="xsd:string"/>
459
473
<xsd:complexType name="DpJobProgressEventInfo">
461
475
<xsd:element name="EventStatus" type="na:ObjStatus"/>
642
657
global iter_count
643
658
global iter_table
644
659
if 'DatasetListInfoIterStart' == api:
660
iter_name = 'dataset_%s' % iter_count
661
iter_count = iter_count + 1
662
iter_table[iter_name] = 0
645
663
body = """<na:DatasetListInfoIterStartResult>
646
664
<na:Records>1</na:Records>
647
<na:Tag>dataset</na:Tag>
648
</na:DatasetListInfoIterStartResult>"""
666
</na:DatasetListInfoIterStartResult>""" % iter_name
649
667
elif 'DatasetListInfoIterNext' == api:
650
body = """<na:DatasetListInfoIterNextResult>
653
<na:DatasetId>0</na:DatasetId>
656
<na:Records>1</na:Records>
657
</na:DatasetListInfoIterNextResult>"""
668
tags = body.xpath('na:DatasetListInfoIterNext/na:Tag',
670
iter_name = tags[0].text
671
if iter_table[iter_name]:
672
body = """<na:DatasetListInfoIterNextResult>
673
<na:Datasets></na:Datasets>
674
<na:Records>0</na:Records>
675
</na:DatasetListInfoIterNextResult>"""
677
iter_table[iter_name] = 1
678
body = """<na:DatasetListInfoIterNextResult>
681
<na:DatasetId>0</na:DatasetId>
683
<na:DfmMetadataField>
684
<na:FieldName>OpenStackProject</na:FieldName>
685
<na:FieldValue>testproj</na:FieldValue>
686
</na:DfmMetadataField>
687
<na:DfmMetadataField>
688
<na:FieldName>OpenStackVolType</na:FieldName>
689
<na:FieldValue></na:FieldValue>
690
</na:DfmMetadataField>
691
</na:DatasetMetadata>
692
<na:DatasetName>OpenStack_testproj</na:DatasetName>
695
<na:Records>1</na:Records>
696
</na:DatasetListInfoIterNextResult>"""
658
697
elif 'DatasetListInfoIterEnd' == api:
659
698
body = """<na:DatasetListInfoIterEndResult/>"""
660
699
elif 'DatasetEditBegin' == api:
692
731
body = """<na:DpJobProgressEventListIterNextResult/>"""
694
733
iter_table[iter_name] = 1
734
name = ('filer:/OpenStack_testproj/volume-00000001/'
695
736
body = """<na:DpJobProgressEventListIterNextResult>
696
737
<na:ProgressEvents>
697
738
<na:DpJobProgressEventInfo>
699
740
<na:EventType>lun-create</na:EventType>
700
741
<na:ProgressLunInfo>
701
742
<na:LunPathId>0</na:LunPathId>
743
<na:LunName>%s</na:LunName>
702
744
</na:ProgressLunInfo>
703
745
</na:DpJobProgressEventInfo>
704
746
<na:DpJobProgressEventInfo>
707
749
</na:DpJobProgressEventInfo>
708
750
</na:ProgressEvents>
709
751
<na:Records>2</na:Records>
710
</na:DpJobProgressEventListIterNextResult>"""
752
</na:DpJobProgressEventListIterNextResult>""" % name
711
753
elif 'DpJobProgressEventListIterEnd' == api:
712
754
body = """<na:DpJobProgressEventListIterEndResult/>"""
713
755
elif 'DatasetMemberListInfoIterStart' == api:
756
iter_name = 'datasetmember_%s' % iter_count
757
iter_count = iter_count + 1
758
iter_table[iter_name] = 0
714
759
body = """<na:DatasetMemberListInfoIterStartResult>
715
760
<na:Records>1</na:Records>
716
<na:Tag>dataset-member</na:Tag>
717
</na:DatasetMemberListInfoIterStartResult>"""
762
</na:DatasetMemberListInfoIterStartResult>""" % iter_name
718
763
elif 'DatasetMemberListInfoIterNext' == api:
719
name = 'filer:/OpenStack_testproj/volume-00000001/volume-00000001'
720
body = """<na:DatasetMemberListInfoIterNextResult>
722
<na:DatasetMemberInfo>
723
<na:MemberId>0</na:MemberId>
724
<na:MemberName>%s</na:MemberName>
725
</na:DatasetMemberInfo>
727
<na:Records>1</na:Records>
728
</na:DatasetMemberListInfoIterNextResult>""" % name
764
tags = body.xpath('na:DatasetMemberListInfoIterNext/na:Tag',
766
iter_name = tags[0].text
767
if iter_table[iter_name]:
768
body = """<na:DatasetMemberListInfoIterNextResult>
769
<na:DatasetMembers></na:DatasetMembers>
770
<na:Records>0</na:Records>
771
</na:DatasetMemberListInfoIterNextResult>"""
773
iter_table[iter_name] = 1
774
name = ('filer:/OpenStack_testproj/volume-00000001/'
776
body = """<na:DatasetMemberListInfoIterNextResult>
778
<na:DatasetMemberInfo>
779
<na:MemberId>0</na:MemberId>
780
<na:MemberName>%s</na:MemberName>
781
</na:DatasetMemberInfo>
783
<na:Records>1</na:Records>
784
</na:DatasetMemberListInfoIterNextResult>""" % name
729
785
elif 'DatasetMemberListInfoIterEnd' == api:
730
786
body = """<na:DatasetMemberListInfoIterEndResult/>"""
731
787
elif 'HostListInfoIterStart' == api:
890
946
class NetAppDriverTestCase(test.TestCase):
891
947
"""Test case for NetAppISCSIDriver"""
892
STORAGE_SERVICE = 'Thin Provisioned Space for VMFS Datastores'
948
STORAGE_SERVICE = 'Openstack Service'
949
STORAGE_SERVICE_PREFIX = 'Openstack Service-'
893
950
PROJECT_ID = 'testproj'
894
951
VOLUME_NAME = 'volume-00000001'
895
953
VOLUME_SIZE = 2147483648L # 2 GB
896
954
INITIATOR = 'iqn.1993-08.org.debian:01:23456789'
899
957
super(NetAppDriverTestCase, self).setUp()
900
958
driver = netapp.NetAppISCSIDriver()
901
959
self.stubs.Set(httplib, 'HTTPConnection', FakeHTTPConnection)
902
driver._create_client('http://localhost:8088/dfm.wsdl',
903
'root', 'password', 'localhost', 8088)
960
driver._create_client(wsdl_url='http://localhost:8088/dfm.wsdl',
961
login='root', password='password',
962
hostname='localhost', port=8088, cache=False)
904
963
driver._set_storage_service(self.STORAGE_SERVICE)
964
driver._set_storage_service_prefix(self.STORAGE_SERVICE_PREFIX)
965
driver._set_vfiler('')
905
966
self.driver = driver
907
968
def test_connect(self):
908
969
self.driver.check_for_setup_error()
910
971
def test_create_destroy(self):
972
self.driver._discover_luns()
911
973
self.driver._provision(self.VOLUME_NAME, None, self.PROJECT_ID,
974
self.VOLUME_TYPE, self.VOLUME_SIZE)
913
975
self.driver._remove_destroy(self.VOLUME_NAME, self.PROJECT_ID)
915
977
def test_map_unmap(self):
978
self.driver._discover_luns()
916
979
self.driver._provision(self.VOLUME_NAME, None, self.PROJECT_ID,
980
self.VOLUME_TYPE, self.VOLUME_SIZE)
918
981
volume = {'name': self.VOLUME_NAME, 'project_id': self.PROJECT_ID,
919
982
'id': 0, 'provider_auth': None}
920
983
updates = self.driver._get_export(volume)