add multiple images on backend.

This commit is contained in:
m1k1o
2021-03-23 22:34:08 +01:00
parent 8074c669ef
commit 267c3b7f35
7 changed files with 91 additions and 19 deletions
+40 -7
View File
@@ -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
+2
View File
@@ -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)
+7
View File
@@ -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 {
+4 -4
View File
@@ -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")
+6 -1
View File
@@ -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),
+24 -6
View File
@@ -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,
}
+8 -1
View File
@@ -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)