mirror of
https://github.com/m1k1o/neko-rooms.git
synced 2026-11-02 22:51:34 -06:00
add multiple images on backend.
This commit is contained in:
+40
-7
@@ -3,11 +3,32 @@ info:
|
||||
title: Neko Rooms
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: 'http://192.168.1.20:8080'
|
||||
# Added by API Auto Mocking Plugin
|
||||
- description: SwaggerHub API Auto Mocking
|
||||
url: https://virtserver.swaggerhub.com/m1k1o/neko-rooms/1.0.0
|
||||
tags:
|
||||
- name: config
|
||||
description: config endpoints
|
||||
- name: rooms
|
||||
description: room endpoints
|
||||
paths:
|
||||
/api/config/rooms:
|
||||
get:
|
||||
tags:
|
||||
- config
|
||||
summary: Get rooms config
|
||||
operationId: roomsConfig
|
||||
responses:
|
||||
'200':
|
||||
description: OK
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/RoomsConfig'
|
||||
'500':
|
||||
description: Internal server error
|
||||
/api/rooms:
|
||||
get:
|
||||
tags:
|
||||
@@ -183,6 +204,18 @@ paths:
|
||||
|
||||
components:
|
||||
schemas:
|
||||
RoomsConfig:
|
||||
type: object
|
||||
properties:
|
||||
connections:
|
||||
type: number
|
||||
example: 100
|
||||
neko_images:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
example: m1k1o/neko:latest
|
||||
|
||||
RoomEntry:
|
||||
type: object
|
||||
properties:
|
||||
@@ -195,12 +228,12 @@ components:
|
||||
name:
|
||||
type: string
|
||||
example: foobar
|
||||
neko_image:
|
||||
type: string
|
||||
example: m1k1o/neko:latest
|
||||
max_connections:
|
||||
type: number
|
||||
example: 10
|
||||
image:
|
||||
type: string
|
||||
example: m1k1o/neko:latest
|
||||
running:
|
||||
type: boolean
|
||||
example: true
|
||||
@@ -218,6 +251,9 @@ components:
|
||||
name:
|
||||
type: string
|
||||
example: foobar
|
||||
neko_image:
|
||||
type: string
|
||||
example: m1k1o/neko:latest
|
||||
max_connections:
|
||||
type: number
|
||||
example: 10
|
||||
@@ -237,20 +273,17 @@ components:
|
||||
example: VP8
|
||||
video_bitrate:
|
||||
type: number
|
||||
format: int
|
||||
example: 3072
|
||||
video_pipeline:
|
||||
type: string
|
||||
video_max_fps:
|
||||
type: number
|
||||
format: int
|
||||
example: 25
|
||||
audio_codec:
|
||||
type: string
|
||||
example: OPUS
|
||||
audio_bitrate:
|
||||
type: number
|
||||
format: int
|
||||
example: 128
|
||||
audio_pipeline:
|
||||
type: string
|
||||
|
||||
@@ -24,6 +24,8 @@ func New(roomManager types.RoomManager, conf *config.API) *ApiManagerCtx {
|
||||
}
|
||||
|
||||
func (manager *ApiManagerCtx) Mount(r chi.Router) {
|
||||
r.Get("/config/rooms", manager.roomsConfig)
|
||||
|
||||
r.Get("/rooms", manager.roomsList)
|
||||
r.Post("/rooms", manager.roomCreate)
|
||||
|
||||
|
||||
@@ -9,6 +9,13 @@ import (
|
||||
"m1k1o/neko_rooms/internal/types"
|
||||
)
|
||||
|
||||
func (manager *ApiManagerCtx) roomsConfig(w http.ResponseWriter, r *http.Request) {
|
||||
response := manager.rooms.Config()
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(response)
|
||||
}
|
||||
|
||||
func (manager *ApiManagerCtx) roomsList(w http.ResponseWriter, r *http.Request) {
|
||||
response, err := manager.rooms.List()
|
||||
if err != nil {
|
||||
|
||||
@@ -15,7 +15,7 @@ type Room struct {
|
||||
EprMin uint16
|
||||
EprMax uint16
|
||||
|
||||
NekoImage string
|
||||
NekoImages []string
|
||||
InstanceName string
|
||||
|
||||
TraefikDomain string
|
||||
@@ -36,8 +36,8 @@ func (Room) Init(cmd *cobra.Command) error {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.PersistentFlags().String("neko_image", "m1k1o/neko:latest", "neko image to be used")
|
||||
if err := viper.BindPFlag("neko_image", cmd.PersistentFlags().Lookup("neko_image")); err != nil {
|
||||
cmd.PersistentFlags().StringSlice("neko_images", []string{"m1k1o/neko:latest", "m1k1o/neko:chromium"}, "neko images to be used")
|
||||
if err := viper.BindPFlag("neko_images", cmd.PersistentFlags().Lookup("neko_images")); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ func (s *Room) Set() {
|
||||
s.EprMax = max
|
||||
}
|
||||
|
||||
s.NekoImage = viper.GetString("neko_image")
|
||||
s.NekoImages = viper.GetStringSlice("neko_images")
|
||||
s.InstanceName = viper.GetString("instance_name")
|
||||
|
||||
s.TraefikDomain = viper.GetString("traefik_domain")
|
||||
|
||||
@@ -18,6 +18,11 @@ func (manager *RoomManagerCtx) containerToEntry(container dockerTypes.Container)
|
||||
return nil, fmt.Errorf("Damaged container labels: name not found.")
|
||||
}
|
||||
|
||||
nekoImage, ok := container.Labels["m1k1o.neko_rooms.neko_image"]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("Damaged container labels: neko_image not found.")
|
||||
}
|
||||
|
||||
URL, ok := container.Labels["m1k1o.neko_rooms.url"]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("Damaged container labels: url not found.")
|
||||
@@ -32,8 +37,8 @@ func (manager *RoomManagerCtx) containerToEntry(container dockerTypes.Container)
|
||||
ID: container.ID,
|
||||
URL: URL,
|
||||
Name: roomName,
|
||||
NekoImage: nekoImage,
|
||||
MaxConnections: epr.Max - epr.Min + 1,
|
||||
Image: container.Image,
|
||||
Running: container.State == "running",
|
||||
Status: container.Status,
|
||||
Created: time.Unix(container.Created, 0),
|
||||
|
||||
@@ -47,6 +47,13 @@ type RoomManagerCtx struct {
|
||||
client *dockerClient.Client
|
||||
}
|
||||
|
||||
func (manager *RoomManagerCtx) Config() types.RoomsConfig {
|
||||
return types.RoomsConfig{
|
||||
Connections: manager.config.EprMax - manager.config.EprMin + 1,
|
||||
NekoImages: manager.config.NekoImages,
|
||||
}
|
||||
}
|
||||
|
||||
func (manager *RoomManagerCtx) List() ([]types.RoomEntry, error) {
|
||||
containers, err := manager.listContainers()
|
||||
if err != nil {
|
||||
@@ -67,6 +74,10 @@ func (manager *RoomManagerCtx) List() ([]types.RoomEntry, error) {
|
||||
}
|
||||
|
||||
func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, error) {
|
||||
if in, _ := utils.ArrayIn(settings.NekoImage, manager.config.NekoImages); in {
|
||||
return "", fmt.Errorf("invalid neko image")
|
||||
}
|
||||
|
||||
// TODO: Check if path name exists.
|
||||
roomName := settings.Name
|
||||
if roomName == "" {
|
||||
@@ -114,11 +125,12 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
|
||||
|
||||
labels := map[string]string{
|
||||
// Set internal labels
|
||||
"m1k1o.neko_rooms.name": roomName,
|
||||
"m1k1o.neko_rooms.url": urlProto + "://" + manager.config.TraefikDomain + port + "/" + roomName + "/",
|
||||
"m1k1o.neko_rooms.instance": manager.config.InstanceName,
|
||||
"m1k1o.neko_rooms.epr.min": fmt.Sprintf("%d", epr.Min),
|
||||
"m1k1o.neko_rooms.epr.max": fmt.Sprintf("%d", epr.Max),
|
||||
"m1k1o.neko_rooms.name": roomName,
|
||||
"m1k1o.neko_rooms.url": urlProto + "://" + manager.config.TraefikDomain + port + "/" + roomName + "/",
|
||||
"m1k1o.neko_rooms.instance": manager.config.InstanceName,
|
||||
"m1k1o.neko_rooms.epr.min": fmt.Sprintf("%d", epr.Min),
|
||||
"m1k1o.neko_rooms.epr.max": fmt.Sprintf("%d", epr.Max),
|
||||
"m1k1o.neko_rooms.neko_image": settings.NekoImage,
|
||||
|
||||
// Set traefik labels
|
||||
"traefik.enable": "true",
|
||||
@@ -152,7 +164,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
|
||||
"NEKO_ICELITE=true",
|
||||
}, settings.ToEnv()...),
|
||||
// Name of the image as it was passed by the operator (e.g. could be symbolic)
|
||||
Image: manager.config.NekoImage,
|
||||
Image: settings.NekoImage,
|
||||
// List of labels set to this container
|
||||
Labels: labels,
|
||||
}
|
||||
@@ -249,6 +261,11 @@ func (manager *RoomManagerCtx) GetSettings(id string) (*types.RoomSettings, erro
|
||||
return nil, fmt.Errorf("Damaged container labels: name not found.")
|
||||
}
|
||||
|
||||
nekoImage, ok := container.Config.Labels["m1k1o.neko_rooms.neko_image"]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("Damaged container labels: neko_image not found.")
|
||||
}
|
||||
|
||||
epr, err := manager.getEprFromLabels(container.Config.Labels)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -256,6 +273,7 @@ func (manager *RoomManagerCtx) GetSettings(id string) (*types.RoomSettings, erro
|
||||
|
||||
settings := types.RoomSettings{
|
||||
Name: roomName,
|
||||
NekoImage: nekoImage,
|
||||
MaxConnections: epr.Max - epr.Min + 1,
|
||||
}
|
||||
|
||||
|
||||
@@ -7,12 +7,17 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type RoomsConfig struct {
|
||||
Connections uint16 `json:"connections"`
|
||||
NekoImages []string `json:"neko_images"`
|
||||
}
|
||||
|
||||
type RoomEntry struct {
|
||||
ID string `json:"id"`
|
||||
URL string `json:"url"`
|
||||
Name string `json:"name"`
|
||||
NekoImage string `json:"neko_image"`
|
||||
MaxConnections uint16 `json:"max_connections"`
|
||||
Image string `json:"image"`
|
||||
Running bool `json:"running"`
|
||||
Status string `json:"status"`
|
||||
Created time.Time `json:"created"`
|
||||
@@ -20,6 +25,7 @@ type RoomEntry struct {
|
||||
|
||||
type RoomSettings struct {
|
||||
Name string `json:"name"`
|
||||
NekoImage string `json:"neko_image"`
|
||||
MaxConnections uint16 `json:"max_connections"`
|
||||
|
||||
UserPass string `json:"user_pass"`
|
||||
@@ -155,6 +161,7 @@ type RoomMember struct {
|
||||
}
|
||||
|
||||
type RoomManager interface {
|
||||
Config() RoomsConfig
|
||||
List() ([]RoomEntry, error)
|
||||
|
||||
Create(settings RoomSettings) (string, error)
|
||||
|
||||
Reference in New Issue
Block a user