From 267c3b7f354bb1cb1de6d57e8cb799cec14d1e89 Mon Sep 17 00:00:00 2001 From: m1k1o Date: Tue, 23 Mar 2021 22:34:08 +0100 Subject: [PATCH] add multiple images on backend. --- OpenApi.yml | 47 +++++++++++++++++++++++++++++++------ internal/api/manager.go | 2 ++ internal/api/rooms.go | 7 ++++++ internal/config/room.go | 8 +++---- internal/room/containers.go | 7 +++++- internal/room/manager.go | 30 ++++++++++++++++++----- internal/types/room.go | 9 ++++++- 7 files changed, 91 insertions(+), 19 deletions(-) diff --git a/OpenApi.yml b/OpenApi.yml index e1b88d9..f7150d4 100644 --- a/OpenApi.yml +++ b/OpenApi.yml @@ -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 diff --git a/internal/api/manager.go b/internal/api/manager.go index c6c81d5..19ae943 100644 --- a/internal/api/manager.go +++ b/internal/api/manager.go @@ -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) diff --git a/internal/api/rooms.go b/internal/api/rooms.go index 7640c74..ba8a547 100644 --- a/internal/api/rooms.go +++ b/internal/api/rooms.go @@ -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 { diff --git a/internal/config/room.go b/internal/config/room.go index f97ff9b..8fa744d 100644 --- a/internal/config/room.go +++ b/internal/config/room.go @@ -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") diff --git a/internal/room/containers.go b/internal/room/containers.go index ef862b6..47d53d9 100644 --- a/internal/room/containers.go +++ b/internal/room/containers.go @@ -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), diff --git a/internal/room/manager.go b/internal/room/manager.go index 725e4cf..fe8fd54 100644 --- a/internal/room/manager.go +++ b/internal/room/manager.go @@ -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, } diff --git a/internal/types/room.go b/internal/types/room.go index 4cf5003..004d7ce 100644 --- a/internal/types/room.go +++ b/internal/types/room.go @@ -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)