Skip to content

Commit a612a7b

Browse files
committed
add support for cdn nodes
1 parent 07836ce commit a612a7b

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

cwm_worker_operator/cli.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import sys
22
import importlib
3+
import subprocess
4+
35
import click
46

57

@@ -187,5 +189,15 @@ def start_minio_auth_server_devel():
187189
uvicorn.run('cwm_worker_operator.minio_auth_plugin.app:app', host='0.0.0.0', port=5000, reload=True)
188190

189191

192+
@main.command(short_help="Start consecutive daemon run once commands")
193+
@click.argument('DAEMON_NAME', nargs=-1)
194+
def multi_run_once(daemon_name):
195+
for name in daemon_name:
196+
print(f'Running {name} --run-once')
197+
subprocess.check_call([
198+
'cwm-worker-operator', name, 'start_daemon', '--once'
199+
])
200+
201+
190202
if __name__ == '__main__':
191203
main()

cwm_worker_operator/deployments_manager.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,9 @@ def delete(self, namespace_name, deployment_type, delete_data=False, **kwargs):
267267
minio_admin = get_minio_admin()
268268
failed = False
269269
for cmd, args, kwargs in [
270-
('user_remove', [namespace_name], {}),
271270
('policy_unset', [namespace_name], {'user': namespace_name}),
272271
('policy_remove', [namespace_name], {}),
272+
('user_remove', [namespace_name], {}),
273273
]:
274274
try:
275275
getattr(minio_admin, cmd)(*args, **kwargs)
@@ -328,16 +328,21 @@ def iterate_cluster_nodes(self):
328328
assert ret == 0, out
329329
node = json.loads(out)
330330
is_worker = False
331+
is_cdn = False
331332
for taint in node.get('spec', {}).get('taints', []):
332-
if taint.get('key') == 'cwmc-role'and taint.get('value') == 'worker':
333-
is_worker = True
333+
if taint.get('key') == 'cwmc-role':
334+
if taint.get('value') == 'worker':
335+
is_worker = True
336+
elif taint.get('value') == 'cdn':
337+
is_cdn = True
334338
break
335339
unschedulable = bool(node.get('spec', {}).get('unschedulable'))
336340
public_ip = node.get('status', {}).get('addresses', [{}])[0].get('address', '')
337341
labels = node.get('metadata', {}).get('labels', {})
338342
yield {
339343
'name': node_name,
340344
'is_worker': is_worker,
345+
'is_cdn': is_cdn,
341346
'unschedulable': unschedulable,
342347
'public_ip': public_ip,
343348
'cleaner_cordoned': labels.get(NODE_CLEANER_CORDON_LABEL) == 'yes'
@@ -376,12 +381,19 @@ def iterate_dns_healthchecks(self):
376381
healthcheck_name = tag['Value']
377382
break
378383
healthcheck_ip = healthcheck.get('HealthCheckConfig', {}).get('IPAddress') or ''
379-
if healthcheck_name and healthcheck_name.startswith(config.DNS_RECORDS_PREFIX + ":"):
380-
yield {
381-
'id': healthcheck_id,
382-
'node_name': healthcheck_name.replace(config.DNS_RECORDS_PREFIX + ":", ""),
383-
'ip': healthcheck_ip
384-
}
384+
if healthcheck_name:
385+
if healthcheck_name.startswith(config.DNS_RECORDS_PREFIX + ":"):
386+
yield {
387+
'id': healthcheck_id,
388+
'node_name': healthcheck_name.replace(config.DNS_RECORDS_PREFIX + ":", ""),
389+
'ip': healthcheck_ip
390+
}
391+
elif healthcheck_name.startswith('minio-' + config.DNS_RECORDS_PREFIX + ":"):
392+
yield {
393+
'id': healthcheck_id,
394+
'node_name': healthcheck_name.replace('minio-' + config.DNS_RECORDS_PREFIX + ":", ""),
395+
'ip': healthcheck_ip
396+
}
385397
if res['IsTruncated']:
386398
next_marker = res['NextMarker']
387399
else:
@@ -398,7 +410,10 @@ def iterate_dns_records(self):
398410
**({'StartRecordType': next_record_type} if next_record_type is not None else {}),
399411
)
400412
for record in res.get('ResourceRecordSets', []):
401-
if record['Type'] == 'A' and record['Name'] == '{}.{}.'.format(config.DNS_RECORDS_PREFIX, config.AWS_ROUTE53_HOSTEDZONE_DOMAIN):
413+
if record['Type'] == 'A' and (
414+
record['Name'] == '{}.{}.'.format(config.DNS_RECORDS_PREFIX, config.AWS_ROUTE53_HOSTEDZONE_DOMAIN)
415+
or record['Name'] == 'minio-{}.{}.'.format(config.DNS_RECORDS_PREFIX, config.AWS_ROUTE53_HOSTEDZONE_DOMAIN)
416+
):
402417
if record['SetIdentifier'].startswith(config.DNS_RECORDS_PREFIX+':'):
403418
record_ip = ''
404419
for value in record.get('ResourceRecords', []):
@@ -423,7 +438,7 @@ def set_dns_healthcheck(self, node_name, node_ip):
423438
CallerReference=caller_reference,
424439
HealthCheckConfig={
425440
"IPAddress": node_ip,
426-
"Port": 12808,
441+
"Port": 80,
427442
"Type": "HTTP",
428443
"ResourcePath": "/healthz",
429444
"RequestInterval": 30, # according to AWS docs, when using the recommended regions, it actually does a healthcheck every 2-3 seconds
@@ -440,17 +455,20 @@ def set_dns_healthcheck(self, node_name, node_ip):
440455
)
441456
return healthcheck_id
442457

443-
def set_dns_record(self, node_name, node_ip, healthcheck_id):
458+
def set_dns_record(self, node_name, node_ip, healthcheck_id, node_type):
444459
client = boto3.client('route53')
460+
prefix = ''
461+
if node_type == 'worker':
462+
prefix = 'minio-'
445463
client.change_resource_record_sets(
446464
HostedZoneId=config.AWS_ROUTE53_HOSTEDZONE_ID,
447465
ChangeBatch={
448-
"Comment": "cwm-worker-operator deployments_manager.set_dns_record({},{})".format(node_name, node_ip),
466+
"Comment": "cwm-worker-operator deployments_manager.set_dns_record({}{},{})".format(prefix, node_name, node_ip),
449467
"Changes": [
450468
{
451469
"Action": "CREATE",
452470
"ResourceRecordSet": {
453-
"Name": '{}.{}.'.format(config.DNS_RECORDS_PREFIX, config.AWS_ROUTE53_HOSTEDZONE_DOMAIN),
471+
"Name": '{}{}.{}.'.format(prefix, config.DNS_RECORDS_PREFIX, config.AWS_ROUTE53_HOSTEDZONE_DOMAIN),
454472
'Type': 'A',
455473
'SetIdentifier': config.DNS_RECORDS_PREFIX + ':' + node_name,
456474
'MultiValueAnswer': True,

cwm_worker_operator/nodes_checker.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,25 @@
2020

2121
def set_node_healthy_keys(domains_config, deployments_manager):
2222
healthy_node_name_ips = {}
23+
node_name_types = {}
2324
# set healthy redis key of healthy nodes - so that ingress will report them as healthy
2425
for node in deployments_manager.iterate_cluster_nodes():
2526
if node['is_worker']:
27+
node_name_types[node['name']] = 'worker'
28+
elif node['is_cdn']:
29+
node_name_types[node['name']] = 'cdn'
30+
if node['name'] in node_name_types:
2631
healthy_node_name_ips[node['name']] = node['public_ip']
2732
domains_config.set_node_healthy(node['name'], True)
2833
# del healthy redis key for nodes which have a key but are not in list of healthy nodes
2934
for node_name in domains_config.iterate_healthy_node_names():
3035
if node_name not in healthy_node_name_ips:
3136
domains_config.set_node_healthy(node_name, False)
32-
return healthy_node_name_ips
37+
return healthy_node_name_ips, node_name_types
3338

3439

35-
def update_dns_records(deployments_manager, healthy_node_name_ips):
36-
logs.debug('update_dns_records', healthy_node_name_ips=healthy_node_name_ips, debug_verbosity=10)
40+
def update_dns_records(deployments_manager, healthy_node_name_ips, node_name_types):
41+
logs.debug('update_dns_records', healthy_node_name_ips=healthy_node_name_ips, node_name_types=node_name_types, debug_verbosity=10)
3742
dns_healthchecks = {}
3843
dns_records = {}
3944
# collect node names of existing dns healthchecks / records
@@ -43,8 +48,7 @@ def update_dns_records(deployments_manager, healthy_node_name_ips):
4348
for dns_healthcheck in deployments_manager.iterate_dns_healthchecks():
4449
logs.debug('dns_healthcheck', dns_healthcheck=dns_healthcheck, debug_verbosity=10)
4550
dns_healthchecks[dns_healthcheck['node_name']] = {'id': dns_healthcheck['id'], 'ip': dns_healthcheck['ip']}
46-
if dns_healthcheck['node_name'] in healthy_node_name_ips and dns_healthcheck['ip'] != healthy_node_name_ips[
47-
dns_healthcheck['node_name']]:
51+
if dns_healthcheck['node_name'] in healthy_node_name_ips and dns_healthcheck['ip'] != healthy_node_name_ips[dns_healthcheck['node_name']]:
4852
deployments_manager.delete_dns_healthcheck(dns_healthcheck['id'])
4953
update_required_healthcheck_node_names.add(dns_healthcheck['node_name'])
5054
for dns_record in deployments_manager.iterate_dns_records():
@@ -65,7 +69,7 @@ def update_dns_records(deployments_manager, healthy_node_name_ips):
6569
else:
6670
healthcheck_id = dns_healthchecks[node_name]['id']
6771
if node_name not in dns_records or node_name in update_required_records_node_names:
68-
deployments_manager.set_dns_record(node_name, node_ip, healthcheck_id)
72+
deployments_manager.set_dns_record(node_name, node_ip, healthcheck_id, node_name_types[node_name])
6973
return dns_healthchecks, dns_records
7074

7175

@@ -81,8 +85,8 @@ def delete_dns_records(deployments_manager, healthy_node_name_ips, dns_healthche
8185

8286

8387
def run_single_iteration(domains_config, deployments_manager, **_):
84-
healthy_node_name_ips = set_node_healthy_keys(domains_config, deployments_manager)
85-
dns_healthchecks, dns_records = update_dns_records(deployments_manager, healthy_node_name_ips)
88+
healthy_node_name_ips, node_name_types = set_node_healthy_keys(domains_config, deployments_manager)
89+
dns_healthchecks, dns_records = update_dns_records(deployments_manager, healthy_node_name_ips, node_name_types)
8690
delete_dns_records(deployments_manager, healthy_node_name_ips, dns_healthchecks, dns_records)
8791

8892

cwm_worker_operator/updater.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def get_instances_updates(domains_config: DomainsConfig, cwm_api_manager: CwmApi
138138
last_update = None
139139
instances_updates = {}
140140
for update in cwm_api_manager.get_cwm_updates(from_datetime):
141+
logs.debug(f'get_instances_updates: update={update}', debug_verbosity=10)
141142
if last_update is None or last_update < update['update_time']:
142143
last_update = update['update_time']
143144
if update['worker_id'] not in instances_updates:

0 commit comments

Comments
 (0)