Esempio n. 1
0
 def test_build_provision_request_calls_prep_attributes(self, prep_attributes_patch):
     d = Device()
     d.name = 'test'
     d.type = 'Polycom SoundPoint IP 650 + Expansion Module(1)'
     g = d.build_provision_request()
     # expect to see two calls
     self.assertEqual(2, len(prep_attributes_patch.call_args_list))
Esempio n. 2
0
    def test_overwrite_when_no_name_and_fetch_returns_result(self, find_device_patch, delete_patch):
        i = instance_factory(instance='test')
        d = Device(mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i)
        d.overwrite()

        # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft
        self.assertFalse(delete_patch.called)
Esempio n. 3
0
 def test_bootstrap_find_result(self):
     result = {'Available Ports': 'Unlimited', 'Status': 'Online', 'Device Type': 'Generic SIP Phone',
               'Net Address': None, 'Version': None, 'Device Name': 'Tim Beaver', 'MAC Address': 'aabbcc112233'}
     d = Device()
     d.bootstrap_find_result(result=result)
     self.assertEqual(d.mac_address, result['MAC Address'])
     self.assertEqual(d.type, result['Device Type'])
     self.assertEqual(d.name, result['Device Name'])
     self.assertIsNone(d.is_primary)
Esempio n. 4
0
 def test_from_shared_call_appearance(self):
     row = {'Mac Address': 'aa:bb:cc:dd:ee:ff', 'Device Level': 'Group', 'Allow Termination': 'true', 'Allow Origination': 'true', 'Device Type': 'Polycom-VVX1500', 'Is Active': 'true', 'Port Number': None, 'Line/Port': '*****@*****.**', 'Device Support Visual Device Management': 'false', 'Device Name': 'beavervvx', 'SIP Contact': 'sip:'}
     d = Device()
     d.bootstrap_shared_call_appearance(sca=row)
     self.assertEqual(d.mac_address, row['Mac Address'])
     self.assertEqual(d.type, row['Device Type'])
     self.assertEqual(d.line_port, row['Line/Port'])
     self.assertEqual(d.name, row['Device Name'])
     self.assertFalse(d.is_primary)
Esempio n. 5
0
 def test_fetch_passes_broadsoft_instance(
         self, get_device_patch, from_xml_patch
 ):
     d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory())
     d.fetch(target_name='dname')
     call = get_device_patch.call_args_list[0]
     args, kwargs = call
     self.assertIsInstance(kwargs['broadsoftinstance'],
                           broadsoft.requestobjects.lib.BroadsoftRequest.BroadsoftInstance)
Esempio n. 6
0
    def test_device_default_protocols_respected(self):
        d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone',
                   mac_address='aabbcc112233', protocol=None, transport_protocol=None)
        ro = d.build_provision_request()

        g = GroupAccessDeviceAddRequest()

        self.assertEqual(ro.protocol, g.protocol)
        self.assertEqual(ro.transport_protocol, g.transport_protocol)
Esempio n. 7
0
    def test_set_password_injects_broadsoftinstance(
            self, inject_broadsoftinstance_patch, post_patch
    ):
        d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(), name='dname')
        d.set_password(sip_password='******', did=6175551212)
        self.assertTrue(inject_broadsoftinstance_patch.called)
        self.assertEqual(1, len(inject_broadsoftinstance_patch.call_args_list))

        call = inject_broadsoftinstance_patch.call_args_list[0]
        args, kwargs = call
        self.assertIsInstance(kwargs['child'], GroupAccessDeviceModifyRequest)
Esempio n. 8
0
    def test_build_provision_request_injects_broadsoftinstance(
            self, inject_broadsoftinstance_patch
    ):
        d = Device(broadsoftinstance=broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory())
        d.build_provision_request()
        self.assertTrue(inject_broadsoftinstance_patch.called)
        self.assertEqual(1, len(inject_broadsoftinstance_patch.call_args_list))

        call = inject_broadsoftinstance_patch.call_args_list[0]
        args, kwargs = call
        self.assertIsInstance(kwargs['child'], GroupAccessDeviceAddRequest)
Esempio n. 9
0
    def test_overwrite_when_name_provided(self, find_device_patch, delete_patch):
        i = instance_factory(instance='test')
        d = Device(name='beaverphone', mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i)
        d.overwrite()

        # should not have called find_device_by_mac_and_did() since have a name
        self.assertFalse(find_device_patch.called)

        # since a name was inherited, delete() should have been called
        # self.assertTrue(delete_patch.called)
        # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft
        self.assertFalse(delete_patch.called)
Esempio n. 10
0
    def test_xml_converted_to_elementtree_at_init(self):
        d = Device(xml="""
                    <ns0:BroadsoftDocument xmlns:ns0="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" protocol="OCI">
                    <sessionId>dhcp-18-189-4-125.dyn.mit.edu,2017-05-26 15:33:32.605555,3222027341</sessionId>
                    <command echo="" xsi:type="UserGetResponse21">
                        <serviceProviderId>ENT136</serviceProviderId>
                        <groupId>mit</groupId>
                        <lastName>Beaver</lastName>
                        <firstName>Tim</firstName>
                        <callingLineIdLastName>Beaver</callingLineIdLastName>
                        <callingLineIdFirstName>Tim</callingLineIdFirstName>
                        <hiraganaLastName>Beaver</hiraganaLastName>
                        <hiraganaFirstName>Tim</hiraganaFirstName>
                        <phoneNumber>2212221101</phoneNumber>
                        <extension>1101</extension>
                        <language>English</language>
                        <timeZone>America/New_York</timeZone>
                        <timeZoneDisplayName>(GMT-04:00) (US) Eastern Time</timeZoneDisplayName>
                        <defaultAlias>[email protected]</defaultAlias>
                        <accessDeviceEndpoint>
                            <accessDevice>
                                <deviceLevel>Group</deviceLevel>
                                <deviceName>beaver550</deviceName>
                            </accessDevice>
                            <linePort>[email protected]</linePort>
                            <staticRegistrationCapable>false</staticRegistrationCapable>
                            <useDomain>true</useDomain>
                            <supportVisualDeviceManagement>false</supportVisualDeviceManagement>
                        </accessDeviceEndpoint>
                        <countryCode>1</countryCode>
                    </command>
                    </ns0:BroadsoftDocument>
                """)

        self.assertIsInstance(d.xml, Element)
Esempio n. 11
0
    def test_skip_if_exists_set_attr(self):
        # Account should default to no
        a = Account()
        self.assertFalse(a.skip_if_exists)

        # Device should default to yes
        d = Device()
        self.assertTrue(d.skip_if_exists)

        # Can override Account
        a = Account(skip_if_exists=True)
        self.assertTrue(a.skip_if_exists)

        # Can override Device
        d = Device(skip_if_exists=False)
        self.assertFalse(d.skip_if_exists)
Esempio n. 12
0
    def test_skip_if_exists_for_device(self, post_patch):
        # this should not throw an error
        d = Device(skip_if_exists=True)
        d.provision()

        # this should throw an error
        d = Device(skip_if_exists=False)
        with self.assertRaises(RuntimeError):
            d.provision()
Esempio n. 13
0
    def test_overwrite_when_no_name_and_fetch_returns_no_result(self, find_device_patch, delete_patch):
        i = instance_factory(instance='test')
        d = Device(mac_address='aabbcc112233', did=6175551212, broadsoftinstance=i)
        d.overwrite()

        # --- actually, skipping overwrite for Device as we're not expecting to do device management in broadsoft
        self.assertFalse(delete_patch.called)

        # check the call to find_device_by_mac_and_did()
        # args, kwargs = find_device_patch.call_args_list[0]
        # self.assertEqual(d.mac_address, kwargs['mac_address'])
        # self.assertEqual(d.did, kwargs['did'])
        # self.assertEqual(i, kwargs['broadsoftinstance'])

        # device should not have inherited a name at this point
        self.assertEqual('Generic', d.name)

        # since a name was not inherited, delete() should not have been called
        self.assertFalse(delete_patch.called)
Esempio n. 14
0
    def test_delete_device_passes_back_delete_object_when_bundling(
            self, post_patch
    ):
        # when we're bundling, should just pass back request object; shouldn't actually post it
        d = Device(name='dname')
        d.delete(bundle=True)
        self.assertFalse(post_patch.called)

        # when we're not bundling, should actually try to post it
        d = Device(name='dname')
        d.delete(bundle=False)
        self.assertTrue(post_patch.called)
Esempio n. 15
0
    def test_derive_line_port(self):
        # implicit broadsoftinstance
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', index=1)
        self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain, d.line_port)

        # implicit broadsoftinstance with no index
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33')
        self.assertEqual('6175551212@' + d.broadsoftinstance.default_domain, d.line_port)

        # not test broadsoftinstance
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod')
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', broadsoftinstance=i, index=1)
        self.assertEqual('6175551212_' + str(d.index) + '@' + i.default_domain, d.line_port)

        # test broadsoftinstance
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test')
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', broadsoftinstance=i, index=1)
        self.assertEqual('6175551212_' + str(d.index) + '@' + i.default_domain, d.line_port)

        # passing prod instance to Device
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod')
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', instance='prod', index=1)
        self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain,
                         d.line_port)

        # passing test instance to Device
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test')
        d = Device(did=6175551212, mac_address='aa:bb:cc:11:22:33', instance='test', index=1)
        self.assertEqual('6175551212_' + str(d.index) + '@' + d.broadsoftinstance.default_domain, d.line_port)
Esempio n. 16
0
 def test_xml_converted_to_elementtree_at_from_xml(self):
     d = Device()
     d.xml = """<?xml version="1.0" encoding="ISO-8859-1"?>
         <BroadsoftDocument protocol="OCI" xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <sessionId xmlns="">192.168.0.100,1476473244,1496170270368</sessionId>
         <command echo="" xsi:type="GroupAccessDeviceGetResponse18sp1" xmlns="">
             <deviceType>Polycom SoundPoint IP 550</deviceType>
             <protocol>SIP 2.0</protocol>
             <description>the 550 what tim uses</description>
             <numberOfPorts>
                 <quantity>4</quantity>
             </numberOfPorts>
             <numberOfAssignedPorts>1</numberOfAssignedPorts>
             <status>Online</status>
             <configurationMode>Default</configurationMode>
             <transportProtocol>Unspecified</transportProtocol>
             <useCustomUserNamePassword>false</useCustomUserNamePassword>
         </command>
         </BroadsoftDocument>
         """
     d.from_xml()
     self.assertIsInstance(d.xml, Element)
Esempio n. 17
0
    def test_device_should_skip_error(self):
        d = Device(skip_if_exists=True)
        self.assertFalse(d.should_skip_error(error='blah'))
        self.assertTrue(
            d.should_skip_error(
                error=
                'the SOAP server threw an error: [Error 4500] Access Device already exists: 6173000066_1 :: [Error 4500] Access Device already exists: 6173000066_1 :: None'
            ))

        d = Device(skip_if_exists=False)
        self.assertFalse(d.should_skip_error(error='blah'))
        self.assertFalse(
            d.should_skip_error(
                error=
                'the SOAP server threw an error: [Error 4500] Access Device already exists: 6173000066_1 :: [Error 4500] Access Device already exists: 6173000066_1 :: None'
            ))
Esempio n. 18
0
    def test_delete_passes_broadsoftinstance(
            self, post_patch, delete_init_patch, delete_execute_patch
    ):
        # when bundle is True (check __init__ on GroupAccessDeviceDeleteRequest)
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='test')
        d = Device(name='dname', broadsoftinstance=i)
        d.delete(bundle=True)
        call = delete_init_patch.call_args_list[0]
        args, kwargs = call
        self.assertIsInstance(kwargs['broadsoftinstance'],
                              broadsoft.requestobjects.lib.BroadsoftRequest.TestBroadsoftInstance)

        # when bundle is False (check GroupAccessDeviceDeleteRequest.delete_device)
        i = broadsoft.requestobjects.lib.BroadsoftRequest.instance_factory(instance='prod')
        d = Device(name='dname', broadsoftinstance=i)
        d.delete(bundle=False)
        call = delete_execute_patch.call_args_list[0]
        args, kwargs = call
        self.assertIsInstance(kwargs['broadsoftinstance'],
                              broadsoft.requestobjects.lib.BroadsoftRequest.BroadsoftInstance)
Esempio n. 19
0
    def test_device_attrs_get_passed_to_request_object(self):
        d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone',
                   instance='test', mac_address='aabbcc112233', protocol='gopher',
                   transport_protocol='ftp')
        ro = d.build_provision_request()
        self.assertEqual(d.name, ro.device_name)
        #self.assertEqual(d.type, ro.device_type)
        self.assertEqual(d.mac_address, ro.mac_address)
        self.assertEqual(d.protocol, ro.protocol)
        self.assertEqual(d.transport_protocol, ro.transport_protocol)

        # try again, with prod instance
        d = Device(name='beaverphone', description="Tim Beaver's Phone", type='iphone',
                   instance='prod', mac_address='aabbcc112233', protocol='gopher',
                   transport_protocol='ftp')
        ro = d.build_provision_request()
        self.assertEqual(d.name, ro.device_name)
        #self.assertEqual(d.type, ro.device_type)
        self.assertEqual(d.mac_address, ro.mac_address)
        self.assertEqual(d.protocol, ro.protocol)
        self.assertEqual(d.transport_protocol, ro.transport_protocol)
Esempio n. 20
0
    def test_fetch(
            self, get_device_patch, from_xml_patch
    ):
        # d.name set, target_name not
        d = Device(name='beaverphone')
        d.fetch()
        call = get_device_patch.call_args_list[0]
        args, kwargs = call
        self.assertEqual('beaverphone', kwargs['name'])

        # d.name set, target_name set
        d = Device(name='beaverphone')
        d.fetch(target_name='beaverandroid')
        call = get_device_patch.call_args_list[1]
        args, kwargs = call
        self.assertEqual('beaverandroid', kwargs['name'])

        # d.name not set, target_name set
        d = Device()
        d.fetch(target_name='beaverandroid')
        call = get_device_patch.call_args_list[2]
        args, kwargs = call
        self.assertEqual('beaverandroid', kwargs['name'])
Esempio n. 21
0
    def test_implicit_overwrite_respected(self, device_overwrite_patch,
                                          account_overwrite_patch, post_patch):
        i = instance_factory(instance='test')

        # doing this with a Device since raw BroadsoftObject doesn't have an overwrite or build_provision_request method

        # with default value for implicit overwrite (False)
        d = Device(mac_address='aabbcc112233',
                   did=6175551212,
                   broadsoftinstance=i)
        d.provision()
        self.assertFalse(device_overwrite_patch.called)
        device_overwrite_patch.called = False

        # with False for implicit overwrite
        d = Device(mac_address='aabbcc112233',
                   did=6175551212,
                   implicit_overwrite=False,
                   broadsoftinstance=i)
        self.assertFalse(device_overwrite_patch.called)
        d.provision()
        device_overwrite_patch.called = False

        # with True for implicit overwrite
        d = Device(mac_address='aabbcc112233',
                   did=6175551212,
                   implicit_overwrite=True,
                   broadsoftinstance=i)
        d.provision()
        self.assertTrue(device_overwrite_patch.called)

        # doing it again with an Account

        # with default value for implicit overwrite (False)
        a = Account(did=6175551212,
                    sip_user_id='*****@*****.**',
                    email='*****@*****.**',
                    broadsoftinstance=i)
        a.provision()
        self.assertFalse(account_overwrite_patch.called)
        account_overwrite_patch.called = False

        # with False for implicit overwrite
        a = Account(did=6175551212,
                    sip_user_id='*****@*****.**',
                    email='*****@*****.**',
                    implicit_overwrite=False,
                    broadsoftinstance=i)
        self.assertFalse(account_overwrite_patch.called)
        a.provision()
        account_overwrite_patch.called = False

        # with True for implicit overwrite
        a = Account(did=6175551212,
                    sip_user_id='*****@*****.**',
                    email='*****@*****.**',
                    implicit_overwrite=True,
                    broadsoftinstance=i)
        a.provision()
        self.assertTrue(account_overwrite_patch.called)
Esempio n. 22
0
    def load_devices(self):
        # if there's no XML for the user, fetch entire User. Primary device will be in User record, rest found by
        # searching for shared call appearances. Since .fetch() calls .load_devices(), will wind up back here.
        if self.xml is None:
            self.fetch()

        # if there is XML for the user...
        else:
            # first, any that were directly in xml
            for ade in self.xml.findall('./command/accessDeviceEndpoint'):
                d = Device()
                self.inject_broadsoftinstance(child=d)
                # the <accessDeviceEndpoint> gives us enough info to actually fetch the device
                d.bootstrap_access_device_endpoint(ade=ade)
                d.fetch(target_name=d.name)
                self.devices.append(d)

            # now find any shared call appearances
            sca_xml = UserSharedCallAppearanceGetRequest.get_devices(sip_user_id=self.sip_user_id,
                                                                     broadsoftinstance=self.broadsoftinstance)
            scas = BroadsoftRequest.convert_results_table(xml=sca_xml)
            for sca in scas:
                d = Device()
                self.inject_broadsoftinstance(child=d)
                # the shared call appearance listings give us nearly everything about a device, but we run a fetch as well
                # to get everything
                d.bootstrap_shared_call_appearance(sca=sca)
                d.fetch(target_name=d.name)
                self.devices.append(d)
Esempio n. 23
0
    def attach_sca(self, index=None):
        d = Device(logging_level=self.logging_level)
        d.index = self.derive_sca_index(index=index)
        d.broadsoftinstance = self.broadsoftinstance
        d.logging_level = self.logging_level
        d.is_primary = False
        d.did = self.did
        d.description = self.attach_default_devices__build_description()
        d.type = 'Generic SIP Phone'
        d.derive_line_port()
        d.implicit_overwrite = False
        d.skip_if_exists = True

        self.devices.append(d)
Esempio n. 24
0
 def attach_primary_device(self):
     # attach a primary device, with no line_port suffix
     d = Device(logging_level=self.logging_level)
     d.broadsoftinstance = self.broadsoftinstance
     d.logging_level = self.logging_level
     d.is_primary = True
     d.did = self.did
     d.description = self.attach_default_devices__build_description()
     d.type = 'Generic SIP Phone'
     d.derive_line_port()
     d.implicit_overwrite = False
     d.skip_if_exists = True
     self.devices.append(d)
Esempio n. 25
0
    def test_set_password_deriving_sip_user_name(
            self, device_mod_patch, post_patch
    ):
        b = BroadsoftRequest()

        # just a did
        d = Device(name='devicename')
        d.set_password(did=6175551212, sip_password='******')

        call = device_mod_patch.call_args_list[0]
        args, kwargs = call
        self.assertEqual('6175551212@' + d.broadsoftinstance.default_domain, kwargs['sip_user_name'])

        # just a sip_user_name
        d = Device(name='devicename')
        d.set_password(sip_user_name='*****@*****.**', sip_password='******')

        call = device_mod_patch.call_args_list[1]
        args, kwargs = call
        self.assertEqual('*****@*****.**', kwargs['sip_user_name'])

        # both; sip_user_name should win
        d = Device(name='devicename')
        d.set_password(did=6175551212, sip_user_name='*****@*****.**', sip_password='******')

        call = device_mod_patch.call_args_list[2]
        args, kwargs = call
        self.assertEqual('*****@*****.**', kwargs['sip_user_name'])
Esempio n. 26
0
    def test_set_password_requirements(
            self, device_mod_patch, post_patch
    ):
        # requires device name
        with self.assertRaises(ValueError):
            d = Device(name=None)
            d.set_password(sip_user_name='*****@*****.**', sip_password='******')

        # requires did or sip_user_name
        with self.assertRaises(ValueError):
            d = Device(name='dname')
            d.set_password(sip_password='******')

        # requires password
        with self.assertRaises(ValueError):
            d = Device(name='dname')
            d.set_password(sip_user_name='*****@*****.**')
Esempio n. 27
0
 def test_init_calls_broadsoftobject_init(self, bo_init_patch):
     d = Device()
     self.assertTrue(bo_init_patch.called)
Esempio n. 28
0
 def test_delete_device_barfs_if_no_name(
         self, post_patch
 ):
     d = Device(name=None)
     with self.assertRaises(ValueError):
         d.delete()