Skip to content

Commit aa74418

Browse files
committed
feat(controller): add get manager user status
1 parent 3d3349d commit aa74418

5 files changed

Lines changed: 157 additions & 115 deletions

File tree

rootfs/api/authentication.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
get_authorization_header
99
from rest_framework import exceptions
1010

11+
from api import manager
1112
from api.oauth import OAuthManager
1213

1314
logger = logging.getLogger(__name__)
@@ -35,7 +36,7 @@ def authenticate(self, request):
3536
return AnonymousUser(), None
3637

3738

38-
class DryccOIDCAuthentication(TokenAuthentication):
39+
class DryccAuthentication(TokenAuthentication):
3940
def authenticate(self, request):
4041
if 'Drycc' in request.META.get('HTTP_USER_AGENT', ''):
4142
auth = get_authorization_header(request).split()
@@ -57,14 +58,18 @@ def authenticate(self, request):
5758
raise exceptions.AuthenticationFailed(msg)
5859
return cache.get_or_set(
5960
token, lambda: self._get_user(token), settings.OAUTH_CACHE_USER_TIME), None # noqa
60-
return super(DryccOIDCAuthentication, self).authenticate(request) # noqa
61+
return super(DryccAuthentication, self).authenticate(request) # noqa
6162

6263
@staticmethod
6364
def _get_user(key):
6465
try:
6566
user_info = OAuthManager().get_user_by_token(key)
6667
if not user_info.get('email'):
6768
user_info['email'] = OAuthManager().get_email_by_token(key)
69+
if settings.WORKFLOW_MANAGER_URL and settings.WORKFLOW_MANAGER_TOKEN:
70+
status = manager.User().get_status(user_info.username)
71+
if not status["is_active"]:
72+
raise exceptions.AuthenticationFailed(_(status["message"]))
6873
except Exception as e:
6974
logger.info(e)
7075
raise exceptions.AuthenticationFailed(_('Verify token fail.'))

rootfs/api/manager.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import requests
2+
from typing import List, Dict
3+
from requests_toolbelt import user_agent
4+
from django.conf import settings
5+
from api import __version__ as drycc_version
6+
7+
8+
class ManagerAPI(object):
9+
10+
def __init__(self):
11+
self.headers = {
12+
'Content-Type': 'application/json',
13+
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
14+
'User-Agent': user_agent('Drycc Controller ', drycc_version)
15+
}
16+
17+
def requests(self, method, url, **kwargs):
18+
headers = kwargs.get("headers", {})
19+
headers.update(self.headers)
20+
kwargs["headers"] = headers
21+
requests.request(method, url, **kwargs)
22+
23+
def get(self, url, params=None, **kwargs):
24+
return self.request('get', url, params=params, **kwargs)
25+
26+
def options(self, url, **kwargs):
27+
return self.request('options', url, **kwargs)
28+
29+
def head(self, url, **kwargs):
30+
kwargs.setdefault('allow_redirects', False)
31+
return self.request('head', url, **kwargs)
32+
33+
def post(self, url, data=None, json=None, **kwargs):
34+
return self.request('post', url, data=data, json=json, **kwargs)
35+
36+
def put(self, url, data=None, **kwargs):
37+
return self.request('put', url, data=data, **kwargs)
38+
39+
def patch(self, url, data=None, **kwargs):
40+
return self.request('patch', url, data=data, **kwargs)
41+
42+
def delete(self, url, **kwargs):
43+
return self.request('delete', url, **kwargs)
44+
45+
46+
class User(ManagerAPI):
47+
48+
def get_status(self, username):
49+
"""
50+
{
51+
"is_active": false,
52+
"message": "The user is in arrears"
53+
}
54+
"""
55+
url = f"{settings.WORKFLOW_MANAGER_URL}/users/{username}/status/"
56+
return self.get(url=url).json()
57+
58+
59+
class Measurement(ManagerAPI):
60+
61+
def post_config(self, config: List[Dict[str, str]]):
62+
"""
63+
[
64+
{
65+
"app_id": "test",
66+
"owner_id": "test",
67+
"container_type": web,
68+
"cpu": "1",
69+
"memory": "2G",
70+
"timestamp": 1609231998.9103732
71+
}
72+
]
73+
"""
74+
url = "%s/measurements/config/" % settings.WORKFLOW_MANAGER_URL
75+
return self.post(url=url, json=config)
76+
77+
def post_volumes(self, volumes: List[Dict[str, str]]):
78+
"""
79+
[
80+
{
81+
"name": "disk",
82+
"app_id": "test",
83+
"owner_id": "test",
84+
"size": "100G",
85+
"timestamp": "1609231998.9103732"
86+
}
87+
]
88+
"""
89+
url = "%s/measurements/volumes/" % settings.WORKFLOW_MANAGER_URL,
90+
return self.post(url=url, json=volumes)
91+
92+
def post_networks(self, networks: List[Dict[str, str]]):
93+
"""
94+
[
95+
{
96+
"app_id": "test",
97+
"owner_id": "test",
98+
"pod_name": "django2test-web-xxxxxx",
99+
"rx_bytes": "10000",
100+
"tx_bytes": "200000",
101+
"timestamp": "1609231998.9103732"
102+
}
103+
]
104+
"""
105+
url = "%s/measurements/networks/" % settings.WORKFLOW_MANAGER_URL
106+
return self.post(url=url, json=networks)
107+
108+
def post_instances(self, instances: List[Dict[str, str]]):
109+
"""
110+
[
111+
{
112+
"app_id": "test",
113+
"owner_id": "test",
114+
"container_type": "web",
115+
"container_count": 1,
116+
"timestamp": "1609231998.9103732"
117+
}
118+
]
119+
"""
120+
url = "%s/measurements/instances/" % settings.WORKFLOW_MANAGER_URL
121+
return self.post(url=url, json=instances)
122+
123+
def post_resources(self, resources: List[Dict[str, str]]):
124+
"""
125+
[
126+
{
127+
"name": "test1",
128+
"app_id": "redis",
129+
"owener_id": "test",
130+
"plan": "redis:small",
131+
"timestamp": "1609231998.9103732"
132+
}
133+
]
134+
"""
135+
url = "%s/measurements/resources/" % settings.WORKFLOW_MANAGER_URL
136+
return self.post(url=url, json=resources)

rootfs/api/models/app.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,6 @@ def validate_reserved_names(value):
5959
raise ValidationError('{} is a reserved name.'.format(value))
6060

6161

62-
class Pod(dict):
63-
pass
64-
65-
6662
class App(UuidAuditedModel):
6763
"""
6864
Application used to service requests on behalf of end-users
@@ -945,7 +941,7 @@ def list_pods(self, *args, **kwargs):
945941
if self._scheduler.pod.deleted(p):
946942
continue
947943

948-
item = Pod()
944+
item = {}
949945
item['name'] = p['metadata']['name']
950946
item['state'] = state
951947
item['release'] = labels['version']

rootfs/api/settings/production.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@
158158
'rest_framework.permissions.IsAuthenticated',
159159
),
160160
'DEFAULT_AUTHENTICATION_CLASSES': (
161-
'api.authentication.DryccOIDCAuthentication',
161+
'api.authentication.DryccAuthentication',
162162
),
163163
'DEFAULT_RENDERER_CLASSES': (
164164
'rest_framework.renderers.JSONRenderer',

rootfs/api/tasks.py

Lines changed: 12 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
# Create your tasks here
22
import time
33
import uuid
4-
import json
54
import logging
6-
import requests
75
from datetime import timedelta
86
from typing import List, Dict
97
from django.core import signals
10-
from django.conf import settings
118
from django.utils.timezone import now
129
from celery import shared_task
13-
from requests_toolbelt import user_agent
10+
11+
from api import manager
1412
from api.models.resource import Resource
15-
from api import __version__ as drycc_version
1613
logger = logging.getLogger(__name__)
1714

1815

@@ -41,30 +38,11 @@ def retrieve_resource(resource):
4138

4239
@shared_task
4340
def measure_config(config: List[Dict[str, str]]):
44-
"""
45-
[
46-
{
47-
"app_id": "test",
48-
"owner_id": "test",
49-
"container_type": web,
50-
"cpu": "1",
51-
"memory": "2G",
52-
"timestamp": 1609231998.9103732
53-
}
54-
]
55-
"""
5641
task_id = uuid.uuid4().hex
5742
signals.request_started.send(sender=task_id)
5843
try:
59-
requests.post(
60-
url="%s/measurements/config/" % settings.WORKFLOW_MANAGER_URL,
61-
headers={
62-
'Content-Type': 'application/json',
63-
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
64-
'User-Agent': user_agent('Drycc Controller ', drycc_version)
65-
},
66-
data=json.dumps(config)
67-
)
44+
measurement = manager.Measurement()
45+
measurement.post_config(config)
6846
except Exception as e:
6947
logger.exception("write influxdb point fail: {}".format(e))
7048
finally:
@@ -73,29 +51,11 @@ def measure_config(config: List[Dict[str, str]]):
7351

7452
@shared_task
7553
def measure_volumes(volumes: List[Dict[str, str]]):
76-
"""
77-
[
78-
{
79-
"name": "disk",
80-
"app_id": "test",
81-
"owner_id": "test",
82-
"size": "100G",
83-
"timestamp": "1609231998.9103732"
84-
}
85-
]
86-
"""
8754
task_id = uuid.uuid4().hex
8855
signals.request_started.send(sender=task_id)
8956
try:
90-
requests.post(
91-
url="%s/measurements/volumes/" % settings.WORKFLOW_MANAGER_URL,
92-
headers={
93-
'Content-Type': 'application/json',
94-
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
95-
'User-Agent': user_agent('Drycc Controller ', drycc_version)
96-
},
97-
data=json.dumps(volumes)
98-
)
57+
measurement = manager.Measurement()
58+
measurement.post_volumes(volumes)
9959
except Exception as e:
10060
logger.exception("write influxdb point fail: {}".format(e))
10161
finally:
@@ -104,30 +64,11 @@ def measure_volumes(volumes: List[Dict[str, str]]):
10464

10565
@shared_task
10666
def measure_networks(networks: List[Dict[str, str]]):
107-
"""
108-
[
109-
{
110-
"app_id": "test",
111-
"owner_id": "test",
112-
"pod_name": "django2test-web-xxxxxx",
113-
"rx_bytes": "10000",
114-
"tx_bytes": "200000",
115-
"timestamp": "1609231998.9103732"
116-
}
117-
]
118-
"""
11967
task_id = uuid.uuid4().hex
12068
signals.request_started.send(sender=task_id)
12169
try:
122-
requests.post(
123-
url="%s/measurements/networks/" % settings.WORKFLOW_MANAGER_URL,
124-
headers={
125-
'Content-Type': 'application/json',
126-
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
127-
'User-Agent': user_agent('Drycc Controller ', drycc_version)
128-
},
129-
data=json.dumps(networks)
130-
)
70+
measurement = manager.Measurement()
71+
measurement.post_networks(networks)
13172
except Exception as e:
13273
logger.exception("write influxdb point fail: {}".format(e))
13374
finally:
@@ -136,29 +77,11 @@ def measure_networks(networks: List[Dict[str, str]]):
13677

13778
@shared_task
13879
def measure_instances(instances: List[Dict[str, str]]):
139-
"""
140-
[
141-
{
142-
"app_id": "test",
143-
"owner_id": "test",
144-
"container_type": "web",
145-
"container_count": 1,
146-
"timestamp": "1609231998.9103732"
147-
}
148-
]
149-
"""
15080
task_id = uuid.uuid4().hex
15181
signals.request_started.send(sender=task_id)
15282
try:
153-
requests.post(
154-
url="%s/measurements/instances/" % settings.WORKFLOW_MANAGER_URL,
155-
headers={
156-
'Content-Type': 'application/json',
157-
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
158-
'User-Agent': user_agent('Drycc Controller ', drycc_version)
159-
},
160-
data=json.dumps(instances)
161-
)
83+
measurement = manager.Measurement()
84+
measurement.post_instances(instances)
16285
except Exception as e:
16386
logger.exception("write influxdb point fail: {}".format(e))
16487
finally:
@@ -167,29 +90,11 @@ def measure_instances(instances: List[Dict[str, str]]):
16790

16891
@shared_task
16992
def measure_resources(resources: List[Dict[str, str]]):
170-
"""
171-
[
172-
{
173-
"name": "test1",
174-
"app_id": "redis",
175-
"owener_id": "test",
176-
"plan": "redis:small",
177-
"timestamp": "1609231998.9103732"
178-
}
179-
]
180-
"""
18193
task_id = uuid.uuid4().hex
18294
signals.request_started.send(sender=task_id)
18395
try:
184-
requests.post(
185-
url="%s/measurements/resources/" % settings.WORKFLOW_MANAGER_URL,
186-
headers={
187-
'Content-Type': 'application/json',
188-
'Authorization': 'token %s' % settings.WORKFLOW_MANAGER_TOKEN,
189-
'User-Agent': user_agent('Drycc Controller ', drycc_version)
190-
},
191-
data=json.dumps(resources)
192-
)
96+
measurement = manager.Measurement()
97+
measurement.post_resources(resources)
19398
except Exception as e:
19499
logger.exception("write influxdb point fail: {}".format(e))
195100
finally:

0 commit comments

Comments
 (0)