Skip to content

Commit 153c60d

Browse files
committed
feat(auth): add token api
1 parent 91a8ec8 commit 153c60d

51 files changed

Lines changed: 539 additions & 336 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

charts/controller/templates/_helpers.tpl

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,70 @@ resources:
292292
{{- end }}
293293
{{- end }}
294294
{{- end }}
295+
296+
{{/* Generate controller config default metrics */}}
297+
{{ define "controller.config.defaultMetrics" }}
298+
container_cpu_system_seconds_total: [instance, namespace, pod, container]
299+
container_cpu_usage_seconds_total: [instance, namespace, pod, container]
300+
container_cpu_user_seconds_total: [instance, namespace, pod, container]
301+
container_cpu_cfs_periods_total: [instance, namespace, pod, container]
302+
container_cpu_cfs_throttled_periods_total: [instance, namespace, pod, container]
303+
container_cpu_cfs_throttled_seconds_total: [instance, namespace, pod, container]
304+
container_fs_inodes_free: [instance, namespace, pod, container]
305+
container_fs_usage_bytes: [instance, namespace, pod, container]
306+
container_fs_inodes_total: [instance, namespace, pod, container]
307+
container_fs_io_current: [instance, namespace, pod, container]
308+
container_fs_io_time_seconds_total: [instance, namespace, pod, container]
309+
container_fs_io_time_weighted_seconds_total: [instance, namespace, pod, container]
310+
container_fs_limit_bytes: [instance, namespace, pod, container]
311+
container_fs_reads_bytes_total: [instance, namespace, pod, container]
312+
container_fs_read_seconds_total: [instance, namespace, pod, container]
313+
container_fs_reads_merged_total: [instance, namespace, pod, container]
314+
container_fs_reads_total: [instance, namespace, pod, container]
315+
container_fs_sector_reads_total: [instance, namespace, pod, container]
316+
container_fs_sector_writes_total: [instance, namespace, pod, container]
317+
container_fs_writes_bytes_total: [instance, namespace, pod, container]
318+
container_fs_write_seconds_total: [instance, namespace, pod, container]
319+
container_fs_writes_merged_total: [instance, namespace, pod, container]
320+
container_fs_writes_total: [instance, namespace, pod, container]
321+
container_blkio_device_usage_total: [instance, namespace, pod, container]
322+
container_memory_failures_total: [instance, namespace, pod, container]
323+
container_memory_failcnt: [instance, namespace, pod, container]
324+
container_memory_cache: [instance, namespace, pod, container]
325+
container_memory_mapped_file: [instance, namespace, pod, container]
326+
container_memory_max_usage_bytes: [instance, namespace, pod, container]
327+
container_memory_rss: [instance, namespace, pod, container]
328+
container_memory_swap: [instance, namespace, pod, container]
329+
container_memory_usage_bytes: [instance, namespace, pod, container]
330+
container_memory_working_set_bytes: [instance, namespace, pod, container]
331+
container_network_receive_bytes_total: [instance, namespace, pod, container]
332+
container_network_receive_errors_total: [instance, namespace, pod, container]
333+
container_network_receive_packets_dropped_total: [instance, namespace, pod, container]
334+
container_network_receive_packets_total: [instance, namespace, pod, container]
335+
container_network_transmit_bytes_total: [instance, namespace, pod, container]
336+
container_network_transmit_errors_total: [instance, namespace, pod, container]
337+
container_network_transmit_packets_dropped_total: [instance, namespace, pod, container]
338+
container_network_transmit_packets_total: [instance, namespace, pod, container]
339+
container_processes: [instance, namespace, pod, container]
340+
container_sockets: [instance, namespace, pod, container]
341+
container_file_descriptors: [instance, namespace, pod, container]
342+
container_threads: [instance, namespace, pod, container]
343+
container_threads_max: [instance, namespace, pod, container]
344+
container_ulimits_soft: [instance, namespace, pod, container]
345+
container_spec_cpu_period: [instance, namespace, pod, container]
346+
container_spec_cpu_shares: [instance, namespace, pod, container]
347+
container_spec_memory_limit_bytes: [instance, namespace, pod, container]
348+
container_spec_memory_reservation_limit_bytes: [instance, namespace, pod, container]
349+
container_spec_memory_swap_limit_bytes: [instance, namespace, pod, container]
350+
container_start_time_seconds: [instance, namespace, pod, container]
351+
container_last_seen: [instance, namespace, pod, container]
352+
container_accelerator_memory_used_bytes: [instance, namespace, pod, container]
353+
container_accelerator_memory_total_bytes: [instance, namespace, pod, container]
354+
container_accelerator_duty_cycle: [instance, namespace, pod, container]
355+
kube_pod_ips: [ip, ip_family, namespace, node, pod]
356+
kube_pod_container_status_running: [container, namespace, node, pod]
357+
kube_pod_container_status_ready: [container, namespace, node, pod]
358+
kube_pod_container_status_terminated: [container, namespace, node, pod]
359+
kube_pod_container_status_waiting: [container, namespace, node, pod]
360+
kube_pod_container_status_restarts_total: [container, namespace, node, pod]
361+
{{- end }}

charts/controller/templates/controller-api-deployment.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,11 @@ spec:
8484
name: http
8585
{{- include "controller.limits" . | indent 8 }}
8686
{{- include "controller.envs" . | indent 8 }}
87+
volumeMounts:
88+
- name: controller-config
89+
readOnly: false
90+
mountPath: /etc/controller
91+
volumes:
92+
- name: controller-config
93+
configMap:
94+
name: controller-config

charts/controller/templates/controller-configmap.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ metadata:
55
labels:
66
heritage: drycc
77
data:
8+
metrics.json: |
9+
{{- if .Values.config.metrics }}
10+
{{- (tpl .Values.config.metrics $) | nindent 4 }}
11+
{{- else}}
12+
{{- include "controller.config.defaultMetrics" . | fromYaml | toPrettyJson | nindent 4 }}
13+
{{- end }}
814
limit-specs.json: |
915
{{- if .Values.config.limitSpecs }}
1016
{{- (tpl .Values.config.limitSpecs $) | nindent 4 }}

charts/controller/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ rabbitmqUrl: ""
6868

6969
# limit specs, plans config
7070
config:
71+
metrics: ""
7172
limitSpecs: ""
7273
limitPlans: ""
7374

rootfs/api/apps_extra/social_core/actions.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
user_is_active,
88
user_is_authenticated,
99
)
10-
from api.oauth import TokenManager
1110

1211

1312
def do_auth(backend, redirect_name="next"):
@@ -40,8 +39,9 @@ def form2json(form_data):
4039
query = urlparse("?" + form_data).query
4140
params = parse_qs(query)
4241
return {key: params[key][0] for key in params}
43-
manager = TokenManager()
44-
manager.set_state(data.get("key", ""), form2json(url).get("state"))
42+
from api.backend import OauthCacheManager
43+
oauth_cache_manager = OauthCacheManager()
44+
oauth_cache_manager.set_state(data.get("key", ""), form2json(url).get("state"))
4545
return response
4646

4747

@@ -129,8 +129,9 @@ def do_complete(backend, login, user=None, redirect_name="next", *args, **kwargs
129129
if social_auth and social_auth.extra_data:
130130
extra_data = json.loads(social_auth.extra_data) if \
131131
isinstance(social_auth.extra_data, str) else social_auth.extra_data
132-
manager = TokenManager()
133-
manager.set_token(data.get("state"), extra_data.get("access_token", "fail"), user.username)
132+
from api.backend import OauthCacheManager
133+
oauth_cache_manager = OauthCacheManager()
134+
oauth_cache_manager.set_token(data.get("state"), extra_data)
134135
return response
135136

136137

rootfs/api/authentication.py

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import logging
2-
from django.conf import settings
32
from django.contrib.auth.models import AnonymousUser
43
from django.core.cache import cache
54
from django.utils.translation import gettext_lazy
65
from rest_framework import authentication
7-
from rest_framework.authentication import TokenAuthentication, \
8-
get_authorization_header
6+
from rest_framework.authentication import get_authorization_header
97
from rest_framework import exceptions
108

11-
129
logger = logging.getLogger(__name__)
1310

1411

@@ -21,44 +18,63 @@ def authenticate(self, request):
2118
return AnonymousUser(), None
2219

2320

24-
class DryccAuthentication(TokenAuthentication):
21+
class DryccAuthentication(authentication.BaseAuthentication):
2522

26-
def authenticate(self, request):
27-
if 'Drycc' in request.META.get('HTTP_USER_AGENT', ''):
28-
auth = get_authorization_header(request).split()
29-
30-
if not auth or auth[0].lower() != self.keyword.lower().encode():
31-
return None
23+
keywords = ('token', 'bearer')
3224

25+
def parse_header(self, request):
26+
try:
27+
auth = get_authorization_header(request).split()
28+
if not auth or auth[0].decode().lower() not in self.keywords:
29+
return None, None
3330
if len(auth) == 1:
3431
msg = gettext_lazy('Invalid token header. No credentials provided.')
3532
raise exceptions.AuthenticationFailed(msg)
3633
elif len(auth) > 2:
3734
msg = gettext_lazy(
3835
'Invalid token header. Token string should not contain spaces.')
3936
raise exceptions.AuthenticationFailed(msg)
37+
return auth[0].decode().lower(), auth[1].decode()
38+
except UnicodeError:
39+
msg = gettext_lazy(
40+
'Invalid token header. Token string should not contain invalid characters.')
41+
raise exceptions.AuthenticationFailed(msg)
4042

41-
try:
42-
token = auth[1].decode()
43-
except UnicodeError:
44-
msg = gettext_lazy(
45-
'Invalid token header. Token string should not contain invalid characters.')
46-
raise exceptions.AuthenticationFailed(msg)
47-
return self.sync_user(token), None
48-
return super(DryccAuthentication, self).authenticate(request)
43+
def authenticate(self, request):
44+
token_type, token = self.parse_header(request)
45+
if token_type is None or token is None:
46+
return None
47+
if token_type == 'bearer': # drycc oauth access token
48+
from api.backend import OauthCacheManager
49+
return OauthCacheManager().get_user(token), token
50+
# drycc token
51+
user = cache.get(token, None)
52+
if not user:
53+
return self.authenticate_credentials(token)
54+
return user, token
55+
56+
def authenticate_credentials(self, key):
57+
from api.models.base import Token
58+
try:
59+
token = Token.objects.select_related('owner').get(key=key)
60+
except Token.DoesNotExist:
61+
raise exceptions.AuthenticationFailed(gettext_lazy('Invalid token.'))
62+
if not token.owner.is_active:
63+
raise exceptions.AuthenticationFailed(gettext_lazy('User inactive or deleted.'))
64+
if token.expires():
65+
from api.backend import OauthCacheManager
66+
token.refresh_token()
67+
user = OauthCacheManager().get_user(token.oauth['access_token'])
68+
cache.set(token, user, timeout=token.oauth['expires_in'])
69+
return user, token.key
70+
return (token.owner, token.key)
4971

50-
@staticmethod
51-
def sync_user(token):
52-
def _sync_user(token):
53-
from api import serializers
54-
from api.oauth import OAuthManager
55-
try:
56-
user_info = OAuthManager().get_user_by_token(token)
57-
if not user_info.get('email'):
58-
user_info['email'] = OAuthManager().get_email_by_token(token)
59-
user, _ = serializers.UserSerializer.update_or_create(user_info)
60-
return user
61-
except Exception as e:
62-
logger.info(e)
63-
raise exceptions.AuthenticationFailed(gettext_lazy('Verify token fail.'))
64-
return cache.get_or_set(token, lambda: _sync_user(token), settings.OAUTH_CACHE_USER_TIME)
72+
def authenticate_header(self, request):
73+
keyword = self.keywords[0]
74+
try:
75+
auth = self.parse_header(request)
76+
if auth[0]:
77+
keyword = auth[0]
78+
except exceptions.AuthenticationFailed:
79+
pass
80+
return keyword

0 commit comments

Comments
 (0)