Unverified Commit efd0381c by Mushtaq Ali Committed by GitHub

Merge pull request #16543 from edx/mushtaq/video-pipeline-jwt-modifications

Video pipeline jwt modifications
parents 5d80c823 40d74e77
...@@ -5,11 +5,13 @@ import json ...@@ -5,11 +5,13 @@ import json
import logging import logging
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from provider.oauth2.models import Client
from slumber.exceptions import HttpClientError from slumber.exceptions import HttpClientError
from openedx.core.djangoapps.video_pipeline.models import VideoPipelineIntegration from openedx.core.djangoapps.video_pipeline.models import VideoPipelineIntegration
from openedx.core.djangoapps.video_pipeline.utils import create_video_pipeline_api_client from openedx.core.djangoapps.video_pipeline.utils import create_video_pipeline_api_client
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -29,10 +31,16 @@ def update_3rd_party_transcription_service_credentials(**credentials_payload): ...@@ -29,10 +31,16 @@ def update_3rd_party_transcription_service_credentials(**credentials_payload):
if pipeline_integration.enabled: if pipeline_integration.enabled:
try: try:
video_pipeline_user = pipeline_integration.get_service_user() video_pipeline_user = pipeline_integration.get_service_user()
oauth_client = Client.objects.get(name=pipeline_integration.client_name)
except ObjectDoesNotExist: except ObjectDoesNotExist:
return error_response, is_updated return error_response, is_updated
client = create_video_pipeline_api_client(user=video_pipeline_user, api_url=pipeline_integration.api_url) client = create_video_pipeline_api_client(
user=video_pipeline_user,
api_client_id=oauth_client.client_id,
api_client_secret=oauth_client.client_secret,
api_url=pipeline_integration.api_url
)
try: try:
client.transcript_credentials.post(credentials_payload) client.transcript_credentials.post(credentials_payload)
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('video_pipeline', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='videopipelineintegration',
name='client_name',
field=models.CharField(default=b'VEDA-Prod', help_text='Oauth client name of video pipeline service.', max_length=100),
),
migrations.AlterField(
model_name='videopipelineintegration',
name='service_username',
field=models.CharField(default=b'veda_service_user', help_text='Username created for Video Pipeline Integration, e.g. veda_service_user.', max_length=100),
),
]
...@@ -11,6 +11,14 @@ class VideoPipelineIntegration(ConfigurationModel): ...@@ -11,6 +11,14 @@ class VideoPipelineIntegration(ConfigurationModel):
""" """
Manages configuration for connecting to the edx-video-pipeline service and using its API. Manages configuration for connecting to the edx-video-pipeline service and using its API.
""" """
client_name = models.CharField(
max_length=100,
default='VEDA-Prod',
null=False,
blank=False,
help_text=_('Oauth client name of video pipeline service.')
)
api_url = models.URLField( api_url = models.URLField(
verbose_name=_('Internal API URL'), verbose_name=_('Internal API URL'),
help_text=_('edx-video-pipeline API URL.') help_text=_('edx-video-pipeline API URL.')
...@@ -18,10 +26,10 @@ class VideoPipelineIntegration(ConfigurationModel): ...@@ -18,10 +26,10 @@ class VideoPipelineIntegration(ConfigurationModel):
service_username = models.CharField( service_username = models.CharField(
max_length=100, max_length=100,
default='video_pipeline_service_user', default='veda_service_user',
null=False, null=False,
blank=False, blank=False,
help_text=_('Username created for Video Pipeline Integration, e.g. video_pipeline_service_user.') help_text=_('Username created for Video Pipeline Integration, e.g. veda_service_user.')
) )
def get_service_user(self): def get_service_user(self):
......
""" """
Mixins to test video pipeline integration. Mixins to test video pipeline integration.
""" """
from provider.constants import CONFIDENTIAL
from provider.oauth2.models import Client
from openedx.core.djangoapps.video_pipeline.models import VideoPipelineIntegration from openedx.core.djangoapps.video_pipeline.models import VideoPipelineIntegration
...@@ -12,6 +15,17 @@ class VideoPipelineIntegrationMixin(object): ...@@ -12,6 +15,17 @@ class VideoPipelineIntegrationMixin(object):
'enabled': True, 'enabled': True,
'api_url': 'https://video-pipeline.example.com/api/v1/', 'api_url': 'https://video-pipeline.example.com/api/v1/',
'service_username': 'cms_video_pipeline_service_user', 'service_username': 'cms_video_pipeline_service_user',
'client_name': 'video_pipeline'
}
video_pipelien_oauth_client_defaults = {
'name': 'video_pipeline',
'url': 'https://video-pipeline.example.com/api/v1/',
'redirect_uri': 'https://video-pipeline.example.com/api/v1/redirect',
'logout_uri': 'https://video-pipeline.example.com/api/v1/logout',
'client_id': 'video_pipeline_client_id',
'client_secret': 'video_pipeline_client_secret',
'client_type': CONFIDENTIAL
} }
def create_video_pipeline_integration(self, **kwargs): def create_video_pipeline_integration(self, **kwargs):
...@@ -21,3 +35,12 @@ class VideoPipelineIntegrationMixin(object): ...@@ -21,3 +35,12 @@ class VideoPipelineIntegrationMixin(object):
""" """
fields = dict(self.video_pipeline_integration_defaults, **kwargs) fields = dict(self.video_pipeline_integration_defaults, **kwargs)
return VideoPipelineIntegration.objects.create(**fields) return VideoPipelineIntegration.objects.create(**fields)
def create_video_pipeline_oauth_client(self, user, **kwargs):
"""
Creates a new `Client` record with `video_pipelien_oauth_client_defaults`,
and it can be updated with any provided overrides.
"""
fields = dict(self.video_pipelien_oauth_client_defaults, **kwargs)
fields['user'] = user
return Client.objects.create(**fields)
...@@ -22,6 +22,7 @@ class TestAPIUtils(VideoPipelineIntegrationMixin, TestCase): ...@@ -22,6 +22,7 @@ class TestAPIUtils(VideoPipelineIntegrationMixin, TestCase):
def setUp(self): def setUp(self):
self.pipeline_integration = self.create_video_pipeline_integration() self.pipeline_integration = self.create_video_pipeline_integration()
self.user = UserFactory(username=self.pipeline_integration.service_username) self.user = UserFactory(username=self.pipeline_integration.service_username)
self.oauth_client = self.create_video_pipeline_oauth_client(user=self.user)
def test_update_transcription_service_credentials_with_integration_disabled(self): def test_update_transcription_service_credentials_with_integration_disabled(self):
""" """
...@@ -41,6 +42,15 @@ class TestAPIUtils(VideoPipelineIntegrationMixin, TestCase): ...@@ -41,6 +42,15 @@ class TestAPIUtils(VideoPipelineIntegrationMixin, TestCase):
__, is_updated = update_3rd_party_transcription_service_credentials() __, is_updated = update_3rd_party_transcription_service_credentials()
self.assertFalse(is_updated) self.assertFalse(is_updated)
def test_update_transcription_service_credentials_with_unknown_oauth_client(self):
"""
Test updating the credentials when expected oauth cleint is not present.
"""
self.pipeline_integration.client_name = 'non_existent_client'
self.pipeline_integration.save()
__, is_updated = update_3rd_party_transcription_service_credentials()
self.assertFalse(is_updated)
@ddt.data( @ddt.data(
{ {
'username': 'Jason_cielo_24', 'username': 'Jason_cielo_24',
......
"""
Utils for video_pipeline app.
"""
from django.conf import settings from django.conf import settings
from edx_rest_api_client.client import EdxRestApiClient from edx_rest_api_client.client import EdxRestApiClient
from openedx.core.lib.token_utils import JwtBuilder from openedx.core.lib.token_utils import JwtBuilder
def create_video_pipeline_api_client(user, api_url): def create_video_pipeline_api_client(user, api_client_id, api_client_secret, api_url):
""" """
Returns an API client which can be used to make Video Pipeline API requests. Returns an API client which can be used to make Video Pipeline API requests.
Arguments: Arguments:
user(User): A requesting user. user(User): A requesting user.
api_client_id(unicode): Video pipeline client id.
api_client_secret(unicode): Video pipeline client secret.
api_url(unicode): It is video pipeline's API URL. api_url(unicode): It is video pipeline's API URL.
""" """
jwt_token = JwtBuilder(user).build_token( jwt_token = JwtBuilder(user, secret=api_client_secret).build_token(
scopes=[], scopes=[],
expires_in=settings.OAUTH_ID_TOKEN_EXPIRATION expires_in=settings.OAUTH_ID_TOKEN_EXPIRATION,
aud=api_client_id
) )
return EdxRestApiClient(api_url, jwt=jwt_token) return EdxRestApiClient(api_url, jwt=jwt_token)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment