Commit ace7f39b authored by Paul Graydon's avatar Paul Graydon

software/wendelin-telecom: Rework slave instances for use by ORS

parent d79bc190
......@@ -4,4 +4,4 @@ md5sum = 79e4a9d4c632eaf0472929464a12e768
[template-wendelin-telecom]
filename = instance-wendelin-telecom.cfg.in
md5sum = eb17784ee1a9d1f5bf8f5741cd733446
md5sum = 5ed2d5da369b5b73eabf8045666ebebc
......@@ -2,25 +2,10 @@
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"project-title": {
"description": "Title of the ORS client project to register",
"title": "Client Project Title",
"type": "string"
},
"client-username": {
"description": "Username for the client project's user account",
"title": "Client Project Account Username",
"type": "string"
},
"ors-tag": {
"description": "Fluentbit tag of the ORS to register to the client project",
"description": "Fluentbit tag of the ORS to register",
"title": "ORS Tag",
"type": "string"
},
"ors-title": {
"description": "Title of the ORS to register to the client project",
"title": "ORS Title",
"type": "string"
}
}
}
......@@ -2,18 +2,5 @@
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Values returned by Wendelin Telecom",
"type": "object",
"properties": {
"ors-wendelin-homepage": {
"description": "URL to the homepage of the Wendelin Telecom platform",
"type": "string"
},
"username": {
"description": "Username for the project's user account",
"type": "string"
},
"init-password": {
"description": "Initial password for the project's user account",
"type": "string"
}
}
"properties": {}
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"client-frontend-url": {
"description": "Base URL of the Wendelin Telecom frontend instance intended for use by the clients.",
"type": "string"
}
}
"properties": {}
}
......@@ -3,23 +3,17 @@ extends =
{{ instance_erp5 }}
parts +=
ors-client-project-register
ors-register
[directory]
ors-client-project-register = ${:etc}/ors-client-project-register
[ors-client-project-register]
[ors-register]
recipe = slapos.recipe.build
slave-instance-list = {{ dumps(slave_instance_list) }}
ors-client-project-register-path = ${directory:ors-client-project-register}
backend-url = ${publish:family-default-v6}
client-frontend-url = {{ slapparameter_dict.get('client-frontend-url', '')}}
site-id = ${publish:site-id}
inituser-login = ${publish:inituser-login}
inituser-password = ${publish-early:inituser-password}
update =
import json
import logging
import os
import requests
import slapos
......@@ -31,7 +25,6 @@ update =
self.computer_id = slap_connection['computer-id']
self.computer_partition_id = slap_connection['partition-id']
self.server_url = slap_connection['server-url']
self.software_release_url = slap_connection['software-release-url']
self.key_file = slap_connection.get('key-file')
self.cert_file = slap_connection.get('cert-file')
self.slave_instance_list = list(options['slave-instance-list'])
......@@ -40,68 +33,41 @@ update =
slap.initializeConnection(self.server_url, self.key_file, self.cert_file)
computer_partition = slap.registerComputerPartition(self.computer_id, self.computer_partition_id)
ors_client_project_register_path = options['ors-client-project-register-path']
wendelin_telecom_backend_url = options['backend-url']
wendelin_telecom_client_frontend_url = options['client-frontend-url']
inituser_login = options['inituser-login']
inituser_password = options['inituser-password']
for slave in self.slave_instance_list:
slave_reference = slave['slave_reference']
try:
project_title = slave['project-title']
project_reference = project_title.replace(" ", "_").lower()
client_username = slave['client-username']
ors_tag = slave['ors-tag']
ors_title = slave['ors-title']
except KeyError as e:
log.fatal("%s: Parameter %s not found, skipping registration" % (slave_reference, e))
continue
register_file = os.path.join(ors_client_project_register_path, '%s.json' % slave_reference)
connection_dict = {}
if not os.path.exists(register_file):
with open(register_file, 'w') as file:
json.dump(connection_dict, file)
else:
with open(register_file, 'r') as file:
connection_dict = json.load(file)
request_url = "%s/erp5/Base_registerOrsClientProject?project_reference=%s&project_title=%s&client_username=%s&ors_tag=%s&ors_title=%s" \
% (wendelin_telecom_backend_url, project_reference, project_title, client_username, ors_tag, ors_title)
response = requests.get(request_url, verify=False, auth=(inituser_login, inituser_password))
response = response.json()
error_msg_key = "error_msg"
if error_msg_key in response:
error_msg = response[error_msg_key]
log.info(error_msg)
else:
if "username" in response and "init_password" in response:
connection_dict = {
"username": response['username'],
"init-password": response['init_password']
}
with open(register_file, 'w') as file:
json.dump(connection_dict, file)
log.info("ORS client project successfully registered: %s" % slave_reference)
else:
log.fatal("Error while fetching client user account credentials")
request_balancer = self.buildout['request-balancer']
zope_family_name_list = ['ingestion', 'web', 'default']
wendelin_telecom_backend_url = None
for family_name in zope_family_name_list:
connection_name = 'connection-%s-v6' % family_name
if connection_name in request_balancer:
wendelin_telecom_backend_url = request_balancer[connection_name]
break
if not wendelin_telecom_backend_url:
log.fatal("Wendelin Telecom backend URL not found, cannot register")
else:
wendelin_telecom_site_id = options['site-id']
inituser_login = options['inituser-login']
inituser_password = options['inituser-password']
for slave in self.slave_instance_list:
slave_reference = slave['slave_reference']
try:
ors_tag = slave['ors-tag']
except KeyError as err:
log.fatal("%s: Parameter %s not found, skipping registration" % (slave_reference, err))
continue
no_client_frontend_url_msg = "Wendelin Telecom website has not been configured."
connection_dict['wendelin-telecom-homepage'] = wendelin_telecom_client_frontend_url or no_client_frontend_url_msg
request_url = "%s/%s/ERP5Site_registerOrs?ors_tag=%s" % (wendelin_telecom_backend_url, wendelin_telecom_site_id, ors_tag)
try:
log.info("Update parameters for client project %s" % slave_reference)
response = requests.get(request_url, verify=False, auth=(inituser_login, inituser_password))
response = response.json()
computer_partition.setConnectionDict(connection_dict, slave_reference)
except Exception:
log.fatal("Error while sending slave %s information: %s",
slave_reference, traceback.format_exc())
error_msg_key = "error_msg"
if error_msg_key in response:
error_msg = response[error_msg_key]
log.info(error_msg)
else:
log.info("ORS successfully registered: %s" % slave_reference)
[publish]
slave-amount = {{ len(slave_instance_list) }}
......@@ -34,7 +34,7 @@ depends =
<= erp5
repository = https://lab.nexedi.com/paul.graydon/wendelin-telecom.git
branch = master
revision = 71d02c8d6cce7e9970b1371d149622f201440fda
revision = d29e4e3ede129af6b2ba2726e0b4b4e1f324ea0d
[local-bt5-repository]
list += ${wendelin-telecom:location}/bt5
......@@ -42,6 +42,11 @@ list += ${wendelin-telecom:location}/bt5
[erp5_repository_list]
repository_id_list += wendelin-telecom
[default-bt5]
list =
erp5_full_text_mroonga_catalog
wendelin_telecom_configurator
[template]
output = ${buildout:directory}/template-base.cfg
......
......@@ -12,7 +12,7 @@
},
"default-slave": {
"title": "Default (Shared)",
"description": "ORS Client Project Registration",
"description": "ORS Registration",
"software-type": "default",
"request": "instance-shared-input-schema.json",
"response": "instance-shared-output-schema.json",
......
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