add wait enabled.

This commit is contained in:
Miroslav Šedivý
2022-09-18 12:31:21 +02:00
parent 7b71067da0
commit 3e77a1848b
4 changed files with 33 additions and 17 deletions
+7
View File
@@ -31,6 +31,7 @@ type Room struct {
NekoPrivilegedImages []string NekoPrivilegedImages []string
PathPrefix string PathPrefix string
Labels []string Labels []string
WaitEnabled bool
StorageEnabled bool StorageEnabled bool
StorageInternal string StorageInternal string
@@ -93,6 +94,11 @@ func (Room) Init(cmd *cobra.Command) error {
return err return err
} }
cmd.PersistentFlags().Bool("wait_enabled", true, "enable active waiting for the room")
if err := viper.BindPFlag("wait_enabled", cmd.PersistentFlags().Lookup("wait_enabled")); err != nil {
return err
}
// Data // Data
cmd.PersistentFlags().Bool("storage.enabled", true, "whether storage is enabled, where peristent containers data will be stored") cmd.PersistentFlags().Bool("storage.enabled", true, "whether storage is enabled, where peristent containers data will be stored")
@@ -199,6 +205,7 @@ func (s *Room) Set() {
s.NekoPrivilegedImages = viper.GetStringSlice("neko_privileged_images") s.NekoPrivilegedImages = viper.GetStringSlice("neko_privileged_images")
s.PathPrefix = path.Join("/", path.Clean(viper.GetString("path_prefix"))) s.PathPrefix = path.Join("/", path.Clean(viper.GetString("path_prefix")))
s.Labels = viper.GetStringSlice("labels") s.Labels = viper.GetStringSlice("labels")
s.WaitEnabled = viper.GetBool("wait_enabled")
s.StorageEnabled = viper.GetBool("storage.enabled") s.StorageEnabled = viper.GetBool("storage.enabled")
s.StorageInternal = viper.GetString("storage.internal") s.StorageInternal = viper.GetString("storage.internal")
+8 -4
View File
@@ -40,7 +40,7 @@ func roomWait(w http.ResponseWriter, r *http.Request) {
</script>`)) </script>`))
} }
func RoomNotFound(w http.ResponseWriter, r *http.Request) { func RoomNotFound(w http.ResponseWriter, r *http.Request, waitEnabled bool) {
utils.Swal2Response(w, ` utils.Swal2Response(w, `
<div class="swal2-header"> <div class="swal2-header">
<div class="swal2-icon swal2-error"> <div class="swal2-icon swal2-error">
@@ -57,10 +57,12 @@ func RoomNotFound(w http.ResponseWriter, r *http.Request) {
</div> </div>
`) `)
roomWait(w, r) if waitEnabled {
roomWait(w, r)
}
} }
func RoomNotRunning(w http.ResponseWriter, r *http.Request) { func RoomNotRunning(w http.ResponseWriter, r *http.Request, waitEnabled bool) {
utils.Swal2Response(w, ` utils.Swal2Response(w, `
<div class="swal2-header"> <div class="swal2-header">
<div class="swal2-icon swal2-warning"> <div class="swal2-icon swal2-warning">
@@ -77,7 +79,9 @@ func RoomNotRunning(w http.ResponseWriter, r *http.Request) {
</div> </div>
`) `)
roomWait(w, r) if waitEnabled {
roomWait(w, r)
}
} }
func RoomNotReady(w http.ResponseWriter, r *http.Request) { func RoomNotReady(w http.ResponseWriter, r *http.Request) {
+17 -13
View File
@@ -35,21 +35,23 @@ type ProxyManagerCtx struct {
ctx context.Context ctx context.Context
cancel func() cancel func()
waitMu sync.RWMutex waitMu sync.RWMutex
waitChans map[string]*wait waitChans map[string]*wait
waitEnabled bool
client *dockerClient.Client client *dockerClient.Client
instanceName string instanceName string
handlers *prefixHandler[*entry] handlers *prefixHandler[*entry]
} }
func New(client *dockerClient.Client, instanceName string) *ProxyManagerCtx { func New(client *dockerClient.Client, instanceName string, waitEnabled bool) *ProxyManagerCtx {
return &ProxyManagerCtx{ return &ProxyManagerCtx{
logger: log.With().Str("module", "proxy").Logger(), logger: log.With().Str("module", "proxy").Logger(),
waitChans: map[string]*wait{}, waitChans: map[string]*wait{},
client: client, client: client,
instanceName: instanceName, instanceName: instanceName,
waitEnabled: waitEnabled,
handlers: &prefixHandler[*entry]{}, handlers: &prefixHandler[*entry]{},
} }
} }
@@ -94,13 +96,15 @@ func (p *ProxyManagerCtx) Start() {
Msg("got docker event") Msg("got docker event")
// terminate waiting for any events // terminate waiting for any events
p.waitMu.Lock() if p.waitEnabled {
ch, ok := p.waitChans[path] p.waitMu.Lock()
if ok { ch, ok := p.waitChans[path]
close(ch.signal) if ok {
delete(p.waitChans, path) close(ch.signal)
delete(p.waitChans, path)
}
p.waitMu.Unlock()
} }
p.waitMu.Unlock()
p.mu.Lock() p.mu.Lock()
switch msg.Action { switch msg.Action {
@@ -286,12 +290,12 @@ func (p *ProxyManagerCtx) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// if room not found // if room not found
if !ok { if !ok {
// blocking until room is created // blocking until room is created
if r.URL.Query().Has("wait") { if r.URL.Query().Has("wait") && p.waitEnabled {
p.waitForPath(w, r, cleanPath) p.waitForPath(w, r, cleanPath)
return return
} }
RoomNotFound(w, r) RoomNotFound(w, r, p.waitEnabled)
return return
} }
@@ -305,12 +309,12 @@ func (p *ProxyManagerCtx) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// if room not running // if room not running
if !proxy.running { if !proxy.running {
// blocking until room is running // blocking until room is running
if r.URL.Query().Has("wait") { if r.URL.Query().Has("wait") && p.waitEnabled {
p.waitForPath(w, r, cleanPath) p.waitForPath(w, r, cleanPath)
return return
} }
RoomNotRunning(w, r) RoomNotRunning(w, r, p.waitEnabled)
return return
} }
+1
View File
@@ -145,6 +145,7 @@ func (main *MainCtx) Start() {
main.proxyManager = proxy.New( main.proxyManager = proxy.New(
client, client,
main.Configs.Room.InstanceName, main.Configs.Room.InstanceName,
main.Configs.Room.WaitEnabled,
) )
main.proxyManager.Start() main.proxyManager.Start()