Example #1
0
    def test_login_success_radius_provider(self):
        self.connection.send.side_effect = [
            connection_response(load_fixture('load_provider_list.json')),
            connection_response(
                load_fixture('login_with_non_local_provider.json'))
        ]
        mock_response = MagicMock()
        self.connection.httpapi.get_option = mock_response
        self.connection.httpapi.get_option.return_value = 'RadiusServer'

        self.connection.httpapi.login('baz', 'bar')

        token = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJCSU" \
                "ctSVEiLCJqdGkiOiJFNkhKdnZOUnpwSnNQenB4MVRYSjN3Iiwic3ViIjoicGF1bGEiLCJhdWQiOiIxNzIuMTguNy41NSIsIm" \
                "lhdCI6MTU5MzE4ODg1MywiZXhwIjoxNTkzMTg5MTUzLCJ1c2VyTmFtZSI6InBhdWxhIiwiYXV0aFByb3ZpZGVyTmFtZSI6Il" \
                "JhZGl1c1NlcnZlciIsInVzZXIiOiJodHRwczovL2xvY2FsaG9zdC9tZ210L2NtL3N5c3RlbS9hdXRobi9wcm92aWRlcnMvcm" \
                "FkaXVzLzE1NjMzYWM4LTM2MmMtNGIwNS1iMWY5LWY3N2YzY2Q4OTIxZS91c2Vycy8xYjIwNzQ2NS1lYWM4LTNiNWQtOGIxMi" \
                "1lMzM1ZmFhMGI1M2EiLCJ0eXBlIjoiQUNDRVNTIiwidGltZW91dCI6MzAwLCJncm91cFJlZmVyZW5jZXMiOltdfQ.IESe2Hp" \
                "LfZOMZJ5dS1U90jAPDB8gvmJXNNVkcYcL0WTFmJ9XdSTnuw7NbGddZPXBwH-VmA7v0lPLymb_RmQqDoSQ1nnD692oSlRVpC9Z" \
                "g3S1zA-6Ela3ChuIpnQU3ZY0XBDhCKGF_L-9ryC5QPrsCcwLYX-1u579yJlUzGPxxRU4CSp7Gz7-HpUqFVvCOzc5_mJbQD_td" \
                "0z2bbOUnl3m7IbTEBrB8q_svvCONleiGk15bTyLyP-KZKblSzF1Ypr73F5EHbJUS75zhLls6Zqm7XKPA_5ZXq9_YO-sXsKYOB" \
                "nGurYieXDF_o0EdmUFqNypUr0bJxlSv4IAbZRJFi-kNKcsRrUm-t5c2UBXITKyQsCx2dsAS6zSAxMGLEF87kahTlQuRZ9NCs3" \
                "bokAz1cmuntWhLq0GxOwcJf45_F70lmu5192DXUlbiz13CLMzWHHA4lpcgwrwrUl1zqnT5arb7vOeAXFUNK1Eiu2OFnbAgItx" \
                "634fj8EJCQWjIelvgm6y"

        assert self.connection.httpapi.access_token == token
        assert self.connection._auth == {'X-F5-Auth-Token': token}
Example #2
0
    def test_token_refresh(self):
        token_1 = "eyJraWQiOiJkMzExNjIxNC1hOWRkLTQ4NTYtODI0MC05MDY1OTZjZWFkOTgiLCJhbGciOiJSUzM4NCJ9.eyJpc3Mi" \
                  "OiJCSUctSVEiLCJqdGkiOiJnTkNUd2VxLVFkS1ZMNzFraVN4OUZ3Iiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuM" \
                  "TguMTYxLjQ3IiwiaWF0IjoxNjE0ODU5NjM4LCJleHAiOjE2MTQ4NTk5MzgsInVzZXJOYW1lIjoiYWRtaW4iLCJhdX" \
                  "RoUHJvdmlkZXJOYW1lIjoibG9jYWwiLCJ1c2VyIjoiaHR0cHM6Ly9sb2NhbGhvc3QvbWdtdC9zaGFyZWQvYXV0aHo" \
                  "vdXNlcnMvYWRtaW4iLCJ0eXBlIjoiQUNDRVNTIiwidGltZW91dCI6MzAwLCJncm91cFJlZmVyZW5jZXMiOltdfQ.F" \
                  "WZZ7w0vCH39mleCnMFvMuvCrX2l4eaH0sqINdeR7g1cv5_sFKvaJJcjA0UEYc0JjCbqC-k06mbu0dn3NxwDqpsimz" \
                  "_7MVwoKAYjuIz3KXIjokUPpCka_hrF5uZLpj53VHKp8vN2GQvSxVbftdqBw0jBrpLFJNWqitnEf8Ie_MDgMmX6SMu" \
                  "ZRwM0jU7Xlf3eTJq529gmeZoN6u2haAcA0jyuvK0lvWXspRqtmY1c-BHch4nix92L7jXWSe-s60jBuJn3A5dgRCUE" \
                  "YARMnjWXB5Xinj21cc8HQWv6i924NFuqMFZAkSMjJImFmroK5ng8uaTBC0dtV3szmozAS96LWGkSqPhevW9TuU0FS" \
                  "3EVbMftlneoSj_d0FUscrR_1QR5zACUKQ-CEEL_thWt4-BoQiksMsP-FoQU2eCkapYurKUp8Ya8YnTz-fAVDQXghl" \
                  "VBr2ideEm08i7mncGsyn-rMLu1uq4eBaAayDWq6gUOm45WdzTwAgdhoAyVKur2MtSs"
        token_2 = "eyJraWQiOiJkMzExNjIxNC1hOWRkLTQ4NTYtODI0MC05MDY1OTZjZWFkOTgiLCJhbGciOiJSUzM4NCJ9.eyJpc3Mi" \
                  "OiJCSUctSVEiLCJqdGkiOiJRMUdERkE4cHF4b3ZfamtlRk4yU2xnIiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuM" \
                  "TguMTYxLjQ3IiwiaWF0IjoxNjE0ODU5NzcyLCJleHAiOjE2MTQ4NjAwNzIsInVzZXJOYW1lIjoiYWRtaW4iLCJhdX" \
                  "RoUHJvdmlkZXJOYW1lIjoibG9jYWwiLCJ1c2VyIjoiaHR0cHM6Ly9sb2NhbGhvc3QvbWdtdC9zaGFyZWQvYXV0aHo" \
                  "vdXNlcnMvYWRtaW4iLCJ0eXBlIjoiQUNDRVNTIiwidGltZW91dCI6MzAwLCJncm91cFJlZmVyZW5jZXMiOltdfQ.Q" \
                  "3A5MQfCnvVluFgvQbEUSzNsL-jtOwODopYcxA0HOOrCHYO2ec15t6fznVsiT71B-rAGEFdgi0ZMDB7SKWha6Wzv-1" \
                  "ELRX8PVi-SWTGylhQpXpu_ZWja0oqHHv7uxbAyiF0uZt62IW-taXqZ2Pw4vPShDX4APPefujVwULAovrjLet2dE0Y" \
                  "6rxTqoADtgnauZx5R-_cmHZH-hwdRunVh-TWRATVpbXUL5E8MjKwuCpguI3CHO_sKd3eaI7Tc60rCh-yO3YHJuvae" \
                  "FFw2ipcMpqR-eo62QmwrxA5ZAKgXxzYrdnkZ7x73hKvJh8aYZsa2YZSuzEz3QTkpO8mbGFcX1IWNdqt1ZMs-HiXr2" \
                  "SMHW7nOmWsBlB9ymStvvnqM_HO8BYg6CScj_XTv9cfZDiGWTtcZSSsEWb6l_If1yzTLEWUNpbYCwOG4OEcHKV8TXz" \
                  "1ie4m4TzxdeMUSROXPxkoUQKG0bVCY4vPThqpHUYIe-boxgAYqqNXjJr7pp65-XeAw"
        refresh = "eyJraWQiOiJkMzExNjIxNC1hOWRkLTQ4NTYtODI0MC05MDY1OTZjZWFkOTgiLCJhbGciOiJSUzM4NCJ9.eyJpc3Mi" \
                  "OiJCSUctSVEiLCJqdGkiOiJzSG45dVkzcnhKRGtVbTRVTmthRUxnIiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuM" \
                  "TguMTYxLjQ3IiwiaWF0IjoxNjE0ODU5NjM4LCJleHAiOjE2MTQ4OTU2MzgsInVzZXJOYW1lIjoiYWRtaW4iLCJhdX" \
                  "RoUHJvdmlkZXJOYW1lIjoibG9jYWwiLCJ1c2VyIjoiaHR0cHM6Ly9sb2NhbGhvc3QvbWdtdC9zaGFyZWQvYXV0aHo" \
                  "vdXNlcnMvYWRtaW4iLCJ0eXBlIjoiUkVGUkVTSCIsInRpbWVvdXQiOjM2MDAwLCJncm91cFJlZmVyZW5jZXMiOltd" \
                  "fQ.MrRkh9U9ufsoHNYaArflbLjGhFt3hINeex_6vgvCUFJAeVEhEqnNVvQk9TGBZGw3hT6pNCPIeXJGaK9huFAn7Y" \
                  "q0wwuWaZykPmhBAhUASMJBijOBMkcLF3LmdNS7tl-xzM6pwlcmSf2aPy3qvcJM5BlwSuDFj6JoV64woEDE8pjIrBc" \
                  "U9onj-AMSNnvSpRzgVjE47aGs91Fx4cgWjd1LZti42TG3HBK9KNQ9WJbgWkN1ocNM2scFs_IiqrhmTjAjWv7ddVFY" \
                  "YVnVSLkz1z46FWSKeLWsXgMfJAbRLiDk8nmFq77QZGW-N9ct2ouz2xsLeS3_s0Ck4o432ZZUvWmlFxKyRNNJ8csj_" \
                  "RCYoIemP4iLfpMmSsODoMl2Tc32aFIILhbV7QgkqBIhWEgUDhPYRk8vsv18Hf81qMIrqsKNJaNoTYVtJMt6IR2slz" \
                  "Hd0IAmrQsum03JfcD-5CUWD0kQYeEDCjlPMnC_pnBgXnj21zWCdkCQ_UnFoKTirkthjOY0"

        self.connection.send.side_effect = [
            connection_response(load_fixture('local_auth_response_2.json')),
            connection_response(load_fixture('refresh_response.json'))
        ]
        mock_response = MagicMock()
        self.connection.httpapi.get_option = mock_response
        self.connection.httpapi.get_option.return_value = 'local'

        self.connection.httpapi.login('baz', 'bar')
        assert self.connection.httpapi.access_token == token_1
        assert self.connection.httpapi.refresh_token == refresh
        assert self.connection._auth == {'X-F5-Auth-Token': token_1}

        self.connection.httpapi.token_refresh()
        assert self.connection.httpapi.access_token == token_2
        assert self.connection.httpapi.refresh_token == refresh
        assert self.connection._auth == {'X-F5-Auth-Token': token_2}
Example #3
0
 def test_bigiq_version_raises_on_no_information(self):
     self.connection.send.return_value = connection_response(
         {'FOO': 'BAR', 'BAZ': 'FOO'}
     )
     with self.assertRaises(F5ModuleError) as res:
         bigiq_version(self.client)
     assert 'Failed to retrieve BIG-IQ version information.' in str(res.exception)
Example #4
0
    def test_modules_provisioned_returns_empty(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        modules = modules_provisioned(self.client)
        assert modules == []
Example #5
0
 def test_tmos_version_returns(self):
     self.connection.send.return_value = connection_response(
         load_fixture('load_tmos_version.json')
     )
     version = tmos_version(self.client)
     self.connection.send.assert_called_once_with('/mgmt/tm/sys/', None, method='GET', headers=BASE_HEADERS)
     assert version == '15.1.0.1'
Example #6
0
    def test_login_success_local_provider(self):
        self.connection.send.return_value = connection_response(
            load_fixture('local_auth_response.json'))

        token = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJCSU" \
                "ctSVEiLCJqdGkiOiJuaGpmanVqRU9FWnZqaWQtR2xUSW1RIiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuMTguNy41NSIsI" \
                "mlhdCI6MTU5MzE4Nzg3MSwiZXhwIjoxNTkzMTg4MTcxLCJ1c2VyTmFtZSI6ImFkbWluIiwiYXV0aFByb3ZpZGVyTmFtZSI6" \
                "ImxvY2FsIiwidXNlciI6Imh0dHBzOi8vbG9jYWxob3N0L21nbXQvc2hhcmVkL2F1dGh6L3VzZXJzL2FkbWluIiwidHlwZSI" \
                "6IkFDQ0VTUyIsInRpbWVvdXQiOjMwMCwiZ3JvdXBSZWZlcmVuY2VzIjpbXX0.Ob1gwS93X0yE1Q5rKiHEpFl-5dcmFN8dR-" \
                "CLe_ghJaNT4zEWp4r6EdgQ57yrBCHqfoe2JMVJ9UYW7Dn8lJh1buDJLAOJ9l1ifUQo0rSKkSI1UwNyVI5KeHafclngz1MNH" \
                "G8HUB0vRySfDO5FhRjDrNyXL7CeOblog9qgVAsBOW60A9Tgx4vlFgDebzf46Pp_EO9Oes75oIQSkGdARuYbNtM72QwWNUO6" \
                "fiFo_L93-LOrQiWz87PECRkwq5C91sl4uiqdBGN2LRjwHcs3v2vNQbVTlABPnOsGLe14dZE4AZ_peNwIBIGL4JT_55rdohl" \
                "AKqQKCIgEDTB9xvQyOZgX9yO76FfTIpzg2tPLVomiaFHK1joFdzJ-jWWfBUdlKLgYbenwUD9VRyZncv6fTmJug_QSCc1FL8" \
                "4cw8Ab745kBiwOwpr5RwvRqMjDKJfQuyTX_CYQIt9j-RfrGAORqiSvlu7FUykIXdcnpO9WktEr6Y3MZl7Wj__kyngZ3nwM-NOM"
        refresh = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJC" \
                  "SUctSVEiLCJqdGkiOiI0MEFibElmZkNHWHJyT2xvSzJQYlpBIiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuMTguNy41N" \
                  "SIsImlhdCI6MTU5MzE4Nzg3MSwiZXhwIjoxNTkzMjIzODcxLCJ1c2VyTmFtZSI6ImFkbWluIiwiYXV0aFByb3ZpZGVyTm" \
                  "FtZSI6ImxvY2FsIiwidXNlciI6Imh0dHBzOi8vbG9jYWxob3N0L21nbXQvc2hhcmVkL2F1dGh6L3VzZXJzL2FkbWluIiw" \
                  "idHlwZSI6IlJFRlJFU0giLCJ0aW1lb3V0IjozNjAwMCwiZ3JvdXBSZWZlcmVuY2VzIjpbXX0.VsMXT57oTIBSCHgfryjn" \
                  "wy8uckeYwqCjYumjvFEJkE4CEI2V_AwL-IYoLaogxrPSuV_CzkdrOvNZQlOrHoe2Mo_4xDPxPgu0sNrJqyc9hcfKwNOvi" \
                  "goGGKg1GsPicbuu9W7yf-FWE5KESsojOm_SSvNKMq3fwabqrTyy1JQ_fooKKJ25NPhQoxUmtoxy5V5CLU6glddi2qRTIl" \
                  "BcPY2UCEECMj1sVyvMRq28TPIo-C81FAy56lCZIx_UNl3Mp741j0C5SmNNexuze2E0BaioP7ICNvYlwTlykBIgLvcMYS3" \
                  "mbCANw9t-Ar55TQOZH3SInsnU5BmsGNqKVIlcEM4o3ENk3wOpxq8Qq5BGxQ1V5euzvq0Sc7JzZqa9JO7WpIStqfJoa76X" \
                  "fbEa2v1YJhro58FIROIuCxQGfVmnhzz6cQbFJHKMLyMzEXJOXEaMSmM9WkDDD8yzklJmHBW_mBnmbL9KlETGjCyZobe6z" \
                  "I7V8HYkgQ45XE4nqJSBe0GsjdkE"
        self.connection.httpapi.login('foo', 'bar')

        assert self.connection.httpapi.access_token == token
        assert self.connection.httpapi.refresh_token == refresh
        assert self.connection._auth == {'X-F5-Auth-Token': token}
Example #7
0
    def test_GET_header_update_without_additional_headers(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        self.client.get('/testlink')
        self.connection.send.assert_called_once_with('/testlink', None, method='GET', headers=BASE_HEADERS)
    def test_get_platform(self):
        self.connection.send.return_value = connection_response(
            load_fixture('load_bigiq_version.json'))

        platform, version = self.client.platform
        assert platform == 'bigiq'
        assert version == '7.1.0'
Example #9
0
    def test_GET_header_update_with_additional_headers(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        self.client.get('/testlink', headers={'CUSTOM': 'HEADER'})
        expected_header = {'CUSTOM': 'HEADER', 'Content-Type': 'application/json'}
        self.connection.send.assert_called_once_with('/testlink', None, method='GET', headers=expected_header)
Example #10
0
    def test_login_raises_exception_when_invalid_token_response(self):
        self.connection.send.return_value = connection_response(
            {'errorMessage': 'ERROR'}, 200, VELOS_BASE_HEADERS)
        with self.assertRaises(AnsibleConnectionFailure) as res:
            self.connection.httpapi.login('foo', 'bar')

        assert "Authentication process failed, server returned: {'errorMessage': 'ERROR'}" in str(
            res.exception)
Example #11
0
    def test_login_raises_exception_when_invalid_token_response(self):
        self.connection.send.return_value = connection_response(
            {'token': {'BAZ': 'BAR'}}
        )
        with self.assertRaises(AnsibleConnectionFailure) as res:
            self.connection.httpapi.login('foo', 'bar')

        assert 'Server returned invalid response during connection authentication.' in str(res.exception)
Example #12
0
 def test_GET_header_update_without_additional_headers_and_transaction(self):
     self.connection.send.return_value = connection_response(
         {'FOO': 'BAR', 'BAZ': 'FOO'}
     )
     self.client.transact = 'tr1234567'
     self.client.get('/testlink')
     expected_header = {'Content-Type': 'application/json',
                        'X-F5-REST-Coordination-Id': 'tr1234567'}
     self.connection.send.assert_called_once_with('/testlink', None, method='GET', headers=expected_header)
Example #13
0
    def test_login_success_properties_populated(self):
        self.connection.send.return_value = connection_response(
            load_fixture('tmos_auth_response.json')
        )

        self.connection.httpapi.login('foo', 'bar')

        assert self.connection.httpapi.access_token == 'P42ZHJN5HS5DH4KM4ENK3AFCLP'
        assert self.connection._auth == {'X-F5-Auth-Token': 'P42ZHJN5HS5DH4KM4ENK3AFCLP'}
Example #14
0
 def test_modules_provisioned_returns(self):
     self.connection.send.return_value = connection_response(
         load_fixture('load_provisioned_modules.json')
     )
     modules = modules_provisioned(self.client)
     self.connection.send.assert_called_once_with(
         '/mgmt/tm/sys/provision', None, method='GET', headers=BASE_HEADERS
     )
     assert modules == ['ltm']
Example #15
0
 def test_bigiq_version_returns(self):
     self.connection.send.return_value = connection_response(
         load_fixture('load_bigiq_version.json')
     )
     version = bigiq_version(self.client)
     self.connection.send.assert_called_once_with(
         '/mgmt/shared/resolver/device-groups/cm-shared-all-big-iqs/devices?$select=version',
         None, method='GET', headers=BASE_HEADERS
     )
     assert version == '7.1.0'
Example #16
0
    def test_PATCH_header_update_without_additional_headers(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        payload = {'Test': 'Payload'}

        self.client.patch('/testlink', data=payload)
        self.connection.send.assert_called_once_with(
            '/testlink', '{"Test": "Payload"}', headers=BASE_HEADERS, method='PATCH'
        )
Example #17
0
    def test_module_provisioned(self):
        self.connection.send.return_value = connection_response(
            load_fixture('load_provisioned_modules.json')
        )
        module1 = module_provisioned(self.client, 'afm')
        module2 = module_provisioned(self.client, 'ltm')

        self.connection.send.assert_any_call('/mgmt/tm/sys/provision', None, method='GET', headers=BASE_HEADERS)
        assert self.connection.send.call_count == 2
        assert module1 is False
        assert module2 is True
Example #18
0
    def test_DELETE_header_update_without_additional_headers(self):
        self.connection.send.return_value = connection_response({
            'FOO': 'BAR',
            'BAZ': 'FOO'
        })

        self.client.delete('/testlink')
        self.connection.send.assert_called_once_with(
            VELOS_ROOT + '/testlink',
            None,
            method='DELETE',
            headers=VELOS_BASE_HEADERS)
Example #19
0
    def test_POST_header_update_with_additional_headers(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        payload = {'Test': 'Payload'}

        self.client.post('/testlink', data=payload, headers={'CUSTOM': 'HEADER'})
        expected_header = {'CUSTOM': 'HEADER', 'Content-Type': 'application/json'}
        self.connection.send.assert_called_once_with(
            '/testlink', '{"Test": "Payload"}', headers=expected_header, method='POST'
        )
Example #20
0
    def test_login_success_properties_populated(self):
        xheader = {'X-Auth-Token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'}
        xheader.update(VELOS_BASE_HEADERS)
        self.connection.send.return_value = connection_response(
            load_fixture('velos_auth.json'), 200, xheader)

        self.connection.httpapi.login('foo', 'bar')

        assert self.connection.httpapi.access_token == 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'
        assert self.connection._auth == {
            'X-Auth-Token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'
        }
Example #21
0
    def test_login_success_radius_provider_by_id(self):
        self.connection.send.side_effect = [
            connection_response(load_fixture('load_provider_list.json')),
            connection_response(
                load_fixture('login_with_non_local_provider.json'))
        ]
        mock_response = MagicMock()
        self.connection.httpapi.get_option = mock_response
        self.connection.httpapi.get_option.return_value = '15633ac8-362c-4b05-b1f9-f77f3cd8921e'

        self.connection.httpapi.login('baz', 'bar')

        token = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJCSU" \
                "ctSVEiLCJqdGkiOiJFNkhKdnZOUnpwSnNQenB4MVRYSjN3Iiwic3ViIjoicGF1bGEiLCJhdWQiOiIxNzIuMTguNy41NSIsIm" \
                "lhdCI6MTU5MzE4ODg1MywiZXhwIjoxNTkzMTg5MTUzLCJ1c2VyTmFtZSI6InBhdWxhIiwiYXV0aFByb3ZpZGVyTmFtZSI6Il" \
                "JhZGl1c1NlcnZlciIsInVzZXIiOiJodHRwczovL2xvY2FsaG9zdC9tZ210L2NtL3N5c3RlbS9hdXRobi9wcm92aWRlcnMvcm" \
                "FkaXVzLzE1NjMzYWM4LTM2MmMtNGIwNS1iMWY5LWY3N2YzY2Q4OTIxZS91c2Vycy8xYjIwNzQ2NS1lYWM4LTNiNWQtOGIxMi" \
                "1lMzM1ZmFhMGI1M2EiLCJ0eXBlIjoiQUNDRVNTIiwidGltZW91dCI6MzAwLCJncm91cFJlZmVyZW5jZXMiOltdfQ.IESe2Hp" \
                "LfZOMZJ5dS1U90jAPDB8gvmJXNNVkcYcL0WTFmJ9XdSTnuw7NbGddZPXBwH-VmA7v0lPLymb_RmQqDoSQ1nnD692oSlRVpC9Z" \
                "g3S1zA-6Ela3ChuIpnQU3ZY0XBDhCKGF_L-9ryC5QPrsCcwLYX-1u579yJlUzGPxxRU4CSp7Gz7-HpUqFVvCOzc5_mJbQD_td" \
                "0z2bbOUnl3m7IbTEBrB8q_svvCONleiGk15bTyLyP-KZKblSzF1Ypr73F5EHbJUS75zhLls6Zqm7XKPA_5ZXq9_YO-sXsKYOB" \
                "nGurYieXDF_o0EdmUFqNypUr0bJxlSv4IAbZRJFi-kNKcsRrUm-t5c2UBXITKyQsCx2dsAS6zSAxMGLEF87kahTlQuRZ9NCs3" \
                "bokAz1cmuntWhLq0GxOwcJf45_F70lmu5192DXUlbiz13CLMzWHHA4lpcgwrwrUl1zqnT5arb7vOeAXFUNK1Eiu2OFnbAgItx" \
                "634fj8EJCQWjIelvgm6y"
        refresh = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJCSU" \
                  "ctSVEiLCJqdGkiOiJsZ0wwU1FpSGVsZDBlTFVHQkREUENnIiwic3ViIjoicGF1bGEiLCJhdWQiOiIxNzIuMTguNy41NSIsI" \
                  "mlhdCI6MTU5MzE4ODg1MywiZXhwIjoxNTkzMjI0ODUzLCJ1c2VyTmFtZSI6InBhdWxhIiwiYXV0aFByb3ZpZGVyTmFtZSI6" \
                  "IlJhZGl1c1NlcnZlciIsInVzZXIiOiJodHRwczovL2xvY2FsaG9zdC9tZ210L2NtL3N5c3RlbS9hdXRobi9wcm92aWRlcnM" \
                  "vcmFkaXVzLzE1NjMzYWM4LTM2MmMtNGIwNS1iMWY5LWY3N2YzY2Q4OTIxZS91c2Vycy8xYjIwNzQ2NS1lYWM4LTNiNWQtOG" \
                  "IxMi1lMzM1ZmFhMGI1M2EiLCJ0eXBlIjoiUkVGUkVTSCIsInRpbWVvdXQiOjM2MDAwLCJncm91cFJlZmVyZW5jZXMiOltdf" \
                  "Q.OIGhcUBeaF5vD78y-tyNhxgfVUsto9UcuC6DhGmA5amNse9pQqXiTkmx3HiqPL8BcbzDaw3jbIAZb6_EXsEeQ8xlkp9Ld" \
                  "wnozRy_fanWrnfjuikR6v2fHotLA97sSDCp-JT876A-e1H-3_H7TvGPTeSzejnoq00xPrt49OkWbeFPnkisvmcDdqo1LEmI" \
                  "Bn0WR0ly2xuWBq-CWC-kiy5iBRhJyjxxTqRq7wiYgXS-YLw4noujcpHn5Em0v-JIVMu4vM4XipODMOUm-DAdxOoYngO8MAi" \
                  "j10U2fDHjv2iWNzVv_OQCA34y52y-wYftqQVqh0U4ddT_l89ib592JwAKOg13hsE4NKjtyJt0ZcGlWB2oJ-YLA2ZvuG2aoN" \
                  "bAit8dA31iaIDBPPMkE-SIUTIjvG--aibSFVeH-V4OgbNtX2hFKd58gF76khzBCboyG7xP-aV0qBZg2rQEzzgC4MjRL1-Ey" \
                  "z-ORDGts_LnnzAWoI1DBTKW22xwwpgFly3kmBBj"

        assert self.connection.httpapi.access_token == token
        assert self.connection.httpapi.refresh_token == refresh
        assert self.connection._auth == {'X-F5-Auth-Token': token}
Example #22
0
    def test_PATCH_header_update_without_additional_headers_and_transaction(self):
        self.connection.send.return_value = connection_response(
            {'FOO': 'BAR', 'BAZ': 'FOO'}
        )

        payload = {'Test': 'Payload'}
        self.client.transact = 'tr1234567'
        self.client.patch('/testlink', data=payload)
        expected_header = {'Content-Type': 'application/json',
                           'X-F5-REST-Coordination-Id': 'tr1234567'}
        self.connection.send.assert_called_once_with(
            '/testlink', '{"Test": "Payload"}', headers=expected_header, method='PATCH'
        )
Example #23
0
    def test_get_login_ref_by_name(self):
        self.connection.send.return_value = connection_response(
            load_fixture('load_provider_list.json'))

        expected = {
            'loginReference': {
                'link':
                'https://localhost/mgmt/cm/system/authn/providers/radius/'
                '15633ac8-362c-4b05-b1f9-f77f3cd8921e/login'
            }
        }

        result = self.connection.httpapi._get_login_ref('RadiusServer')
        assert result == expected
Example #24
0
    def test_teem_client_build_telemetry(self):
        self.connection.send.return_value = connection_response(
            load_fixture('load_tmos_version.json'))

        teem = TeemClient(self.client, self.start_time)
        result = teem.build_telemetry()

        assert result[0]['CollectionName'] == 'F5_BIGIP'
        assert result[0]['CollectionVersion'] == CURRENT_COLL_VERSION
        assert result[0]['CollectionModuleName'] == 'fake_module'
        assert result[0]['f5Platform'] == 'BIG-IP'
        assert result[0]['f5SoftwareVersion'] == '15.1.0.1'
        assert result[0]['ControllerAnsibleVersion'] == '2.10'
        assert result[0]['ControllerPythonVersion'] == self.python_version
Example #25
0
    def test_DELETE_header_update_with_additional_headers(self):
        self.connection.send.return_value = connection_response({
            'FOO': 'BAR',
            'BAZ': 'FOO'
        })

        self.client.delete('/testlink', headers={'CUSTOM': 'HEADER'})
        expected_header = {
            'CUSTOM': 'HEADER',
            'Content-Type': 'application/yang-data+json'
        }
        self.connection.send.assert_called_once_with(VELOS_ROOT + '/testlink',
                                                     None,
                                                     method='DELETE',
                                                     headers=expected_header)
Example #26
0
    def test_teem_client_prepare_request(self):
        self.connection.send.return_value = connection_response(
            load_fixture('load_tmos_version.json'))

        teem = TeemClient(self.client, self.start_time)
        url, headers, data = teem.prepare_request()

        assert url == 'https://product.apis.f5.com/ee/v1/telemetry'
        assert len(headers) == 5
        assert headers['User-Agent'] == 'F5_BIGIP/{0}'.format(
            CURRENT_COLL_VERSION)
        assert headers['F5-ApiKey'] == TEEM_KEY
        assert len(data) == 10
        assert data['digitalAssetVersion'] == CURRENT_COLL_VERSION
        assert data['observationStartTime'] == self.start_time
Example #27
0
    def test_teem_client_send(self, patched):
        self.connection.send.return_value = connection_response(
            load_fixture('load_tmos_version.json'))

        self.connection.httpapi._display_message = MagicMock()
        patched.return_value = FakeHTTPResponse(200)

        teem = TeemClient(self.client, self.start_time)
        teem.send()

        assert patched.call_args[1][
            'url'] == 'https://product.apis.f5.com/ee/v1/telemetry'
        assert patched.call_args[1]['headers'][
            'User-Agent'] == 'F5_BIGIP/{0}'.format(CURRENT_COLL_VERSION)
        assert patched.call_args[1]['headers']['F5-ApiKey'] == TEEM_KEY
        assert CURRENT_COLL_VERSION in patched.call_args[1]['data']
        assert self.start_time in patched.call_args[1]['data']
Example #28
0
    def test_different_scope_with_additional_headers(self):
        self.connection.send.return_value = connection_response({
            'FOO': 'BAR',
            'BAZ': 'FOO'
        })

        self.client.get('/testlink',
                        headers={'CUSTOM': 'HEADER'},
                        scope='openconfig/different/scope')
        expected_header = {
            'CUSTOM': 'HEADER',
            'Content-Type': 'application/yang-data+json'
        }
        self.connection.send.assert_called_once_with(
            'openconfig/different/scope/testlink',
            None,
            method='GET',
            headers=expected_header)
Example #29
0
    def test_login_success_local_provider(self):
        self.connection.send.return_value = connection_response(
            load_fixture('local_auth_response.json'))

        token = "eyJraWQiOiJhZmExZDliOC1jN2NiLTQ2NWMtOTE0Yy00MWNkODgwZjM1YjEiLCJhbGciOiJSUzM4NCJ9.eyJpc3MiOiJCSU" \
                "ctSVEiLCJqdGkiOiJuaGpmanVqRU9FWnZqaWQtR2xUSW1RIiwic3ViIjoiYWRtaW4iLCJhdWQiOiIxNzIuMTguNy41NSIsI" \
                "mlhdCI6MTU5MzE4Nzg3MSwiZXhwIjoxNTkzMTg4MTcxLCJ1c2VyTmFtZSI6ImFkbWluIiwiYXV0aFByb3ZpZGVyTmFtZSI6" \
                "ImxvY2FsIiwidXNlciI6Imh0dHBzOi8vbG9jYWxob3N0L21nbXQvc2hhcmVkL2F1dGh6L3VzZXJzL2FkbWluIiwidHlwZSI" \
                "6IkFDQ0VTUyIsInRpbWVvdXQiOjMwMCwiZ3JvdXBSZWZlcmVuY2VzIjpbXX0.Ob1gwS93X0yE1Q5rKiHEpFl-5dcmFN8dR-" \
                "CLe_ghJaNT4zEWp4r6EdgQ57yrBCHqfoe2JMVJ9UYW7Dn8lJh1buDJLAOJ9l1ifUQo0rSKkSI1UwNyVI5KeHafclngz1MNH" \
                "G8HUB0vRySfDO5FhRjDrNyXL7CeOblog9qgVAsBOW60A9Tgx4vlFgDebzf46Pp_EO9Oes75oIQSkGdARuYbNtM72QwWNUO6" \
                "fiFo_L93-LOrQiWz87PECRkwq5C91sl4uiqdBGN2LRjwHcs3v2vNQbVTlABPnOsGLe14dZE4AZ_peNwIBIGL4JT_55rdohl" \
                "AKqQKCIgEDTB9xvQyOZgX9yO76FfTIpzg2tPLVomiaFHK1joFdzJ-jWWfBUdlKLgYbenwUD9VRyZncv6fTmJug_QSCc1FL8" \
                "4cw8Ab745kBiwOwpr5RwvRqMjDKJfQuyTX_CYQIt9j-RfrGAORqiSvlu7FUykIXdcnpO9WktEr6Y3MZl7Wj__kyngZ3nwM-NOM"

        self.connection.httpapi.login('foo', 'bar')

        assert self.connection.httpapi.access_token == token
        assert self.connection._auth == {'X-F5-Auth-Token': token}
Example #30
0
    def test_teem_client_send_error(self, patched):
        self.connection.send.return_value = connection_response(
            load_fixture('load_tmos_version.json'))

        self.connection.httpapi._display_message = MagicMock()
        patched.side_effect = HTTPError(
            'https://product.apis.f5.com/ee/v1/telemetry', 400,
            load_fixture('teem_error_response.json'), {}, None)

        teem = TeemClient(self.client, self.start_time)
        with self.assertRaises(HTTPError) as exc:
            teem.send()
        assert exc.exception.code == 400
        assert exc.exception.reason == {
            'errors': [{
                'id': '5b26d040-bc74-11ea-a12c-efb44ca2c609',
                'code': 'bad-request',
                'code2': '',
                'message': 'Invalid request: epochTime must be a number'
            }]
        }