Allow configuring datasync watcher kwargs

This commit is contained in:
Lance Edgar 2022-08-21 15:22:29 -05:00
parent 87cced1637
commit 7b2fef5f09
3 changed files with 209 additions and 15 deletions

View file

@ -218,9 +218,111 @@
</b-input>
</b-field>
<b-field :label="`Kwargs (${'$'}{editingProfilePendingWatcherKwargs.length})`">
<b-button type="is-primary"
icon-pack="fas"
icon-left="edit"
:disabled="editingWatcherKwarg"
@click="editingWatcherKwargs = !editingWatcherKwargs">
{{ editingWatcherKwargs ? "Stop Editing" : "Edit Kwargs" }}
</b-button>
</b-field>
</b-field>
<div style="display: flex;">
<div v-show="editingWatcherKwargs"
style="display: flex; justify-content: end;">
<b-button type="is-primary"
v-show="!editingWatcherKwarg"
icon-pack="fas"
icon-left="plus"
@click="newWatcherKwarg()">
New Watcher Kwarg
</b-button>
<div v-show="editingWatcherKwarg">
<b-field grouped>
<b-field label="Key"
:type="editingWatcherKwargKey ? null : 'is-danger'">
<b-input v-model="editingWatcherKwargKey"
ref="watcherKwargKey">
</b-input>
</b-field>
<b-field label="Value"
:type="editingWatcherKwargValue ? null : 'is-danger'">
<b-input v-model="editingWatcherKwargValue">
</b-input>
</b-field>
</b-field>
<b-field grouped>
<b-button @click="editingWatcherKwarg = null"
class="control"
>
Cancel
</b-button>
<b-button type="is-primary"
@click="updateWatcherKwarg()"
class="control">
Update Kwarg
</b-button>
</b-field>
</div>
<b-table :data="editingProfilePendingWatcherKwargs"
style="margin-left: 1rem;">
<template slot-scope="props">
<b-table-column field="key" label="Key">
{{ props.row.key }}
</b-table-column>
<b-table-column field="value" label="Value">
{{ props.row.value }}
</b-table-column>
<b-table-column label="Actions">
<a href="#"
@click.prevent="editProfileWatcherKwarg(props.row)">
<i class="fas fa-edit"></i>
Edit
</a>
&nbsp;
<a href="#"
class="has-text-danger"
@click.prevent="deleteProfileWatcherKwarg(props.row)">
<i class="fas fa-trash"></i>
Delete
</a>
</b-table-column>
</template>
<template slot="empty">
<section class="section">
<div class="content has-text-grey has-text-centered">
<p>
<b-icon
pack="fas"
icon="fas fa-sad-tear"
size="is-large">
</b-icon>
</p>
<p>Nothing here.</p>
</div>
</section>
</template>
</b-table>
</div>
<div v-show="!editingWatcherKwargs"
style="display: flex;">
<div style="width: 40%;">
@ -512,6 +614,7 @@
ThisPage.methods.newProfile = function() {
this.editingProfile = {}
this.editingConsumer = null
this.editingWatcherKwargs = false
this.editingProfileKey = null
this.editingProfileWatcherSpec = null
@ -523,6 +626,7 @@
this.editingProfileWatcherConsumesSelf = false
this.editingProfileEnabled = true
this.editingProfilePendingConsumers = []
this.editingProfilePendingWatcherKwargs = []
this.editProfileShowDialog = true
this.$nextTick(() => {
@ -533,6 +637,7 @@
ThisPage.methods.editProfile = function(row) {
this.editingProfile = row
this.editingConsumer = null
this.editingWatcherKwargs = false
this.editingProfileKey = row.key
this.editingProfileWatcherSpec = row.watcher_spec
@ -544,6 +649,16 @@
this.editingProfileWatcherConsumesSelf = row.watcher_consumes_self
this.editingProfileEnabled = row.enabled
this.editingProfilePendingWatcherKwargs = []
for (let kwarg of row.watcher_kwargs_data) {
let pending = {
original_key: kwarg.key,
key: kwarg.key,
value: kwarg.value,
}
this.editingProfilePendingWatcherKwargs.push(pending)
}
this.editingProfilePendingConsumers = []
for (let consumer of row.consumers_data) {
let pending = {
@ -563,6 +678,46 @@
this.editProfileShowDialog = true
}
ThisPageData.editingWatcherKwargs = false
ThisPageData.editingProfilePendingWatcherKwargs = []
ThisPageData.editingWatcherKwarg = null
ThisPageData.editingWatcherKwargKey = null
ThisPageData.editingWatcherKwargValue = null
ThisPage.methods.newWatcherKwarg = function() {
this.editingWatcherKwargKey = null
this.editingWatcherKwargValue = null
this.editingWatcherKwarg = {key: null, value: null}
this.$nextTick(() => {
this.$refs.watcherKwargKey.focus()
})
}
ThisPage.methods.editProfileWatcherKwarg = function(row) {
this.editingWatcherKwargKey = row.key
this.editingWatcherKwargValue = row.value
this.editingWatcherKwarg = row
}
ThisPage.methods.updateWatcherKwarg = function() {
let pending = this.editingWatcherKwarg
let isNew = !pending.key
pending.key = this.editingWatcherKwargKey
pending.value = this.editingWatcherKwargValue
if (isNew) {
this.editingProfilePendingWatcherKwargs.push(pending)
}
this.editingWatcherKwarg = null
}
ThisPage.methods.deleteProfileWatcherKwarg = function(row) {
let i = this.editingProfilePendingWatcherKwargs.indexOf(row)
this.editingProfilePendingWatcherKwargs.splice(i, 1)
}
ThisPage.methods.findOriginalConsumer = function(key) {
for (let consumer of this.editingProfile.consumers_data) {
if (consumer.key == key) {
@ -590,11 +745,39 @@
row.enabled = this.editingProfileEnabled
// track which keys still belong (persistent)
let persistent = []
let persistentWatcherKwargs = []
// transfer pending data to profile watcher kwargs
for (let pending of this.editingProfilePendingWatcherKwargs) {
persistentWatcherKwargs.push(pending.key)
if (pending.original_key) {
let kwarg = this.findOriginalWatcherKwarg(pending.original_key)
kwarg.key = pending.key
kwarg.value = pending.value
} else {
row.watcher_kwargs_data.push(pending)
}
}
// remove any kwargs not being persisted
let removeWatcherKwargs = []
for (let kwarg of row.watcher_kwargs_data) {
let i = persistentWatcherKwargs.indexOf(kwarg.key)
if (i < 0) {
removeWatcherKwargs.push(kwarg)
}
}
for (let kwarg of removeWatcherKwargs) {
let i = row.watcher_kwargs_data.indexOf(kwarg)
row.watcher_kwargs_data.splice(i, 1)
}
// track which keys still belong (persistent)
let persistentConsumers = []
// transfer pending data to profile consumers
for (let pending of this.editingProfilePendingConsumers) {
persistent.push(pending.key)
persistentConsumers.push(pending.key)
if (pending.original_key) {
let consumer = this.findOriginalConsumer(pending.original_key)
consumer.key = pending.key
@ -611,14 +794,14 @@
}
// remove any consumers not being persisted
let remove = []
let removeConsumers = []
for (let consumer of row.consumers_data) {
let i = persistent.indexOf(consumer.key)
let i = persistentConsumers.indexOf(consumer.key)
if (i < 0) {
remove.push(consumer)
removeConsumers.push(consumer)
}
}
for (let consumer of remove) {
for (let consumer of removeConsumers) {
let i = row.consumers_data.indexOf(consumer)
row.consumers_data.splice(i, 1)
}

View file

@ -86,10 +86,10 @@ class WebsocketView(object):
# use given db session, or make a new one
with app.short_session(config=self.rattail_config,
session=session):
session=session) as s:
# load user proper
return session.query(model.User).get(user_uuid)
return s.query(model.User).get(user_uuid)
def get_user_session(self, scope):
settings = self.registry.settings

View file

@ -202,6 +202,9 @@ class DataSyncThreadView(MasterView):
'watcher_retry_delay': profile.watcher.retry_delay,
'watcher_default_runas': profile.watcher.default_runas,
'watcher_consumes_self': profile.watcher.consumes_self,
'watcher_kwargs_data': [{'key': key,
'value': profile.watcher_kwargs[key]}
for key in sorted(profile.watcher_kwargs)],
# 'notes': None, # TODO
'enabled': profile.enabled,
}
@ -227,8 +230,7 @@ class DataSyncThreadView(MasterView):
return {
'profiles': profiles,
'profiles_data': profiles_data,
'use_profile_settings': self.rattail_config.getbool(
'rattail.datasync', 'use_profile_settings'),
'use_profile_settings': self.datasync_handler.should_use_profile_settings(),
'supervisor_process_name': self.rattail_config.get(
'rattail.datasync', 'supervisor_process_name'),
'restart_command': self.rattail_config.get(
@ -265,6 +267,13 @@ class DataSyncThreadView(MasterView):
'value': profile['watcher_default_runas']},
])
for kwarg in profile['watcher_kwargs_data']:
settings.append({
'name': 'rattail.datasync.{}.watcher.kwarg.{}'.format(
pkey, kwarg['key']),
'value': kwarg['value'],
})
consumers = []
if profile['watcher_consumes_self']:
consumers = ['self']
@ -298,11 +307,13 @@ class DataSyncThreadView(MasterView):
settings.append({'name': 'rattail.datasync.watch',
'value': ', '.join(watch)})
settings.append({'name': 'rattail.datasync.supervisor_process_name',
'value': data['supervisor_process_name']})
if data['supervisor_process_name']:
settings.append({'name': 'rattail.datasync.supervisor_process_name',
'value': data['supervisor_process_name']})
settings.append({'name': 'tailbone.datasync.restart',
'value': data['restart_command']})
if data['restart_command']:
settings.append({'name': 'tailbone.datasync.restart',
'value': data['restart_command']})
return settings